v260414.01 2:55p
New! Set up with Claude Chat — your AI walks you through every step, adapted to your computer. Go to setup →
AlpacApps — AI-powered platform with alpacas

AlpacApps Infra

AlpacApps is an open-source AI-powered platform. Set up a super low cost do-it-all system from scratch — messaging, marketing, management, and finance. You just need to set up the required (mostly free) accounts, then tell Claude Code what you have, where it is, and what you ideally want. Then watch the AI magic transpire.

$20 – $200 / month
The philosophy: You set up the (mostly free) vendor accounts and gather credentials. Then tell Claude Code what you have and what you want — it handles all the terminal work: database migrations, CLI setup, edge function deployment, git pushes.

What are you building?

Both profiles use the same template repo. The setup wizard tailors the project for you.

What can you build with this?

A full-stack business platform. The layers build on each other — pick what you need.

Your Customers & Partners
Consumers Banks/Payment Systems External Services
Capabilities
User Login Email SMS Payments E-Signatures AI Features Smart Home Voice Calling
Google OAuth • Resend • Telnyx • Stripe • PayPal • Square • SignWell • Gemini • HAOS • VAPI
Your Business
CRM & customer management — contacts, relationships, communications, documents, payments
Foundation
Database + Auth + Storage Website + Hosting Tailwind CSS v4
Supabase • GitHub Pages • Conductor • Tailwind • Free

Architecture & Cost Calculator

Browser → GitHub Pages (static HTML/CSS/JS) → Supabase (PostgreSQL + Auth + Edge Functions) ↗ ↓ Optional: Background Workers (cloud VM) —› Cloudflare R2 (media storage, optional)

Key principle: No backend server. All application logic runs client-side in the browser. Supabase provides the database, authentication, and serverless functions. For file storage, you can use Supabase Storage (1 GB free) or Cloudflare R2 (10 GB free, zero egress fees). GitHub Pages serves static files for free.

CSS: Tailwind CSS v4 is available alongside existing CSS custom properties. The Tailwind source (styles/tailwind.css) defines AAP design tokens (colors, fonts, shadows, radii) and is compiled to styles/tailwind.out.css by GitHub Actions CI on every push. Use npm run css:build locally or npm run css:watch for development. All pages load both site.css (custom properties) and tailwind.out.css (utility classes).

Select what you need

Core services are pre-selected. Toggle optional ones on or off.

How much will you build?

This mainly affects your Claude Code plan and usage-based services.

Estimated annual cost $0

GitHub1. GitHub + Starter Template Free

First, get a GitHub account and create your project from the starter template. Everything here is done in your browser — no terminal needed.

Create a GitHub account

You'll need a free GitHub account to host your site and store your code. If you already have one, skip to the next step.

  1. Go to github.com/signup and sign up with your email
  2. Verify your email address (GitHub will send you a confirmation link)
  3. That's it — a free account is all you need. GitHub Pages hosting is free for public repositories.

Create your project from the template

Choose a name for your project. This will become your repository name on GitHub (lowercase with hyphens, no spaces, e.g., my-salon-app).

  1. Go to the template repository: github.com/rsonnad/alpacapps-infra
  2. Click the green "Use this template" button → "Create a new repository"
  3. Enter your project name as the Repository name (e.g., my-salon-app)
  4. Make sure Public is selected (required for free GitHub Pages hosting)
  5. Click "Create repository" — GitHub copies all the template files into your own repo

Turn on GitHub Pages

  1. In your new repo, go to Settings (gear icon near the top)
  2. Click Pages in the left sidebar
  3. Under "Source," select Deploy from a branchmain/ (root)Save
  4. Wait 1–2 minutes. Your site is live at https://<username>.github.io/<project-name>/

Download the project to your computer

You need a copy of your project on your computer. This takes two steps:

a) Open a terminal

  • Mac: Press Cmd + Space, type Terminal, press Enter
  • Windows: Press Win + R, type cmd, press Enter

b) Paste this command into your terminal

Click Copy below, then paste into your terminal (Ctrl+V on Windows, Cmd+V on Mac) and press Enter:

git clone https://github.com/USERNAME/my-salon-app.git
cd my-salon-app

This downloads your project files into a folder on your computer. You'll point Claude Code at this folder in the next step.

Windows: Git not installed? If you see "git is not recognized," download Git from git-scm.com, install it (use all defaults), then close and reopen your terminal and try again. Mac already has Git built in.

Connect Git to your GitHub account

Before Claude Code can push code to your repository, Git needs to know your GitHub credentials. The easiest way is GitHub CLI, which handles this through your browser — no passwords or tokens to manage.

a) Install all prerequisites (Mac — one command)

Mac: This installs git, GitHub CLI, Node.js, Supabase CLI, Wrangler, psql, and TypeScript in one step:
bash <(curl -fsSL https://alpacaplayhouse.com/scripts/install-prereqs.sh)
Requires Xcode CLI Tools first: xcode-select --install
Windows: Paste into your terminal: winget install --id GitHub.cli
Then close and reopen your terminal. Also install Node.js if not already installed.

b) Log in to GitHub through your browser

