Lific

Limits

Every fixed limit in Lific that a person, script or agent can run into, what it applies to, and what happens when it is exceeded.

Lific bounds anything a caller controls: request sizes, page sizes, how fast one address can try passwords, how much an archive may expand to. The numbers are built into the binary and cannot be changed in lific.toml. This page lists them so that a refusal is never a surprise.

Some limits refuse the request with an error that names the limit. Others quietly clamp the value you asked for, which is noted where it happens. A 429 or 503 from Lific carries a Retry-After header unless the table says otherwise.

Request size

LimitValueApplies toWhen exceeded
Request body2 MiBEvery REST request, unless listed below413
Attachment upload request64 MiBPOST /api/attachments (the file itself is limited to 10 MiB, see Attachments)413
Project archive upload request129 MiBPOST /api/project-archives413
GitHub import request16 KiBPOST /api/projects/{id}/import/github413
OAuth request body64 KiB/oauth/* routes413

The 2 MiB ceiling also decides the largest issue description or page you can save over REST, since the text travels in the request body.

Content

LimitValueApplies toWhen exceeded
Comment body256 KiBCreating a comment, everywhere400 (MCP: Error: text). A comment already larger than this from before the limit existed can be edited, but not made longer.
Mentions in one comment256 distinct @usernamesCommentsRefused with 400. Lific does not notify the first 256 and drop the rest.
Attachment references in one body256 distinct attachmentsIssue descriptions, pages and commentsRefused with 400, because linking only some of them would unlink attachments the text still uses.
Project identifier1 to 5 characters: uppercase letters or digits, starting with a letter. DOC is reserved.Creating a project400
Password8 to 1,024 bytesSignup, lific user create, password changes400
Instance name60 charactersInstance settings400
Login message280 charactersInstance settings400
Session lifetime1 to 365 days (default 30)Instance settings400
Attachment alt text1,000 charactersEditing an attachment400
Saved view configuration8 KiBSaved views400

Pages of results

These never cause an error. A larger value is lowered to the cap, and a zero or negative limit becomes 1. When more results exist, the response says so and gives the offset for the next page.

WhereDefaultCap
REST issue, plan and page lists50 (page lists return everything when you pass neither limit nor offset)500
REST and CLI comment lists50500
REST and MCP activity feeds50 over REST, 30 for get_activity200
Search (REST, MCP and lific search)20500
Search offsetnone100,000
MCP list_issues50500
MCP list_resources100 for issues and pages, 50 for plans500
MCP list_comments50500
MCP get_issue commentsthe 3 most recent (include_comments=recent)500 most recent (all)
MCP get_attachment text200 lines500 lines
lific issue list50500
Project insights weeks1252

A page of comments is also limited to about 2 MiB of response, counted after JSON encoding. A thread of long comments therefore returns fewer rows than you asked for, with a pointer to the next page. A short page does not mean the thread has ended.

Two MCP tools work on a fixed batch rather than pages. get_board shows at most 500 issues and says when older ones are left out. bulk_update changes at most 500 matching issues in one call.

LimitValueWhen exceeded
Query length, normal mode4 KiB400
Query length, literal mode256 bytes400
Records matched in literal mode10,000400, asking you to narrow the query
Attachment text indexed for searchText files up to 512 KiBLarger files are found by filename only

Attachments

LimitValueApplies toWhen exceeded
File size10 MiBUploads over REST, the web UI and the MCP upload_attachment tool400 (MCP: Error: text)
Upload rate30 uploads per 10 minutes per userREST uploads, including the web UI403
Thumbnail source50 megapixelsThumbnail generationThe upload succeeds without a thumbnail
ZIP previewFirst 200 entriesAttachment previewsThe listing is marked truncated

Uploads are also checked against an allowlist of file types, read from the file's contents rather than its name. The MCP tool reference lists the types.

Sign-in and rate limits

Rate limits count requests per client address, and some also per account. Behind a reverse proxy, set trusted_proxies so Lific sees each visitor's address instead of the proxy's.

LimitValueCounted perWhen exceeded
Failed sign-ins5 per 15 minutesClient address, and separately per username or email400 with the number of seconds to wait. Successful sign-ins do not count.
Re-entering your password before a sensitive action5 per 15 minutesClient address, and separately per account400 with the wait. Successful confirmations do not count.
Password changes5 per 15 minutesClient address, and separately per account400 with the wait. Successful changes do not count.
Signups5 per 15 minutesClient address, and separately per email400 with the wait. Every attempt counts.
OAuth client registrations10 per hourClient address429
OAuth device authorizations (lific login)10 per hourClient address429
Repository binding changes30 per hourUser400 with the wait
Public project reads240 per minuteClient address429

A request from a trusted proxy that carries an invalid X-Lific-Client-IP and X-Lific-Proxy-Secret pair gets 503 on these routes. See Configuration.

Concurrency

These limit how many expensive operations run at once on the whole instance. A request over the limit is refused immediately rather than queued.

LimitValueWhen exceeded
Markdown exports in progress over REST and MCP2429 (MCP: Error: text)
Browser project archive exports and imports in progress1429
GitHub imports from the web UI1 per project, 4 per instance409
Public project requests in progress4503
Public attachment downloads in progress4503
Public thumbnail and preview generation1 at a time, from files up to 32 MiB503 when busy. A larger file gets 404 for a thumbnail that has not been made yet, and for a preview.
Realtime connections16 per user, 1,024 per instance429, without Retry-After

A realtime connection is also closed if its client sends messages over 16 KiB, or more than 64 messages in 10 seconds. The web UI never does either.

Exports

These apply to Markdown exports from the web UI, REST, the MCP export tool and lific export. Each is checked before or while the export is built, and an export that would exceed one is refused with 400 rather than written partially.

LimitValue
Files in one export10,000
Comments on one issue1,000
Comments in one project export100,000
One exported file8 MiB
Whole export, uncompressed128 MiB
Metadata entries in one export50,000
Download stallsThe download ends after 30 seconds without progress, or after 30 minutes in total

When lific export project runs with --backend http, it unpacks the server's ZIP with its own limits: 10,000 entries and 512 MiB once expanded.

Exporting several issues at once from the web UI stops at 16 MiB and shows an error instead of saving a partial file.

Project archives

A project archive made or read by the CLI works with the local database, so it gets larger limits than one uploaded or downloaded through the browser. An archive over a limit is refused with 413 in the browser and an error naming the limit in the CLI.

LimitCLIBrowser
Archive file (compressed)2 GiB128 MiB
Archive contents once expanded2 GiB plus 80 MiB256 MiB
Project data (the manifest)64 MiB16 MiB
One attachment256 MiB64 MiB
All attachments together2 GiB192 MiB
Distinct attachments10,0002,000
Rows across all tables200,00050,000

A browser upload must finish within 120 seconds and may not stall for more than 20.

Restoring backups

lific restore checks an archive's expanded size before it writes anything, so an archive from someone else cannot fill the disk. An archive over a limit is refused. --allow-large raises the limits for an archive you made yourself; every other check still runs.

LimitDefaultWith --allow-large
Database file512 MiB16 TiB
One attachment64 MiB16 TiB
Everything together1 GiB16 TiB
Entries in the archive10,00010 million
Manifest1 MiB64 MiB

lific dump and the automatic backups have no size limit.

Imports and git hooks

LimitValueWhen exceeded
GitHub issues in one import10,000413 from the web UI, an error from the CLI
Comments on one GitHub issue1,000413 / error
One response from GitHub8 MiB413 / error
Imported text in total128 MiB413 / error
Commit messages in one git-hook request500400
Issue references in one git-hook request500400

Without a token, GitHub itself allows 60 requests an hour, which a large repository can use up.

OAuth

LimitValueWhen exceeded
Access token lifetime30 daysThe client must sign in again. Lific issues no refresh tokens.
Device code lifetime (lific login)15 minutesThe code expires and the login has to start over
Device code pollingEvery 5 seconds at mostPolling faster is answered with slow_down
Client name128 bytes, no control characters400
Redirect URIs per client8, each up to 2,048 bytes400
Registered clients1,024 per instance, 4 MiB in total429 until old ones are removed
Pending device codes1,024 per instance429

A registered client that has never been used is removed after 7 days, which frees room for new registrations.

Multiple instances

lific mcp --instances has its own limits on its configuration file, the number of instances, response sizes and timeouts. Multiple instances lists them.

The CLI's HTTP backend gives up on a request after 30 seconds.

On this page