Skip to content

Publish a file

Eidos Publish turns a local .eidos, .md, or .markdown file into a stable hosted URL. Content changes create and activate an immutable Version for one resource slug. An unchanged Source Bundle reuses the active Version. Eidos Files use the read-only Eidos Runtime. The service renders Markdown once into a script-free static page. Your local file remains the source of truth and the CLI can exit after publishing.

--slug accepts directory paths such as rides/2026/today.gpx, including Unicode names and spaces. For an ordinary file copied to a temporary snapshot, use --source-path "Tracks/2026/ride.gpx" to retain its original Space-relative path in the plugin binding. The source path and public slug are independent. The command publishes only the selected file, not other files in its directory.

Publish also supports ordinary files. Their stable URL downloads the original bytes. To show a file as an interactive page, publish it with a read-only file View from a local plugin package:

Terminal window
eidos publish ride.gpx --slug ride-download
eidos publish ride.gpx --slug ride-map \
--plugin ./local.eidos-gpx-viewer.eidos-plugin --plugin-view map

Use your account Publish CLI key. These features require Pro. Each slug has its own access settings and active Version. The same source file can have a download link and a View link.

The publication snapshot includes the plugin package privately. It does not appear in the plugin registry. The server delivers browser code to visitors as part of the page, so never include secrets in a plugin. Changing the package or selected View creates a new Version when you republish.

Published Views support plugin API 3.0.0, kind: "file", access: "read", and no declared View capabilities. The file and compressed package each have a 16 MiB limit. The unpacked package also has a 16 MiB limit. Views can read only the published file. Local workspace, settings, storage, connections, companion files, and write operations are unavailable. The host supports declared browser network origins and browser workers. Raw downloads support files up to 1 GiB, subject to account limits.

  1. Sign in to the Publish account page.
  2. Create a Publish CLI key and copy it when the page shows it. The service keeps only its hash, so the CLI cannot show the same key again.
  3. Store the key as EIDOS_PUBLISH_TOKEN in your current shell or secret manager. Do not pass it in a shared script or commit it to a repository.
  4. Check that your CLI build includes the Publish command:
Terminal window
eidos cloud publish --help
# or the legacy alias:
eidos publish --help

Choose a slug for this resource and publish the file:

Terminal window
eidos publish tracker.eidos --slug tracker

The slug becomes the URL path. It contains 1–64 lowercase letters, digits, or hyphens, and must start and end with a letter or digit. For example, the command above can produce a URL such as:

https://u-….eidos.ink/tracker

Publish can replace the opaque host with an independent Publish handle. Open the Publish account page, enter a compatible handle under Publish domain, and select Claim domain. The service claims handle.eidos.ink immediately. The assigned u-* hostname remains a stable fallback. The handle does not change your account username. Handles contain 3–30 lowercase letters, digits, or hyphens, start with a letter, and cannot use reserved Publish or Relay namespaces.

With Publish Pro, you can also connect one custom domain in Account → Publish → Overview → Your own domain. The domain serves all your publications at their existing paths, with automatic HTTPS. After activation, new publishing results prefer the custom domain; existing eidos.ink links remain usable. You do not need to republish existing content or change the CLI API origin or key.

The terminal output shows progress while the CLI checks the file, finds local attachments, hashes and deduplicates source objects, uploads pending bytes, prepares the serving target, and activates the Version. The command returns only after the Version is ready and active, or exits non-zero with an error. The CLI fingerprints the complete canonical Source Bundle, including attachment digests. Repeating the command with identical content checks the active fingerprint and does not create redundant Version history.

To link directly to a table or view in the published file, append its stable Eidos UUIDv7 IDs:

https://u-….eidos.ink/tracker?table={table-id}&view={view-id}

You can use the view parameter by itself. Unknown IDs fall back to the default table and view.

An Eidos File can contain a Form View that writes new rows into one of its Tables. Publish that view as a hosted form by its stable View ID or name:

Terminal window
eidos publish feedback.eidos --slug feedback --form-view "Public feedback"