Paste this into your terminal and press Enter:

gh auth login

It will ask a few questions — pick these answers:

  1. Where do you use GitHub?GitHub.com
  2. Preferred protocol?HTTPS
  3. Authenticate Git with GitHub credentials?Yes
  4. How would you like to authenticate?Login with a web browser

It will show a one-time code and open your browser. Paste the code, click Authorize, and you’re done.

How to verify it worked: Run gh auth status in your terminal. You should see your GitHub username and “Logged in to github.com.”

Project structure included in the template:

your-repo/
├── index.html              # Landing page
├── styles.css              # Global styles
├── shared/                 # Shared JavaScript modules
│   ├── supabase.js         # Supabase client singleton
│   ├── auth.js             # Authentication
│   └── ...                 # Other services
├── spaces/                 # Public-facing pages
│   ├── index.html
│   ├── app.js
│   └── admin/              # Admin dashboard
│       ├── index.html
│       ├── app.js
│       └── manage.html
└── supabase/               # Edge functions (deployed via CLI)
    └── functions/

Claude2. Install Claude Code — Get a free week

Claude Code is the AI developer that powers everything. You need it installed before setting up Conductor (Step 4), which is where you’ll do all your actual work.

Click here for a free week of Claude Pro — no credit card required to start. This referral link gives you a full week of Pro-level usage to get your project set up.
Recommended: Claude Pro ($20/month) or higher The free tier works, but you'll hit usage limits quickly when setting up infrastructure. The Pro plan ($20/month) gives you significantly more usage. For intensive development, consider Max ($100) or Max+ ($200).

You do (one time)

  1. Sign up for Claude Pro ($20/month recommended — free week here)
  2. Download the Claude desktop app — Claude Code is built in
  3. Open the app and verify Claude Code is accessible (click the Code tab in the top right)
Already comfortable with the terminal? You can also install Claude Code as a standalone CLI: npm install -g @anthropic-ai/claude-code. Same features, same skills.

That’s it for now — you’ll use Claude Code through Conductor (Step 4), which gives you a much better workflow with parallel agents and workspace management.

Supabase3. Supabase Free

Database, storage, auth, and serverless edge functions — all in one.

You do (in your browser)

  1. Sign up at supabase.com/dashboard (GitHub login works)
  2. Go to supabase.com/dashboard/projects and click New Project
  3. If prompted to create an organization first, give it any name (e.g. “Personal”) and select the Free plan
  4. Set a database password — save this securely (you’ll paste it to Claude)
  5. Choose a region close to your users, click Create new project, and wait 1-2 minutes

Tell Claude Code your two credentials

These are the only two things Claude can’t get on its own. Enter them here and hit Copy — Claude Code will log into Supabase, link your project, and fetch everything else (API keys, URLs, connection strings) automatically.

Look at your browser’s address bar: supabase.com/dashboard/project/abcdefghijk/... — the highlighted part is the ref. Or go to Project SettingsGeneral.

The password you chose when creating the project. If you forgot it, reset it in Database settings.

Copy this into Claude Code

This auto-fills as you type above. Click Copy, paste into Claude Code, and it handles the rest.

Set up Supabase for my project.

My project ref is: ___
My database password is: ___

Log into the Supabase CLI (supabase login), link my project (supabase link --project-ref), then fetch the project URL and anon key from the API settings automatically. Install the CLI if it's not already installed. Create the core database tables for [describe your app here], enable RLS on all tables, create storage buckets for photos and documents, commit, and push.

Don't ask me for permission at each step — just do the work end to end and show me the results when you're done.
What happens next: Claude Code will open your browser to log into Supabase, link to your project, then automatically retrieve your API keys, project URL, and connection string. It’ll save everything to docs/CREDENTIALS.md, create your database tables, and push the code. You don’t need to copy anything else from Supabase.

4. Conductor — Your Development Hub Free

Conductor is where you’ll do all your work. It’s a Mac app that runs multiple Claude Code agents in parallel — each in its own workspace with its own branch. Instead of working in a single Claude Code session, you manage everything from Conductor.

This is your main tool from here on. After this step, you’ll use Conductor for all development — building features, fixing bugs, setting up services, running tests. Each task gets its own workspace with a dedicated Claude Code agent.

1. Install Conductor

  1. Download from conductor.build
  2. Open Conductor and point it at the project folder you cloned in Step 1

2. Create your first workspace and run the setup wizard

  1. Create a new workspace in Conductor (name it something like “setup”)
  2. In that workspace, type:
    /setup-alpacapps-infra
  3. The wizard will configure your project based on the profile you picked above — pruning unused modules, creating database tables, and pushing everything

The wizard configures your project based on the profile you picked above.

It prunes unused modules, configures .claudeignore, creates your database tables, and pushes everything. If you picked Personal / Business, only the services you selected will be set up.

