本文へ移動
cccskills
無料GitHub で公開

site-bootstrap

Use when standing up a fresh deployment of this codebase (or the public vigyan-site-os template) — populates company identity, branding and starting content without committing any of it, and decides for each value whether it belongs in platform env, encrypted DB secrets, DB config, or an admin screen.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md7.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Bootstrapping a fresh site

This codebase separates four things that are easy to confuse. Getting a value into the wrong one is the difference between a template someone can adopt and a template that boots already believing it is somebody else's company.

LayerHoldsChanged by
DDL — supabase/migrations/tables, functions, policies, triggersa migration
Required seed — seed/01_required.sqlrows the system cannot run withouta migration
Defaults — seed/02_defaults.sqlstarting values with a screen behind themthe admin UI
Platform envwhat you need before you can reach the databasethe host (Coolify/Vercel/AWS)
Encrypted DB secrets — app_secretsvendor credentials/admin/settings/secrets
Company & content datawho you are, what you sellthis skill, or the admin UI

Run node scripts/sql-classify.mjs to see which tier every migration falls in. It parses dollar-quoted bodies, so an INSERT inside a trigger is correctly read as DDL rather than data.

The rule that matters

Nothing this skill produces gets committed. It writes a local seed file and a brand.config.ts; both are gitignored. What ships is the interview and the shape it fills, never the answers.

If you find yourself about to git add a file containing a legal name, a tax identifier, a bank account or an API key, stop — that is the failure this separation exists to prevent.

Why env is its own tier

Some values cannot live in the database, because they are what you need in order to reach or decrypt it. env.manifest.json is the authority — its bootstrap and public tiers are the platform env, and pnpm env:check fails if code reads a name it does not describe. Do not keep a separate list in this skill. Today that is:

  • DATABASE_URL, SUPABASE_SERVICE_ROLE_KEY, NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY — reaching the database
  • CONFIG_ENCRYPTION_KEY (the key itself; _CURRENT is only the version number, _V2 only during rotation) — without it app_secrets is undecryptable ciphertext
  • ACCOUNT_DELETION_ENCRYPTION_KEY, OTP_HASH_SECRET — read before any DB lookup
  • public tier (NEXT_PUBLIC_GA4_ID, optional NEXT_PUBLIC_SITE_URL) — baked in at build

Everything else that looks like an env var should be asked for here and stored encrypted in app_secrets (tier secret, /admin/settings/secrets) or app_config (tier config, /admin/settings), where it is rotatable from a screen and auditable.

These differ by host, which is the whole reason they are separable:

Coolify (self-hosted)Vercel
DATABASE_URLinternal Docker hostname, direct connectionpooled connection string
NEXT_PUBLIC_SITE_URLyour domain behind CloudflareVERCEL_URL on previews, domain in prod
Cronsystem cron or a Coolify scheduled taskVercel Cron, which needs CRON_SECRET
How values get therepnpm secrets sync coolify --env prod --applypnpm secrets sync vercel --env prod --apply

A value that changes per host must never be a committed seed row: it would be correct on exactly one machine and silently wrong everywhere else.

The interview

Ask these in order. Skip anything already set — read company_profile first and only ask for what is missing or empty.

1. Identity. Legal name, brand name, entity type, jurisdiction, city, country.

2. Tax and registration. Only what the jurisdiction actually needs. For India: CIN, GSTIN, PAN. For elsewhere, ask what applies rather than assuming Indian fields — the schema carries them as nullable text for exactly this reason.

3. Contact. Public email, phone, and whether a WhatsApp number should be shown. If the site will send WhatsApp, say plainly that a Business Account and an approved template are needed before any business-initiated message will be delivered — cold outbound returns 200 with a wamid and is silently dropped, which reads as a broken integration when it is working correctly.

4. Brand. Palette (primary, accent, surface, text), typeface pairing, logo path, tagline, and voice in a sentence or two. If they have no palette, offer to derive one from the logo rather than inventing colours.

5. What they sell. This template supports two commercial models:

  • lead magnet — free, given away to start a conversation
  • one-off — buy once, own it

