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.sql

Creates 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.

  1. Create a bucket called ink-uploads (or match VITE_INK_STORAGE_BUCKET). Mark it Private.
  2. Apply the policies from supabase/storage_policies.sql — they scope objects to workspace members.

Edge Functions

Ink ships with:

FunctionPurpose
ink-realtime-routerLightweight pub/sub for live cursors and presence.
ink-publish-rendererRenders published pages into static HTML on change.
ink-share-linkGenerates and validates external share links.
ink-version-prunerNightly 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-pruner

Schedule 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):

  1. In Vercel, add the domain to your Ink project.
  2. Point the DNS record at Vercel.
  3. Set VITE_INK_PUBLIC_DOMAIN to docs.acme.com.
  4. 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-import

Then set up under Settings → Import → Notion.

Verify your install

  1. Sign up as the first user; you become workspace admin.
  2. Create a space from Spaces → New space.
  3. Add a page; type / to try slash commands.
  4. Open the same page in two browser tabs. Edit in one; confirm the other updates within a second.
  5. Share a page with a teammate; confirm they can see it.