Don’t skip the setup wizard. If you don’t run it, your project will have all the property management modules cluttering your codebase even if you don’t need them.
Slash command not working? The /setup-alpacapps-infra skill requires the Max plan ($100/month) or higher. If you're on the Pro plan, type this instead:
Read .claude/skills/setup-alpacapps-infra/SKILL.md and follow those instructions to set up my project
This does the exact same thing — Claude reads the setup guide and walks you through it step by step.

3. How to work with Conductor going forward

After the setup wizard finishes, this is how you build with Conductor:

  1. One task per workspace. Want to add a payments page and fix a bug? Create two workspaces and run them in parallel.
  2. Each workspace gets its own git branch so agents never conflict with each other.
  3. Just tell it what you want in plain English. Paste credentials, describe features, ask questions — the agent handles the code.
"Set up Supabase. Here are my credentials: project ref is abc123, password is ..."
installs Supabase CLI, links project, creates tables with RLS, creates storage buckets, commits and pushes
"Build a tenant portal with a login page, profile editor, and payment history"
creates pages, writes auth guards, adds Supabase queries, commits and pushes — site updates automatically
Stuck on any step? Take a screenshot, paste it into any Conductor workspace, and ask: “What do I do?” — Claude can read screenshots and will walk you through it.

What the rest of this guide is for

The sections below explain each service in detail. For each one, you:

  1. You create the account and copy credentials (in your browser)
  2. You paste the credentials into a Conductor workspace
  3. Claude handles everything else — updates config files, installs CLIs, creates tables, writes edge functions, deploys, and pushes code

You never need to edit files yourself. Just tell Claude what you want.

Google5. Google Sign-In (Optional) Free

If your app needs user login (admin dashboard, customer accounts, etc.), the easiest option is “Sign in with Google.” Supabase has built-in support — you just need to create a Google Cloud project and get OAuth credentials.

Same Google Cloud project: This step and Step 6 (Google Gemini) both use Google Cloud. Create one project and use it for both — no need to set up two.

1. Create a Google Cloud project

  1. Go to console.cloud.google.com → New Project
  2. Name it anything (e.g., “My Salon App”) and click Create
  3. Make sure the new project is selected in the top-left dropdown

2. Set up the OAuth consent screen

This is the screen users see when they click “Sign in with Google.”

  1. Go to APIs & Services → OAuth consent screen
  2. Choose External (unless you’re on Google Workspace and only want internal users) → click Create
  3. Fill in the required fields:
    • App name: your app’s name (what users see)
    • User support email: your email
    • Developer contact email: your email
  4. Click Save and Continue through the Scopes, Test Users, and Summary steps (defaults are fine)
Publishing status: Your app starts in “Testing” mode, which means only test users you add can sign in. To let anyone sign in, click Publish App on the consent screen page. Google may ask you to verify your app if you use sensitive scopes, but basic sign-in (email/profile) doesn’t require verification.

3. Create OAuth credentials

  1. Go to APIs & Services → Credentials
  2. Click + Create CredentialsOAuth client ID
  3. Application type: Web application
  4. Name: anything (e.g., “Supabase Auth”)
  5. Under Authorized redirect URIs, add:
    https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback
  6. Click Create and copy the Client ID and Client Secret

4. Connect to Supabase

  1. Go to your Supabase dashboard → Authentication → Providers
  2. Find Google in the list and toggle it on
  3. Paste your Client ID and Client Secret
  4. Click Save

Give Claude these credentials

### Authentication (Google OAuth via Supabase)
- Google Client ID: `your-client-id.apps.googleusercontent.com`
- Auth is handled by Supabase Auth (no edge function needed)
- Redirect URI: `https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback`
- Sign-in method: supabase.auth.signInWithOAuth({ provider: 'google' })

Then tell Claude

"Set up Google Sign-In. Create a login page with a 'Sign in with Google' button using Supabase Auth, and add an auth check to the admin pages so only authenticated users can access them." Claude will create shared/auth.js, add login/logout UI, set up auth guards on admin pages, commit, and push.

Google Gemini6. Google Gemini (AI) Free

Optional. Useful for fuzzy matching (e.g., matching bank transaction sender names to tenants).

Already set up Google Sign-In? You already have a Google Cloud project from Step 4. Use the same project — just grab a Gemini API key below.

You do (in your browser)

  1. Get a free API key at aistudio.google.com/apikey

Give Claude these credentials

### AI Matching (Google Gemini)
- API key: `your-gemini-key` (store as Supabase secret: GEMINI_API_KEY)

Then tell Claude

"Store my Gemini API key as a Supabase secret." Claude will run: supabase secrets set GEMINI_API_KEY=your_key_here

Resend7. Resend (Email) Free

You do (in your browser)

  1. Sign up at resend.com/signup (free: 3,000 emails/month)
  2. Recommended: Add your domain at resend.com/domains and set up DNS records. Without this, you can only send from onboarding@resend.dev.
  3. Create an API key at resend.com/api-keys and copy it