Subscriptions, services and usage credits are deliberately not here. If the adopter needs recurring billing, say so directly rather than bending one_off into a subscription.

6. Payments. Razorpay or Stripe, test or live. Never ask for a key in chat — point them at /admin/settings/secrets, which encrypts on write.

What to write

seed/local/01_company.sql — gitignored. Their answers as INSERTs against company_profile, company_accounts, social_links. Idempotent (ON CONFLICT DO UPDATE) so re-running is safe.

brand.config.ts — gitignored. Palette, fonts, logo, tagline, voice, feeding CSS custom properties so one file re-skins the whole site.

Run pnpm bootstrap once the hosts/accounts exist: pnpm bootstrap --host coolify|vercel|aws|local --supabase cloud|coolify [--project-ref REF | --service UUID]. It generates what is generatable (encryption keys, OTP/cron secrets), fetches what a provider can return (Supabase cloud via supabase CLI; self-hosted Supabase via the Coolify API with a read:sensitive token), and asks — hidden — for the rest with the exact place to find each. Run by an agent (no terminal) it asks nothing: it reports what is still missing with the same guidance and exits 3 — relay that to the operator, who runs it in a terminal. Never ask the operator to paste a value into chat.

The encrypted vault — secrets/prod.sops.env, never a plaintext file. Run pnpm secrets init (age key + recipient), then pnpm secrets edit --env prod and fill the bootstrap/public names; pnpm secrets check --env prod must report nothing missing. Push with pnpm secrets sync coolify|vercel --env prod --apply. The vault is ciphertext and safe to commit; the age key in ~/.config/sops/age/keys.txt never is — back it up offline. A plaintext file of secrets is still the thing this whole structure exists to avoid.

A checklist, printed not written — the secret/config values to enter in /admin/settings/secrets and /admin/settings after first sign-in, grouped by screen.

Verify before declaring done

pnpm typecheck
git status --porcelain      # must show NOTHING from this skill
psql "$DATABASE_URL" -c "select brand_name, legal_name from company_profile"

Then load the site. If the header still shows the template's placeholder name, brand.config.ts was written but not imported — check app/layout.tsx reads it.

Do not

  • Commit anything produced here.
  • Put a credential in app_config; it is not encrypted. app_secrets is.
  • Seed products or posts to "show it working" — an adopter deleting demo rows they did not ask for is a worse first experience than an empty site with a working admin.
  • Invent tax identifiers as examples. An adopter who copies a plausible-looking GSTIN into production has a real problem.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

brand

無料

Apply this site's visual identity — colours, type, logo files and fixed brand strings. Use for any page, component, social asset or document that should look like the site.

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

Use FIRST when someone asks for a new feature or a change to an existing one — before any schema, code or test. Works out what is actually being asked for, whether to build it or integrate a third party (Trustpilot, Stripe, Calendly and the like), where the data lives, who may do what, and what happens when the vendor is down. Produces a decision, then hands to feature-schema.

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

Use when a new feature needs a table, column or capability — evolving the schema so the new thing joins the permission, audit and RLS contract instead of sitting outside it. Covers the DDL/DML split, the resource/capability wiring, and the self-verifying migration.

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

Use after building a feature — explore it in a real browser to find what nobody predicted, then turn each finding into a deterministic test that guards it forever. Covers the agentic pass, what to generate vs hand-write, and how to skip honestly when a capability is missing.

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

Publishing content or deploying site-os — what caches exist, what refreshes them, and how to prove a change is actually live. Use when publishing a post or product, launching a page, deploying, or when someone says a change "isn't showing".

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

Handling secrets, keys and credentials for site-os — reading vigyan-secrets.md safely, moving keys into app_secrets, rotating, and responding to an exposure. Use whenever a task touches a key, token, password, .env file, app_secrets, encryption, or the secrets document.

日本語の概要は準備中です。原文の説明を表示しています。

aryannema/vigyan-site-os22026年10月2日 更新

aryannema のスキルをすべて見る

このスキルの問題を報告する