Installation

Pulse installs the same way every ARK product does. This page covers the Pulse-specific setup. For the generic Supabase + Vercel steps, see Installation.

Pulse's database schema

After the platform schema:

supabase db push --file supabase/schema.sql

Creates teams, checkins, questions, responses, surveys, and related tables. See Database Reference.

Environment variables

Standard ARK variables (see Environment Variables) plus:

VITE_PULSE_DEFAULT_TZ

What it is: fallback timezone when a user hasn't set their own.

Example: America/Los_Angeles, Europe/London, Asia/Tokyo.

Required? No. Defaults to UTC.

VITE_RESEND_API_KEY

What it is: Resend API key for email-channel delivery and digest emails.

Required? Only if you want email delivery.

VITE_SLACK_APP_ID / VITE_SLACK_CLIENT_ID

What they are: public identifiers for your Pulse Slack app.

Required? Only for Slack integration.

PULSE_SLACK_CLIENT_SECRET / PULSE_SLACK_SIGNING_SECRET

What they are: server-only secrets from the Slack app configuration. Never expose to the browser.

Required? Yes, if Slack is enabled. Signing secret is used to verify every inbound Slack event.

PULSE_COMMS_API_URL / PULSE_COMMS_API_KEY

What they are: URL and API key for your Comms deployment, used for the Comms delivery channel.

Required? Only if you want delivery through Comms.

PULSE_SCHEDULER_SECRET

What it is: shared secret the cron job uses to authenticate with the scheduler Edge Function.

Generate: openssl rand -hex 32.

Required? Yes. Without it, the scheduler Edge Function rejects the cron.

Edge Functions

Pulse ships with:

FunctionPurpose
pulse-schedulerDecides what to send, to whom, right now. Runs every minute.
pulse-slack-eventsReceives Slack event webhooks (messages, interactions).
pulse-digest-builderCompiles and delivers digests on their schedule.
pulse-reminder-workerDispatches individual reminders.

Deploy:

supabase functions deploy pulse-scheduler
supabase functions deploy pulse-slack-events
supabase functions deploy pulse-digest-builder
supabase functions deploy pulse-reminder-worker

Schedule the scheduler (every minute so timezone precision holds):

select cron.schedule(
  'pulse-scheduler',
  '* * * * *',
  $$select net.http_post(
    url := 'https://<project-ref>.functions.supabase.co/pulse-scheduler',
    headers := jsonb_build_object('Authorization', 'Bearer ' || current_setting('app.settings.pulse_scheduler_secret'))
  );$$
);

Slack app setup

Required only if you want Slack delivery.

  1. Visit api.slack.com/apps and click Create new app → From manifest.
  2. Paste the manifest from docs/slack-manifest.yaml in your Pulse repo.
  3. Install the app to your workspace.
  4. Copy Client ID, Client Secret, and Signing Secret into the matching env vars.
  5. In Slack app settings, set the Request URL for Events and Interactivity to:
https://<your-pulse-domain>/api/slack/events
  1. Visit Settings → Integrations → Slack in Pulse and connect your workspace.

Full walkthrough with screenshots: Slack Integration.

Comms integration (optional)

If Comms runs in the same Supabase project, Settings → Integrations → Comms shows a one-click connection. Pulse picks up the connection via the shared workspace table and starts delivering through Comms channels.

Verify your install

  1. Sign up as the first user; you become workspace admin.
  2. Create a team under Teams → New team and add at least yourself.
  3. Set up a daily standup from Standups → New check-in.
  4. Set the schedule to fire in a couple of minutes from now.
  5. Wait. When it fires, the question should arrive via your chosen channel (Slack, Comms, email, or web).
  6. Answer. The digest should appear in the team's digest location.

If nothing arrives, check pulse-scheduler logs in the Supabase dashboard.