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.sqlCreates 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:
| Function | Purpose |
|---|---|
pulse-scheduler | Decides what to send, to whom, right now. Runs every minute. |
pulse-slack-events | Receives Slack event webhooks (messages, interactions). |
pulse-digest-builder | Compiles and delivers digests on their schedule. |
pulse-reminder-worker | Dispatches 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-workerSchedule 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.
- Visit api.slack.com/apps and click Create new app → From manifest.
- Paste the manifest from
docs/slack-manifest.yamlin your Pulse repo. - Install the app to your workspace.
- Copy Client ID, Client Secret, and Signing Secret into the matching env vars.
- In Slack app settings, set the Request URL for Events and Interactivity to:
https://<your-pulse-domain>/api/slack/events
- 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
- Sign up as the first user; you become workspace admin.
- Create a team under Teams → New team and add at least yourself.
- Set up a daily standup from Standups → New check-in.
- Set the schedule to fire in a couple of minutes from now.
- Wait. When it fires, the question should arrive via your chosen channel (Slack, Comms, email, or web).
- Answer. The digest should appear in the team's digest location.
If nothing arrives, check pulse-scheduler logs in the Supabase
dashboard.