Sharing
Ink has three levels of sharing: internal (workspace members), external (signed share links), and public (published to a custom domain). Each level has its own access controls and use cases.
Internal sharing
Share a page or space with workspace members.
Page menu → Share → Invite members.
- Pick users by name or email.
- Pick their role: Viewer, Commenter, Editor.
- Roles at the page level override space defaults.
For full workspace access, set the page to Workspace-wide visibility instead of inviting individuals.
External share links
Sometimes you need to share a page with someone outside the workspace — a client, a contractor, a vendor. External share links let you do that without creating an account.
Page menu → Share → Create share link.
Options per link:
- Access level — view only, comment, or edit.
- Expiration — never, 7 days, 30 days, 1 year, or custom.
- Password — optional additional gate.
- Require email — recipient enters their email to unlock (for audit trails).
- Downloadable — allow or disallow markdown/PDF export.
Each link is HMAC-signed with INK_SHARE_SIGNING_SECRET. Copy
the link and send it however you like (email, Slack, carrier
pigeon).
Revoking links
Every share link is listed under Settings → Share links with its page, access level, and creation date. Revoke any time.
Audit log
Every visit to a share link is logged to share_link_visits with
timestamp, user agent, and email (if required). Admins can see
the full log from Admin → Audit.
Public publishing
For pages that should be public (docs sites, landing pages, changelogs, handbooks), publish to a custom subdomain.
Setup (one-time)
See Installation for the full flow:
- Add a custom subdomain to your Vercel deployment.
- Set
VITE_INK_PUBLIC_DOMAINenv var. - Confirm the domain in Settings → Publishing.
Publishing a page
Page menu → Publish → Make public.
- Pick a slug (auto-generated from title, editable).
- Optional SEO metadata: title, description, Open Graph image.
- Optional password gate.
Saving triggers ink-publish-renderer to write static HTML.
The published URL is live within a few seconds.
Unpublish from the same menu; the page returns to its previous visibility.
Publishing a whole space
Space menu → Publish → Publish space. Every page in the
space becomes accessible under the custom domain at
/space-slug/page-slug. The space's index page is the landing
page at /space-slug.
Per-page publish flags still apply — pages tagged draft or
explicitly unpublished stay private.
SEO
The publish renderer emits:
<title>and<meta name="description">- Open Graph + Twitter Card tags
- JSON-LD Article schema
sitemap.xmlper spacerobots.txt(configurable per space)
Customize the publish template under Settings → Publishing → Templates.
Embedding
Embed any page (or a single block) in another website via an iframe:
<iframe
src="https://your-ink-domain/embed/{page_id}?block={block_id}"
width="100%"
height="500"
></iframe>Embedded content respects the same access controls — if the page is private, the iframe shows a "log in" prompt. For anonymous embeds, publish the page first or use a share link.
Security notes
- Share links use HMAC — no key on the client, so clients can't forge links.
- Revoking a link invalidates it immediately (link table lookup happens on every request).
- Public-published pages are static HTML — the Supabase database is not hit at all on reads, so scraping or traffic spikes can't exhaust your project quota.
- Password-gated share links store only a bcrypt hash of the password.
Limits
- Share links per page: 20.
- Published pages per workspace: unlimited.
- Custom domains per workspace: 5 (contact support to raise).
Example workflows
Customer proposal. Create a page per prospect. Share as an external link with 14-day expiration and email requirement.
Public handbook. Create a "Handbook" space, publish it to
handbook.acme.com. Internal team edits in Ink; the world reads
the static site.
Contractor collaboration. Invite contractor as a Commenter on specific project pages; revoke when the contract ends.