Give Claude these credentials

### Email (Resend)
- API key: `re_your_key_here` (store as Supabase secret: RESEND_API_KEY)
- From address: notifications@yourdomain.com (or onboarding@resend.dev)

Then tell Claude

"Set up email sending with Resend. Store the API key as a Supabase secret and create a send-email edge function." Claude will run supabase secrets set, create the edge function, deploy it, commit, and push.

Telnyx8. Telnyx (SMS) Pay-as-you-go

You do (in your browser)

  1. Sign up at telnyx.com/sign-up and add a payment method
  2. Buy an SMS-capable number at portal.telnyx.com → Numbers (~$1/month)
  3. Note the phone number in E.164 format (e.g., +12125551234)
  4. Create a Messaging Profile at portal.telnyx.com → Messaging
  5. Set inbound webhook URL:
    https://YOUR_PROJECT_REF.supabase.co/functions/v1/telnyx-webhook
  6. Assign your phone number to this profile, note the Messaging Profile ID
  7. Get your API key at portal.telnyx.com → API Keys and copy it
10DLC Registration (Required for US) — do this now, it takes time. Go to Messaging → Compliance. Create a Brand (Sole Proprietor), then a Campaign (use case: business notifications). Assign your number. Approval can take days to weeks — SMS won't work without it.

Give Claude these credentials

### SMS (Telnyx)
- API key: `KEY_your_key_here`
- Messaging Profile ID: `your-profile-id`
- Phone number: `+12125551234`
- Config stored in `telnyx_config` table
- Edge functions: `send-sms` (outbound), `telnyx-webhook` (inbound)
- Deploy webhook with `--no-verify-jwt`
- Auth: Bearer token (NOT Basic auth like Twilio)
- API: https://api.telnyx.com/v2/messages

Then tell Claude

"Set up Telnyx SMS. Create the telnyx_config and sms_messages tables, write the send-sms and telnyx-webhook edge functions, and deploy with --no-verify-jwt." Claude will create tables, insert config, write both edge functions, deploy, create shared/sms-service.js, commit, and push.

Square9. Square (Payments) Pay-as-you-go

You do (in your browser)

  1. Sign up at squareup.com/signup
  2. Create an app at developer.squareup.com/console → Apps
  3. Copy from the Developer Dashboard:
    • Application ID (starts with sq0idp-)
    • Access Token — Sandbox for testing, Production for real charges
    • Location ID — Square Dashboard → Locations

Give Claude these credentials

### Payments (Square)
- Application ID: `sq0idp-your-app-id`
- Sandbox Access Token: `your-sandbox-token`
- Location ID: `your-location-id`
- Environment: sandbox (switch to production when ready)
- Config stored in `square_config` table
- Edge function: `process-square-payment`
- Sandbox SDK: https://sandbox.web.squarecdn.com/v1/square.js
- Production SDK: https://web.squarecdn.com/v1/square.js

Then tell Claude

"Set up Square payment processing. Create the config and payments tables, a process-square-payment edge function, and a client-side square-service.js module." Claude will create tables, insert config, write the edge function + client module, deploy, commit, and push.

Stripe10. Stripe (Payments) Pay-as-you-go

Stripe handles ACH bank transfers (0.8% capped at $5), card payments (2.9% + 30¢), and outbound payouts to associates via Stripe Connect ($0.25/payout).

You do (in your browser)

  1. Sign up at dashboard.stripe.com/register
  2. Get your API keys at dashboard.stripe.com/apikeys:
    • Publishable key (starts with pk_test_ or pk_live_)
    • Secret key (starts with sk_test_ or sk_live_)
  3. Set up a webhook at dashboard.stripe.com/webhooks:
    https://YOUR_PROJECT_REF.supabase.co/functions/v1/stripe-webhook
  4. Subscribe to events: payment_intent.succeeded, payment_intent.payment_failed, transfer.paid, transfer.failed, account.updated
  5. Copy the Webhook Signing Secret (starts with whsec_)
  6. (Optional) Enable Stripe Connect for outbound associate payouts

Give Claude these credentials

### Payments (Stripe)
- Publishable key (test): `pk_test_...`
- Secret key (test): `sk_test_...`
- Publishable key (live): `pk_live_...`
- Secret key (live): `sk_live_...`
- Webhook signing secret: `whsec_...`
- Config stored in `stripe_config` table
- Edge functions: `process-stripe-payment`, `stripe-webhook`
- Deploy webhook with `--no-verify-jwt`
- Stripe.js v3: https://js.stripe.com/v3/

Then tell Claude

"Set up Stripe payment processing. Create the stripe_config and stripe_payments tables, a process-stripe-payment edge function (PaymentIntent creation), a stripe-webhook edge function (HMAC-verified), and a client-side stripe-service.js module. Support ACH bank transfers and card payments." Claude will create tables, insert config, write and deploy both edge functions, create the client module, commit, and push.

