Installation
Ink installs the same way every ARK product does. This page covers the Ink-specific setup. For the generic Supabase + Vercel steps, see Installation.
Ink's database schema
After the platform schema:
supabase db push --file supabase/schema.sqlCreates spaces, pages, blocks, tags, comments,
versions, and related tables. See
Database Reference.
Environment variables
Standard ARK variables (see Environment Variables) plus:
VITE_INK_REALTIME_URL
What it is: the Supabase Realtime endpoint URL. Defaults to
deriving from VITE_SUPABASE_URL — set explicitly only if you
route realtime through a custom domain.
Required? No.
VITE_INK_STORAGE_BUCKET
What it is: the Supabase Storage bucket for images and file uploads.
Default: ink-uploads.
Required? No. If unset, defaults to ink-uploads.
VITE_RESEND_API_KEY
What it is: Resend API key for mention/invite/share notification emails.
Required? No. Without it, only in-app notifications fire.
INK_SHARE_SIGNING_SECRET
What it is: HMAC secret used to sign external share links. Required so only Ink can generate valid links.
Generate: openssl rand -hex 32.
Required? Yes, if you plan to use external share links.
VITE_INK_PUBLIC_DOMAIN
What it is: the domain used for public-published pages
(e.g., docs.acme.com).
Required? Only if you use the publish-to-public-site feature.
VITE_OPENAI_API_KEY
What it is: enables optional AI features — "rewrite this paragraph", "summarize this page", smart tagging.
Required? No. AI features hide gracefully without it.
Storage setup
Ink uses Supabase Storage for images and file uploads.
- Create a bucket called
ink-uploads(or matchVITE_INK_STORAGE_BUCKET). Mark it Private. - Apply the policies from
supabase/storage_policies.sql— they scope objects to workspace members.
Edge Functions
Ink ships with:
| Function | Purpose |
|---|---|
ink-realtime-router | Lightweight pub/sub for live cursors and presence. |
ink-publish-renderer | Renders published pages into static HTML on change. |
ink-share-link | Generates and validates external share links. |
ink-version-pruner | Nightly cron that prunes page-version history beyond the retention window. |
Deploy:
supabase functions deploy ink-realtime-router
supabase functions deploy ink-publish-renderer
supabase functions deploy ink-share-link
supabase functions deploy ink-version-prunerSchedule the pruner (daily, 2 AM):
select cron.schedule(
'ink-version-pruner',
'0 2 * * *',
$$select net.http_post(
url := 'https://<project-ref>.functions.supabase.co/ink-version-pruner',
headers := jsonb_build_object('Authorization', 'Bearer ' || current_setting('app.settings.service_role_key'))
);$$
);Custom domain for publishing (optional)
To publish pages to a custom domain (e.g., docs.acme.com):
- In Vercel, add the domain to your Ink project.
- Point the DNS record at Vercel.
- Set
VITE_INK_PUBLIC_DOMAINtodocs.acme.com. - In Ink: Settings → Publishing → Custom domain and confirm.
Published pages are rendered to static HTML by
ink-publish-renderer on every save — fast reads, no runtime
database cost.
Notion import (optional)
The Notion importer is a separate Edge Function that's not deployed by default (paid add-on). If you own it:
supabase functions deploy ink-notion-importThen set up under Settings → Import → Notion.
Verify your install
- Sign up as the first user; you become workspace admin.
- Create a space from Spaces → New space.
- Add a page; type
/to try slash commands. - Open the same page in two browser tabs. Edit in one; confirm the other updates within a second.
- Share a page with a teammate; confirm they can see it.