Ask these before prompting — gofyio is built around the answers.
01
Does this exist once or everywhere? If a rule, setting, or tenant boundary appears in multiple places, design it once and enforce it everywhere.
GOFYIO EXAMPLE
Tenant isolation lives in basefyio helpers — every API query scopes by companyId. Never duplicate isolation logic in a handler.
See in diagram →
02
Config or hardcoded? Anything that might change at launch time belongs in config or secrets — not scattered literals.
GOFYIO EXAMPLE
Platform decisions (orchestration v1, dashboard access, GX10 runtime) live in packages/config/platform-decisions.json — not buried in code.
See in diagram →
03
Which layer owns this? Edge routes traffic, apps orchestrate, data persists, external providers integrate. Put each concern in the right box.
GOFYIO EXAMPLE
DNS record creation is an API → Cloudflare integration — not a dashboard concern. The dashboard triggers the pipeline; the API talks to providers.
See in diagram →
04
Happy path or real path? Production systems need retries, idempotency, and dead-letter queues — not just the success screenshot.
GOFYIO EXAMPLE
go-live-36 steps are idempotent with BullMQ retries and a DLQ. A failed DNS step can retry without double-provisioning.
See in diagram →
05
Who sees it / who touches it? Separate public visitors, tailnet operators, and secret-bearing services. Least privilege by default.
GOFYIO EXAMPLE
Admin dashboard is Tailscale-only; secrets never appear in Settings — they resolve via envfyio/Infisical at runtime.
See in diagram →