SignWell11. SignWell (E-Signatures) Free

You do (in your browser)

  1. Sign up at signwell.com/sign_up (free: 3 docs/month, 25 with credit card)
  2. Copy your API key at signwell.com → Settings → API
  3. Add a webhook at signwell.com → Settings → Webhooks:
    https://YOUR_PROJECT_REF.supabase.co/functions/v1/signwell-webhook
  4. Subscribe to the document_completed event

Give Claude these credentials

### E-Signatures (SignWell)
- API key: `your-signwell-api-key`
- API base: https://www.signwell.com/api/v1
- Auth: X-Api-Key header
- Config stored in `signwell_config` table
- Deploy webhook with `--no-verify-jwt`

Then tell Claude

"Set up SignWell for e-signatures. Create the config table, a webhook edge function, and client-side signwell-service.js and pdf-service.js modules." Claude will create the table, insert config, write and deploy the webhook, create client modules, commit, and push.

Cloudflare12. Cloudflare R2 (Object Storage) Free

S3-compatible object storage with 10 GB free and zero egress fees. The setup wizard creates two R2 buckets automatically using your Cloudflare Global API Key:

  • <project>-media — Images, documents, uploads
  • <project>-backups — Database exports, config snapshots

If you prefer manual setup:

You do (in your browser)

  1. Sign up at dash.cloudflare.com/sign-up (free, no credit card)
  2. Go to R2 Object Storage in the left sidebar → Create bucket
  3. Create two buckets: <project>-media and <project>-backups
  4. In the media bucket Settings, enable Public Development URL (allows public read access via a pub-*.r2.dev URL)
  5. Go to R2 Object StorageManage R2 API TokensCreate API token
  6. Give it Object Read & Write permission, apply to both buckets, create the token
  7. Copy the Access Key ID and Secret Access Key (shown only once!)

Give Claude these credentials

### Cloudflare R2
- Account ID: `your-cloudflare-account-id` (from the R2 dashboard URL or Overview page)
- Bucket name: `your-bucket-name`
- Public URL: `https://pub-xxxx.r2.dev` (from bucket Settings → Public Development URL)
- Access Key ID: `your-access-key`
- Secret Access Key: `your-secret-key`

Then tell Claude

"Store my R2 credentials as Supabase secrets and create the R2 upload helper and config table." Claude will: supabase secrets set R2_ACCOUNT_ID=... R2_ACCESS_KEY_ID=... R2_SECRET_ACCESS_KEY=... R2_BUCKET_NAME=... R2_PUBLIC_URL=..., create r2_config table, create supabase/functions/_shared/r2-upload.ts (S3-compatible upload with AWS Sig V4)

Cloudflare11b. Cloudflare D1 — Sessions + DevControl Free

The setup wizard creates two D1 databases automatically using your Cloudflare Global API Key:

  • <project>-sessions — Claude session transcripts with search/filtering (browsable in DevControl Sessions tab)
  • <project>-devcontrol — Task tracking, build logs, deployment history

Both use free tier (5M reads/day, 100K writes/day, 5 GB storage). If you prefer manual setup:

You do (in your terminal)

  1. Wrangler is installed by the prerequisite script. If missing: npm install -g wrangler
  2. Authenticate: wrangler login
  3. Create both D1 databases:
    npx wrangler d1 create <project>-sessions
    npx wrangler d1 create <project>-devcontrol
    Copy both database_id values from the output.
  4. Edit cloudflare/claude-sessions/wrangler.jsonc — replace YOUR_DATABASE_ID_HERE with your database ID
  5. Run the schema:
    cd cloudflare/claude-sessions
    npx wrangler d1 execute claude-sessions --file=schema.sql --remote
  6. Choose an auth token (any secret string) and edit src/index.js — set AUTH_TOKEN
  7. Deploy the Worker:
    npx wrangler deploy
    Note the Worker URL from the output.

Give Claude these credentials

### Cloudflare D1 Session Archive
- Worker URL: `https://claude-sessions.YOUR-SUBDOMAIN.workers.dev`
- Auth token: `your-chosen-token`

Then tell Claude

“Install the Claude session archive hook. Copy the hook script from cloudflare/claude-sessions/hooks/save-session.sh, configure it with my Worker URL and token, and add it to my Claude settings.” Claude will copy save-session.sh to ~/.claude/hooks/, set the API URL and token, and add a SessionEnd hook entry to ~/.claude/settings.json. Every session that ends will auto-archive its transcript.

gstack11c. gstack — Claude Code Skills & Headless Browser Free

Optional. Open-source CLI that supercharges Claude Code with powerful skills: headless browser for QA testing (~100ms per command), code review, ship workflow, engineering retrospectives, and more. By Garry Tan, MIT licensed.

