HerStockAI
Back to portfolio

HerStockAI

HerStockAI is an AI-powered investment education platform for women: courses, a GPT-mentor, and a real-world stock trading simulator, wrapped in a paid subscription product. I built it end-to-end as a solo engagement, covering backend, frontend, infrastructure, AI integration, and billing.

VueJSAdonisJSTypescriptTailwindCSSNodeJS
Visit Project

The brief

Investing content online is overwhelmingly written by men, for men. The brief was to build a learning platform that respects how women often approach money differently (calmer pacing, less jargon, less "alpha") without dumbing it down. The product had to teach, but also let users practise with realistic stakes before they ever touched a real brokerage.

What I shipped

A full SaaS product across four product areas:

  • Courses. A modular curriculum with modules, lessons, and quizzes. Per-user progress tracking. Tiered access (free / premium / pro).
  • HerGuide. An AI chat mentor backed by OpenAI's GPT-4o-mini, with server-sent events for token-by-token streaming. Per-user, per-month message quotas enforced server-side. Saved conversations plus notes the user can pin.
  • Stock simulator. A portfolio sandbox: live stock search, simulated trades, holdings with P/L, full transaction history. Reset-to-zero so users can experiment without consequence.
  • Subscriptions. Three tiers (free, NZD $19/mo, NZD $39/mo) on Stripe. Checkout, customer portal, and webhooks for billing events.

Plus an admin surface for the team: CRUD for courses, FAQs, enquiries, simulator config, AI chat config, and users.

Technical decisions worth calling out

AdonisJS + Inertia + Vue 3. A monolith. The product is a tightly-coupled experience (courses, chat, simulator, billing all reading from the same user state) and a single deploy unit kept the surface small. Inertia gives Vue a back-end-driven mental model without separate API plumbing. SSR is on for landing pages; everything authenticated is single-page after the first paint.

Streaming AI with native SSE. No client-side OpenAI SDK, no third-party vector store. The chat controller proxies OpenAI directly and streams tokens to the browser as they arrive. Message quotas are enforced before the upstream call so there's no run-away cost. Conversations and notes are first-class persisted entities. The chat is a product feature, not a sidecar.

Real Stripe, not a wrapper. Stripe Checkout, Customer Portal, and webhooks all wired directly. Tier checking lives on the user model and is enforced at controller-level plus on the page side via Inertia props. Three lines of code to gate a feature.

Postgres with UUIDs end-to-end. UUID primary keys throughout: easier to share IDs in URLs, no integer-leakage of customer counts, and clean foreign keys across the eleven-ish core tables.

A custom design system, not a Tailwind starter. The brand needed warmth (Playfair Display + Poppins, dusty rose and warm taupe), none of which fits "default Tailwind". Built on Tailwind 4's @theme blocks with a tight component vocabulary.

What I'd point at as the win

Real-time AI streaming, paid subscriptions, a stock simulator, and a course platform: four products in one codebase. Solo, in production, with a design that looks like the brand and not a template. That combination, breadth of scope with the polish, is what this project demonstrates.