Repository navigation
Troubleshooting
Start with the command closest to the failure. StarryBio validates configuration during pnpm dev and pnpm build, so the terminal’s exact field path is normally the most useful diagnostic.
Do not include private hosting credentials, API tokens, or anything you do not want published when asking for help.
Symptoms: The command stops with Invalid StarryBio config and a dotted path such as sections.0.links.1.url.
Likely causes:
- An unsupported or misspelled field is present. The schema rejects unknown fields.
- A required value is missing: a link label, regular-link URL, copy-link value, profile field, or section array.
- A value uses an invalid URL, color, date/time, timezone, analytics ID, or output extension.
- Old v2 property names remain.
Diagnose and fix:
- Run
pnpm validateby itself to reduce noise. - Find the reported path in
config/starrybio.config.ts. - Compare it with Configuration Reference and the relevant feature page.
- Remove unknown keys rather than hoping they will be ignored.
- For a v2 config, use the migration table in Operations and Updates.
Examples: links must now be inside sections; text became label; bright became classic-blue; showLocalTime became showVisitorTime.
Symptoms: pnpm validate reports that profile.image, favicon, an icon, or another asset does not exist, or must stay under public/.
Likely causes: The file was not added, the path includes public/ twice, letter casing differs, a backslash/path traversal was used, or a generated asset is expected before its generator runs.
Fix:
- Place the source file under
public/, for examplepublic/assets/images/avatar.webp. - Refer to it as
assets/images/avatar.webpor/assets/images/avatar.webp. - Run
pnpm validateagain. - For
og.png,qr.png, orcontact.vcf, verify the matching generator is enabled, then runpnpm build; do not manually rely on an ignored generated file.
See Assets and Generated Downloads.
Symptoms: pnpm dev, pnpm build, or pnpm icons reports an unknown Simple Icon.
Likely cause: The inferred slug from simpleIcon/brand does not match the pinned simple-icons package’s filename.
Fix: Set an exact lowercase slug in the icon configuration:
icon: { simpleIcon: 'Node.js', slug: 'nodedotjs' }Run pnpm icons after changing it. Do not edit generated files in public/assets/icons/simple-icons/; the next generator run replaces them.
Symptoms: The page does not show a download action, a download 404s, or the build errors while generating an asset.
Likely causes and fixes:
-
enabledis false: set the relevantogImage,qr, orcontactCardsetting totrue. - QR URL is unavailable: set
qr.url, or setseo.canonicalUrlfor the fallback. - vCard fails validation: provide
nameplus at least one ofemail,phone, orwebsite. - Output path is invalid: use a path below
public/; OG/QR output needs.pngor.svg, contact-card output.vcf. - Stale expectation: disabled generators intentionally remove old output at build time.
Run pnpm build, inspect dist/, and use pnpm preview before redeploying. See Assets and Generated Downloads.
Symptoms: A visitor sees an unexpected current state, a schedule dialog has unexpected times, or “Next available” is absent.
Likely causes:
- Schedules are evaluated in each visitor’s local timezone, not
ownerTimeZone. - An overnight range is being interpreted incorrectly.
- Multiple matching entries overlap; the first matching schedule item wins.
- The expected status key is not exactly
available, so the next-availability lookup has no matching entry. - The current state is the default because no interval matches.
Fix: Test the schedule with the viewer’s local date/time, put more specific intentional matches first, use end as an exclusive boundary, and review the overnight examples in Availability and Announcements. ownerTimeZone only displays the owner clock; it never changes matching.
Symptoms: A dismissed announcement returns, or a changed announcement stays hidden.
Diagnosis: Dismissal is a seven-day starrybioAnnouncement cookie whose key is derived from the announcement’s text and URL.
Fix: To intentionally show a new announcement again, change its text or url and deploy. To test a dismissal again, use a fresh/private browser context or clear the site cookie. To retire it, set announcement.enabled: false and deploy.
Symptoms: Images, fonts, scripts, or analytics requests fail in the browser console; the console mentions Content Security Policy.
Likely causes: Generated headers are stale, the remote URL is wrong, or an HTTP resource is blocked on the HTTPS site.
Fix:
- Use the browser Network and Console tabs to identify the exact blocked URL and directive.
- Use HTTPS for external resources.
- Run
pnpm headersafter changing analytics, then rebuild. - Keep the existing restrictive policy; do not add broad wildcards or
unsafe-inline. - Run
pnpm preview, usepnpm preview:cloudflareif applicable, then deploy and retest the canonical domain.
See SEO and Analytics and Security and Privacy.
Symptoms: Wrangler reports unauthenticated/unauthorized access, cannot find an account, or deploys under an unexpected account.
Fix:
pnpm exec wrangler whoami
pnpm exec wrangler login
pnpm exec wrangler whoamiComplete the login in the intended account. Check wrangler.jsonc for the Worker name; the current project has no explicit account ID, bindings, or secrets to repair. In CI, review the CI authentication setup without printing its token.
pnpm deploy intentionally remains the Cloudflare compatibility command. GitHub Pages, Vercel, and Netlify use repository-triggered deployments; inspect the connected repository, production branch or workflow, and provider build log instead of running this command for those hosts.
Symptoms: The workers.dev address works but the custom domain fails, shows another application, or cannot be added in Cloudflare.
Likely causes: The zone is not active or is not Cloudflare-nameserver managed, the hostname has a conflicting CNAME, a normal Worker route conflicts with a Custom Domain, DNS/TLS provisioning is still in progress, or the wrong hostname was put in the site’s canonical metadata.
Fix:
- Confirm the zone is active in Cloudflare and Cloudflare controls its nameservers.
- In Workers & Pages > your Worker > Settings > Domains & Routes, inspect existing routes and custom domains.
- Remove/replace the conflicting DNS CNAME before adding a Custom Domain; do not delete unrelated records without confirming their purpose.
- Wait for Cloudflare to complete certificate provisioning, then test HTTPS.
- Use a dedicated subdomain when the root domain already hosts another site.
Follow Domains and DNS for the supported Worker-specific setup.
Symptoms: A bad URL does not serve the intended 404.html.
Fix: Keep src/pages/404.astro in the source and confirm pnpm build emits dist/404.html. On Cloudflare, also keep assets.not_found_handling set to 404-page in wrangler.jsonc. GitHub Pages, Vercel, and Netlify serve 404.html without a catch-all rewrite; remove SPA rewrites that turn unknown URLs into index.html.
Symptoms: The homepage opens at https://USERNAME.github.io/REPOSITORY/, but scripts, images, generated downloads, or a root-relative internal link return 404.
Fix: In Settings > Pages, set Build and deployment > Source to GitHub Actions, then inspect the Configure GitHub Pages and Build site workflow steps. The workflow must pass the action’s configured base_path to the build; do not add /REPOSITORY manually in astro.config.mjs or component URLs. Rebuild locally with STARRYBIO_BASE_PATH=/REPOSITORY and confirm dist/index.html contains /REPOSITORY/_astro/ and /REPOSITORY/assets/. See Deploying to GitHub Pages.
Symptoms: The provider reports a missing output directory, runs npm instead of pnpm, uses an unsupported Node version, or serves an empty/old site.
Fix: Keep the repository root as the provider base/root directory. Vercel uses vercel.json; Netlify uses netlify.toml and .node-version. Confirm the build command is pnpm build, output/publish directory is dist, and Node is 24.x. The committed vercel.json overrides Vercel’s listed build fields, and netlify.toml takes precedence over matching Netlify dashboard values. Vercel also needs the non-secret build variable ENABLE_EXPERIMENTAL_COREPACK=1 so it can use the pinned pnpm 12 version; Netlify reads that version directly from packageManager. The stock project needs no application secrets. Redeploy after correcting the provider configuration.
Immediate response: Use Cloudflare’s Worker deployment history or the bundled CLI:
pnpm exec wrangler versions list
pnpm exec wrangler rollbackThen restore/fix the matching local source commit before deploying again. Operations and Updates describes the safe update and rollback workflow.
Collect the StarryBio version, Node/pnpm versions, exact command, sanitized error text, relevant configuration fragment with secrets removed, and the public URL only if you are comfortable sharing it. Check the project issue templates after reading this wiki. Report security vulnerabilities privately, as described in Security and Privacy.
StarryBio · 🏠 Home · ✨ Configure · 🚀 Deploy · 🩺 Troubleshoot · 🛠 Developer guide
Static link-in-bio setup, operation, and development guides.
- Configuration Reference
- Managing Content
- Appearance and Branding
- Availability and Announcements
- Assets and Generated Downloads
- SEO and Analytics