Skills included

  • /browse — Headless browser for QA testing and site dogfooding
  • /review — Pre-landing code review with production risk detection
  • /ship — Ship workflow: sync base, test, review diff, bump version, push, create PR
  • /qa — Systematic QA testing with auto-fix (Quick / Standard / Exhaustive)
  • /qa-only — QA report without fixes
  • /retro — Engineering retrospectives with per-person commit analysis
  • /plan-ceo-review — CEO/founder-mode plan review
  • /plan-eng-review — Engineering manager plan review
  • /document-release — Post-ship documentation updates

You do (in your terminal)

  1. Install gstack:
    curl -fsSL https://raw.githubusercontent.com/garrytan/gstack/main/install.sh | bash
  2. Verify:
    ls ~/.claude/skills/gstack/SKILL.md
    If the file exists, you’re set. Claude Code auto-detects the skills.

Then tell Claude

“Run /browse to verify gstack is working. Navigate to my site and take a screenshot.” Claude will launch the headless browser daemon, navigate to your site, and return a screenshot — confirming everything works.

Updating: Run /gstack-upgrade inside Claude Code, or re-run the install script.

Source: github.com/garrytan/gstack

13. Background Workers (Optional)

Some features need always-on processes that can’t run in the browser or in Supabase Edge Functions. These run on a cloud VM (recommended: Hostinger VPS $5–12/mo, or any provider).

What runs here (11 workers)

  • Automated bug fixer — polls for bug reports, runs Claude Code to fix them, commits, merges
  • Feature builder — picks up feature requests, implements them autonomously
  • Device pollers — Tesla vehicles (every 5 min), LG washer/dryer (every 30s), Blink cameras (snapshots)
  • Camera event poller — UniFi Protect smart detection events → SMS alerts
  • AI image generation — polls job queue, calls Gemini API, uploads results
  • Spirit whisper worker — PAI daily whisper scheduler & delivery
  • Live subtitles — real-time speech-to-text + translation server
  • PAI Discord bot — bridges Discord community server to PAI AI assistant
  • Project inquiry worker — Gemini Vision + Brave Search for research tasks
  • Instruction runner — watches for instruction files from mobile Claude Code
  • Reverse proxy — Caddy for camera HLS streams, OpenClaw chatbot gateway

Typical sizing

Tier Spec Cost Good for
Basic 2 vCPU, 2 GB RAM ~$12/mo A few lightweight pollers + image gen
Full 2 vCPU, 4 GB RAM ~$24–32/mo All workers including Claude Code automation (bug fixer, feature builder)

You do

  1. Spin up an Ubuntu VM on any cloud provider
  2. Install Node.js 18+, Tailscale (if you have a home server), and Caddy/nginx as needed
  3. Clone your repo and set up each worker as a systemd service
  4. Workers query Supabase directly using the REST API or service role key

Then tell Claude

“Set up the background workers on my server at [IP]. Create systemd services for the bug fixer, device pollers, and image gen worker. Add SSH access details to CLAUDE.local.md.”

14. Custom Domain (Optional)

No rush on this step. Your site is already live at https://<username>.github.io/<project-name>/ and that works great while you’re building. Come back to this when you’re ready to share your app with the world under your own brand name.

1. Buy a domain

If you don’t already own one, buy a domain from any registrar. Here are popular options:

2. Tell GitHub about your domain

  1. Go to your repo on GitHub
  2. Click SettingsPages (left sidebar)
  3. Under Custom domain, type your domain (e.g., myapp.com) and click Save
  4. GitHub will show a message that a DNS check is pending — that’s normal until you complete step 3

3. Point your domain to GitHub Pages (DNS settings)

This is the key step: you need to tell your domain registrar to send traffic to GitHub’s servers. The exact screens look a little different at each registrar, but you’re doing the same thing everywhere.

Find your DNS settings:

  • Namecheap: Dashboard → click Manage next to your domain → Advanced DNS tab
  • Cloudflare: Select your domain → DNSRecords
  • Squarespace Domains: Domains panel → click your domain → DNSDNS Settings

Add these records:

TypeName / HostValue / Points to
A@185.199.108.153
A@185.199.109.153
A@185.199.110.153
A@185.199.111.153
CNAMEwww<username>.github.io
What do these mean?
  • The four A records tell browsers “when someone types myapp.com, go to GitHub’s servers.”
  • The CNAME record makes www.myapp.com work too, by pointing it to your GitHub Pages address.
  • The @ symbol means “the root domain” (i.e., myapp.com with nothing in front of it).

If your registrar already has default records (like parking page records), delete those first, then add the ones above.

4. Turn on HTTPS

  1. Wait 5–30 minutes for DNS changes to propagate (sometimes up to 24 hours)
  2. Go back to your repo’s SettingsPages
  3. The DNS check should now show a green checkmark
  4. Check the box for Enforce HTTPS — GitHub provides a free SSL certificate automatically

How do I know it’s working?

Visit your domain in a browser. If you see your site, you’re done. If not:

  • Double-check that you entered the A record IPs exactly as shown above
  • Make sure you deleted any old/default DNS records that might conflict
  • DNS changes can take up to 24 hours to fully propagate — wait and try again
  • Use dnschecker.org to verify your records are visible worldwide

