Skip to content

school-of-freedom: scaffold gateway (manifesto · founder · pioneers · apply)#2

Merged
DearMrFree merged 1 commit into
mainfrom
devin/1777490294-school-of-freedom-init
Apr 29, 2026
Merged

school-of-freedom: scaffold gateway (manifesto · founder · pioneers · apply)#2
DearMrFree merged 1 commit into
mainfrom
devin/1777490294-school-of-freedom-init

Conversation

@devin-ai-integration
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot commented Apr 29, 2026

Summary

First slice of sof.ai → School of Freedom: the unifying gateway over the two sister schools (thevrschool.org + ai.thevrschool.org). This PR is intentionally the marketing/identity surface only — auth + database wiring lands next so we can eyeball the aesthetic before flipping the apex DNS.

What ships

  • / Hero Manifesto + Movement Thinking (Dreaming · Building · Launching · Liberating) + Founder card + sister-school cards, each sister gets its own gradient so the gateway never flattens them
  • /founder Dr. Freedom Cheteni's deep profile + 5-entry timeline (2017 Moonshot ID → 2026 School of Freedom)
  • /students Pioneers directory (founder seeded; reads from shared Postgres in next PR)
  • /[slug] dynamic Pioneer profile — manifesto opener · projects with Movement state · identity tags
  • /apply 4-step application form (Identity → Pathway → Slug → Manifesto) — UI only, submit handler is a placeholder until the DB lands
  • Liquid routing the navbar carries a contextual identity that tracks the page (Movement / The Architect / Pioneer / Applicant)

Brand

Per your call: VR-Enrollment palette (cream paper · deep emerald · warm orange · amber gold) with Geist Sans/Mono for body and Instrument Serif for editorial headlines. Editorial register on the manifesto pages, sans elsewhere.

Architecture (locked from chat)

        sof.ai (this repo)               <- gateway / manifesto / Pioneers
         /            \
The VR School      The AI School         <- two sister schools, two URLs,
www.thevrschool.org   ai.thevrschool.org    one identity (next PR)

Single identity across all three sites = same user database + same NEXTAUTH_SECRET. Cross-TLD cookies aren't possible, so a Pioneer signs in once per top-level domain — but the user record/profile/journals are unified.

Out of scope (next PRs)

  • NextAuth on this repo + DB connection to the existing AI School Postgres
  • /apply actually persisting (right now the submit handler is a placeholder that simulates the round-trip)
  • /admin approval dashboard
  • /settings self-service editor
  • Sign-in deep-link wired to a real callback that lands the user back on sof.ai with a session
  • Vercel project for sofai repo + flipping the sof.ai domain off the redirect and onto this project

Review & Testing Checklist for Human

  • Eyeball the Vercel preview — does the manifesto register feel right on / (Hero, Movement Thinking) and /founder? Do the two sister-school cards read as related-but-distinct?
  • Click through the apply flow (4 steps). The submit shows a "Received" success card but doesn't actually persist — that's expected for this PR.
  • /students and /freedom-cheteni should both render (placeholder data; founder is the only seeded Pioneer for now).
  • Confirm you're happy with copy on the manifesto + founder timeline before I wire DB persistence in the next PR.

Notes

  • Build green locally (pnpm build, 7 routes, no TS/lint errors).
  • I have not touched the sof.ai redirect or DNS yet. The redirect from sof.aiai.thevrschool.org stays live until you've eyeballed the preview and explicitly say "flip it" — same pattern as the apex swap.
  • Next PR: NextAuth + Postgres + real /apply submit + admin approval flow. After that: Vercel project + DNS flip.

Link to Devin session: https://app.devin.ai/sessions/091fc09f81b5489292102ebcdc173dbb
Requested by: @DearMrFree


Open in Devin Review

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
sofai Ready Ready Preview, Comment Apr 29, 2026 7:27pm

@DearMrFree DearMrFree merged commit 5b2b629 into main Apr 29, 2026
2 of 3 checks passed
Copy link
Copy Markdown
Contributor Author

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 5 additional findings in Devin Review.

Open in Devin Review

Comment on lines +34 to +35
.replace(/^-+|-+$/g, "")
.slice(0, 32)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 slugify is not idempotent: .slice(0, 32) after stripping trailing hyphens can reintroduce them

The slugify function at components/sections/apply-form.tsx:28-35 applies .slice(0, 32) as the final step, after .replace(/^-+|-+$/g, "") strips trailing hyphens. If a long input produces a slug where character 32 is a hyphen, the truncation reintroduces a trailing hyphen — making slugify non-idempotent.

This causes two issues:

  1. The canAdvance[2] check (state.slug === slugify(state.slug) at line 56) blocks the user from advancing because the stored slug doesn't survive a second slugify() pass.
  2. The error message shown (line 214-218) reads "Slug must be lowercase letters, numbers, and hyphens only" — which is misleading since the actual problem is a trailing hyphen from truncation, not invalid characters.

For example, an input like "abcdefghijklmnopqrstuvwxyz12345 xy" produces "abcdefghijklmnopqrstuvwxyz12345-" (32 chars, trailing hyphen), which fails the idempotency check and blocks the form.

Suggested change
.replace(/^-+|-+$/g, "")
.slice(0, 32)
.replace(/^-+|-+$/g, "")
.slice(0, 32)
.replace(/-+$/g, "")
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed and fixed in #3 — applied your suggested re-strip after the slice cap, plus a comment explaining why the second pass is necessary so a future reader doesn't "clean up" the apparent redundancy.

devin-ai-integration Bot added a commit that referenced this pull request Apr 30, 2026
…t allow-list

Mirrors sof-ai-repo PR #55 follow-up. Same trusted-host bypass via
javascript://sof.ai existed here.

Co-Authored-By: Dr. Freedom Cheteni <freedom@thevrschool.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant