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
- Marketing pages —
/,/about,/how-it-works,/contact, plus a handful of campaign landing pages from prior brand pushes. - Blog —
/blog,/blog/:slug. Stored in MySQL, edited from inside Treehouse (see Domain D). - Public board catalog —
/board,/board/:slug. A read-only view onto a small subset of advisory boards that were tagged “public.” Most boards are private and never appear here. - Auth —
/login,/signup,/logout,/forgot-password. SHA-256 password hashes (not bcrypt — see security). - Static legal —
/terms,/privacy,/cookies.
Representative routes
| 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).