Public web

The customer-facing storefront. A marketing site, a blog (lightly maintained for years), a catalog of public-facing advisory boards, a signup flow, and a login. By the freeze date most public traffic was bots and direct links to specific board URLs — there was no active acquisition campaign in years.

Everything in this domain renders as Sails-rendered Twig from the same monolith that powers Treehouse. The “frontend” and the “backend” are the same Node process. There is no separate marketing-site CMS.

What lives here

Representative routes

Public-facing routes. Not exhaustive; the actual route file is 2,278 lines.
Method Path Handler Notes
GET / MarketingController.home Hero + 3 case studies + CTA.
GET /about MarketingController.about
GET /how-it-works MarketingController.howItWorks
GET /blog BlogController.list Paginated; 25 per page.
GET /blog/:slug BlogController.detail Twig view + MathJax + AI-generated summaries.
GET /board PublicBoardController.list Public-only filter.
GET /board/:slug PublicBoardController.detail Shows board overview; gated past first page.
GET /signup AuthController.signupPage
POST /signup AuthController.signup Creates user, queues welcome email, redirects to onboarding.
GET /login AuthController.loginPage
POST /login AuthController.login SHA-256 hash check; sets Sails session in Redis.
POST /forgot-password AuthController.forgotPassword Generates one-time token; emails reset link.

Headline flow: visitor → signed-up user → first board view

Step 1: Visitor lands on / from organic, ad, or direct link.
Step 2: Clicks through to /board/:slug for a public board.
Step 3: Sees overview + 2 of N posts; remaining gated behind signup.
Step 4: Clicks "Join to read more" → /signup with ?return=/board/:slug.
Step 5: POST /signup → user row + Mandrill welcome email queued via dispenserd.
Step 6: Auto-login → redirect to /onboarding (one screen, "what brought you here").
Step 7: POST /onboarding → user.signup_reason set → redirect to return URL.
Step 8: User now sees full board view; activity event logged.

By the freeze, this flow was working but very lightly trafficked. The acquisition motion had migrated entirely to outbound (see Domain B / Treehouse and /features/crm-engine).