The command publishes a new immutable Form revision. Visitors see only the fields selected by that Form View. Internal File, Table, View, and Field IDs are not exposed in the browser definition. Public, password, and account-private access use the same options as other Publish resources.

You configure form response access separately from resource access. Require an eidos.space account with --form-respondents signed-in. Add --one-response-per-user when each signed-in account may submit only once:

Terminal window
eidos publish feedback.eidos --slug feedback \
--form-view "Public feedback" \
--form-respondents signed-in \
--one-response-per-user

Anonymous forms always allow multiple responses because Publish cannot reliably identify a person without an account. Changing these controls does not create a new content Version when the Form definition remains unchanged.

Completed responses wait in a private Publish Inbox. They do not change the hosted snapshot or a cloud copy of your dataset. Pull them into the original local file with the Publication ID returned by the publish command:

Terminal window
eidos collect feedback.eidos \
--publication 7300a083-df92-49d8-945d-1e0bae0eac18

The Eidos Runtime imports each response. One SQLite transaction commits the new Row and a local import receipt. Then the client acknowledges the cloud response. Retrying after a crash or lost acknowledgement does not create a duplicate Row.

Forms support File fields. The collector downloads submitted attachments, checks size and SHA-256, and stores files beneath the source directory in .eidos-assets/publish/sha256/. Identical attachment bytes reuse one local content-addressed file.

The published Form does not change automatically when the local schema changes. Republish explicitly to activate a new revision. The current preview collector stops with a schema error if the Table or Form View changes after that revision. This prevents silent field loss or unsafe conversion.

Publish Markdown with the same command and slug model:

Terminal window
eidos publish docs/guide.md --slug guide

Markdown uses CommonMark with GitHub-style tables, strikethrough, task lists, and autolinks. The document must be UTF-8 and at most 16 MiB. The browser shows raw HTML as text rather than executing it. The page allows no JavaScript. The published page receives a restrictive Content Security Policy.

Relative link and image destinations become attachments:

![Architecture](assets/architecture.png)
[Download the workbook](files/example.xlsx)

The CLI resolves paths from the Markdown directory, uploads them with the Version, and rewrites them to immutable Version-bound URLs. Destinations with https:, mailto:, inline image data:, and #fragment do not upload. The renderer deletes unsafe link protocols. The CLI rejects absolute paths, other URL schemes, query-bearing local paths, escaping paths, and symlinks before activation.

For Eidos Files, relative File-field entries are attachments. For Markdown, relative link and image destinations are attachments. The CLI resolves them from the source file directory, checks that each path is an ordinary file without symlinks, and uploads it with the source snapshot. The CLI also checks the exact declared byte count for Eidos File entries.

The service uploads and stores identical SHA-256 objects once per account, even when several File entries, paths, slugs, or Versions reference those bytes. Published attachments use the same public, password, or private authorization as their resource. Missing files, changed sizes, escaping paths, symlinks, and attachments larger than 1 GiB fail the publish before activation. Standard Publish accepts an .eidos entrypoint up to 256 MiB. The CLI checks the account-specific limit before hashing. Custom accounts can receive a higher limit.

Access belongs to each resource slug, not to the whole account.

Access Publish option Who can open it
Public No access option Anyone with the URL
Password protected --password Anyone with the password. No Eidos account required.
Account private --visibility private The publisher while signed in to the owning eidos.space account

Publishing the same slug again without an access option preserves its current access mode.

Terminal window
eidos publish tracker.eidos --slug tracker --password

The CLI asks for the password twice without echo. A password must contain 8–128 Unicode characters, use at most 256 UTF-8 bytes, and contain no control characters. The CLI never adds it to the URL or command arguments.

For automation, put the password in a CI or shell secret named EIDOS_PUBLISH_PASSWORD, then pass --password:

Terminal window
# EIDOS_PUBLISH_PASSWORD is supplied by the secret manager.
eidos publish tracker.eidos --slug tracker --password

Running the command again with a new password rotates it. Existing browser sessions stop working immediately. A correct password creates a host-only, HttpOnly browser session for up to 12 hours. Repeated failures are temporarily rate-limited.

Delete password protection and make the resource public explicitly:

Terminal window
eidos publish tracker.eidos --slug tracker --remove-password
Terminal window
eidos publish tracker.eidos --slug tracker --visibility private

Account-private access is currently owner-only. Opening the URL redirects to eidos.space sign-in and returns to the resource after the owning account is verified. Use password protection instead when sharing with people who do not have the publisher account.

Published Eidos Files, Markdown documents, and Forms show the Built with Eidos badge by default. Publish can hide it for one resource without creating a new content Version:

Terminal window
eidos publish tracker.eidos --slug tracker --hide-branding

Restore the badge with --show-branding. Omitting both options preserves the resource current setting. The same control is available beside each resource on the Publish account page and in the Eidos Lite Publish panel.

A slug identifies one long-lived resource. Publishing another file with a new slug creates another resource under the same canonical hostname:

Terminal window
eidos publish roadmap.eidos --slug roadmap
eidos publish inventory.eidos --slug inventory

Publishing new bytes to an existing slug creates a new immutable Version while keeping its URL stable. Publishing the same bytes and attachment references is a no-op for Version history. Resource count is not a commercial quota. Storage and the history policy form the quota. Current standard Publish limits are:

Limit Publish
Deduplicated account storage 10 GiB
One .eidos entrypoint 256 MiB
One source attachment 1 GiB
Markdown document 16 MiB
Inactive Version history 30 days
Resources No quota
Access modes Public, password, account-private
Publish handle One handle.eidos.ink hostname
Custom domain One per account, automatic HTTPS
Delete Built with Eidos badge Yes
Form responses per month 5,000
Collect Inbox 5 GiB
Attachments per response 20
One submitted attachment 100 MiB
Imported response retention 30 days

Contact Eidos for a Custom plan when an .eidos file needs a higher limit or dedicated Runtime capacity. These limits apply to paid Publish. Local build and preview remain free. Paid history retention starts when a new Version replaces the active Version. Inactive Versions remain for 30 days. The service deletes failed or never-activated Versions after 24 hours. History retention never deletes the currently active Version. Expired history releases only content with no remaining Version references. The service retains Form definition snapshots needed to interpret collected responses separately from the full published source.

The account page is authoritative for the current plan and usage. Custom domains require an active Pro plan and the DNS records shown in your account.

Publish Free accepts Markdown up to 2 MiB, at most 20 attachments of 25 MiB each, and a Source Bundle up to 50 MiB. All retained source and generated artifacts share the 100 MiB account quota. Free allows 20 new version uploads per UTC day. Republishing the same slug does not use another slot. Use Unpublish on the account Resources page to release a slot. Retained versions continue to count toward storage until cleanup. Free retains the previous version for 24 hours. Public links remain accessible to anyone who knows the URL despite noindex.

Use normal output when publishing interactively so progress remains visible. Use global --json when a script needs one stable result document:

Terminal window
eidos --json publish tracker.eidos --slug tracker

JSON mode writes one result to stdout and errors to stderr. It does not render the interactive progress bar. publishFingerprint identifies the complete Source Bundle, while versionCreated tells automation whether this run created a Version or reused the active one.

  • Use Publish for a stable, hosted, read-only snapshot. The local CLI does not need to remain online.
  • Use eidos serve --relay for a live editor backed by the file on your computer. The Serve process must keep running.

Publish subscription required

Local preview does not create a hosted URL. Activate Publish from the account or pricing page, then retry with the same file and slug.

Storage limit reached

Delete unneeded inactive Versions or reduce database and attachment bytes. Reusing identical content does not consume storage twice. Standard .eidos files are limited to 256 MiB, while source attachments retain the 1 GiB object limit.

Cannot publish an attachment

Check that it uses a contained relative URI, exists next to the source at that path, and has no symlink path component. For Eidos Files, also check that the actual size still matches the File entry.

Browser asks for password again

Someone may have changed the password, access may have changed, or the 12-hour session may have expired. Enter the current password again.

Command eidos publish not recognized

Update to a CLI build that includes Publish, or build the current repository version.