15. On-Demand Context System

Claude Code reads CLAUDE.md at the start of every conversation. To keep this fast and efficient, we use an on-demand context loading pattern: CLAUDE.md stays slim (~30 lines) and indexes separate docs/*.md files that Claude only loads when the task requires them.

Why this matters

A monolithic CLAUDE.md with credentials, schema, patterns, and integrations can easily reach 200+ lines — thousands of tokens loaded into every conversation whether needed or not. With on-demand loading, a conversation about Tailwind styling only loads docs/PATTERNS.md, while a database migration only loads docs/SCHEMA.md and docs/CREDENTIALS.md.

File structure

FilePurposeGit status
CLAUDE.mdSlim directives + on-demand doc index (~30 lines)Checked in
CLAUDE.local.mdOperator directives, live URLs, push workflowGitignored
docs/CREDENTIALS.mdAll API keys, tokens, connection stringsGitignored
docs/SCHEMA.mdDatabase table definitionsChecked in
docs/PATTERNS.mdCode patterns, Tailwind tokens, auth systemChecked in
docs/KEY-FILES.mdProject file structure referenceChecked in
docs/DEPLOY.mdDeployment workflow, version formatChecked in
docs/INTEGRATIONS.mdExternal services, cost tiersChecked in
docs/CHANGELOG.mdRecent changes logChecked in

How the index works

The top of CLAUDE.md contains trigger hints that tell Claude which doc to load for which task:

> **On-demand docs — load when the task matches:**
> - `docs/CREDENTIALS.md` — **load for:** SQL queries, deploying functions, SSH, API calls
> - `docs/SCHEMA.md` — **load for:** writing queries, modifying tables, debugging data
> - `docs/PATTERNS.md` — **load for:** writing UI code, Tailwind styling, code review
> - `docs/KEY-FILES.md` — **load for:** finding files, understanding project structure
> - `docs/DEPLOY.md` — **load for:** pushing, deploying, version questions
> - `docs/INTEGRATIONS.md` — **load for:** external APIs, vendor setup, pricing
> - `docs/CHANGELOG.md` — **load for:** understanding recent changes
Tip: The setup wizard builds all these files automatically as it sets up each service. Both CLAUDE.local.md and docs/CREDENTIALS.md are already in .gitignore.

Profile-aware context

The wizard generates different context files based on your profile:

  • General AI Enablement: CLAUDE.md with 4 doc references and 3 code guards (~20 lines). Only core docs are generated. A .claudeignore file excludes property-management code from Claude’s search scope, saving thousands of tokens per conversation.
  • Property Management: CLAUDE.md with all 7 doc references and full code guards (~35 lines). All docs are generated including KEY-FILES, INTEGRATIONS, and CHANGELOG.

See docs/CLAUDE-TEMPLATE.md for the exact templates and feature-manifest.json for the file-to-feature mapping that drives pruning.

16. Day-One Checklist

You do (in your browser)

Core Stack — Free:

  • Create GitHub account and repository
  • Enable GitHub Pages on the repo
  • Create Supabase account and project
  • Copy: project ref, anon key, DB password, and session pooler connection string
  • Download and install Conductor from conductor.build

User Login — Free (Google OAuth):

  • Create Google Cloud project
  • Set up OAuth consent screen (publish when ready)
  • Create OAuth client ID (Web application)
  • Add Supabase callback URL as authorized redirect URI
  • Enable Google provider in Supabase Auth settings
  • Copy: Client ID, Client Secret

Email — Free (Resend):

  • Create Resend account
  • Verify your domain (or use onboarding@resend.dev)
  • Copy: API key

SMS — Pay-as-you-go (Telnyx):

  • Create Telnyx account, add payment method
  • Buy a phone number (~$1/month)
  • Create Messaging Profile, assign number, set webhook URL
  • Register for 10DLC (mandatory for US — do early, approval takes time)
  • Copy: API key, Messaging Profile ID, phone number

Payments — Free until you process (Square):

  • Create Square developer account and application
  • Copy: Application ID, sandbox access token, location ID

Payments — Free until you process (Stripe):

  • Create Stripe account at stripe.com
  • Set up webhook endpoint, subscribe to payment + transfer events
  • Copy: publishable key, secret key, webhook signing secret

E-Signatures — Free tier (SignWell):

  • Create SignWell account
  • Set up webhook URL in Settings
  • Copy: API key

Optional:

  • Custom domain for GitHub Pages
  • Google Gemini API key (aistudio.google.com)
  • Discord developer application + bot token

Then tell Claude

Once you've given Claude your credentials, tell it to set everything up. You can either use the setup skill or paste this prompt:

"I've set up all my vendor accounts. Please:
  1. Set up the project structure and push to GitHub
  2. Install and link the Supabase CLI
  3. Create the database tables I need for [your domain]
  4. Set up email sending with Resend
  5. Set up SMS with Telnyx
  6. Set up payment processing with Square
  7. Set up e-signatures with SignWell
  8. Deploy all edge functions and store API keys as secrets"

Or just type /setup-alpacapps-infra in Claude Code — the skill walks through the same setup interactively, asking what services you need as it goes.

Claude handles everything from there — creating tables, writing edge functions, deploying, setting secrets, committing, and pushing. You never need to touch the terminal yourself.

17. Mobile App (iOS & Android) Free to develop

Fully native mobile apps for iOS and Android. Each platform uses its native UI toolkit for the best possible experience — SwiftUI on iOS, Jetpack Compose on Android.

How It Works

Native iOS (Swift/SwiftUI) → Supabase REST API ← Native Android (Kotlin/Compose) ↓ Home Assistant API (smart home) Sonos API (music control)

Both apps connect to the same Supabase backend and Home Assistant APIs as the web app. Each is built with platform-native tools for smooth performance and idiomatic UI.

Tech Stack

LayeriOSAndroid
LanguageSwiftKotlin
UI FrameworkSwiftUIJetpack Compose (Material 3)
AuthSupabase Auth (AuthService.swift)Supabase Auth (AuthManager.kt)
API LayerHaosService, LightService, SonosServiceHaosApi, LightApi, SonosApi
ThemeAppTheme.swift (brand tokens)Theme.kt (Material 3 brand tokens)

App Screens

ScreenPurpose
LoginEmail/password + Google OAuth
LightsControl all smart lights (on/off, color, brightness) via HAOS
MusicSonos room control (play, pause, volume, search)
ClimateNest thermostat control
CamerasLive camera streams via go2rtc
CarsTesla vehicle status and controls
AssistantChat with PAI (AI assistant)
SubtitlesReal-time live subtitles
WorkAssociate work tracking and hours

Development Tools

PlatformIDERequirements
iOSXcode 15+macOS only, free from App Store. Apple Developer account ($99/year) for App Store distribution
AndroidAndroid StudiomacOS, Windows, or Linux. Google Play Console ($25 one-time) for Play Store distribution

Build & Deploy

Claude does this

Claude Code handles the build process. Each platform builds independently:

  1. iOS — Open mobile-ios/AlpacaPlayhouse.xcodeproj in Xcode, press Play to build and run on simulator or device
  2. Android — Open mobile-android/ in Android Studio, press Run to build the APK and deploy
  3. Kiosk (Android) — A separate alpaca-kiosk/ project provides a lockdown kiosk mode with device admin, boot receiver, photo booth, and HTTP API server

Key Design Decisions

  • Fully native — SwiftUI (iOS) and Jetpack Compose (Android) for platform-idiomatic UI, smooth 60fps animations, and full native API access
  • Shared API layer — Both apps connect to the same Supabase backend and HAOS APIs, keeping data in sync with the web app
  • Brand theming — Both apps use the same brand color tokens (accent gold, warm backgrounds) defined in their respective theme files
  • Kiosk variant — A dedicated Android kiosk app (alpaca-kiosk/) with device admin lockdown, guest book photo booth, and HTTP API for remote control
  • macOS kiosk — A Swift Package (oldmackiosk/) for legacy Mac kiosk displays with screen lockdown, audio management, and JS bridge

AlpacApps Architecture

67 edge functions, 11 workers, 2 native mobile apps — zero backend code

Claude Code Supabase GitHub Pages Alpaca Mac Hostinger
Residents / Admins / Public HTTPS GH GitHub Pages Static HTML/JS/CSS hosting alpacaplayhouse.com /spaces/ /residents/ /admin/ /auth/ API calls SB Supabase Backend-as-a-Service (database, auth, storage, edge functions) PostgreSQL Auth Storage Edge Functions CC Claude Code AI dev agent: writes code, fixes bugs, deploys, runs SQL Local or cloud (Claude Max/Pro) git push migrations Mac Alpaca Mac On-prem home server. Bridges LAN-only smart home devices Sonos go2rtc HomeA MusicA Tailscale VPN HG Hostinger VPS Reverse proxy + tunneling. Routes cloud traffic to LAN Caddy Tailscale PAI-Claw Edge Fn proxy Tailscale mesh External APIs Stripe Resend Tesla Telnyx SignWell Govee Gemini Vapi Nest Brave LG ThinQ Anova webhooks + API calls ZERO SERVER ARCHITECTURE Browser talks directly to Supabase RLS enforces security at DB level

How a request flows

01
Browser
User loads page from GitHub Pages
02
Supabase
JS calls Supabase API (auth + data)
03
Edge Function
Sensitive ops run server-side
04
Hostinger
Proxies to LAN via Tailscale
05
Alpaca Mac
Controls Sonos, cameras, lights

View full interactive diagram →

Other ways to get started:

Setup hub (overview) Quick start (for humans) Claude Chat guide Sync new features Template repo