A modern, full-stack stock analysis platform focused on real-time market visibility, investor personalization, and scalable architecture.
Signalist is built with the Next.js App Router and a component-first UI system to deliver a fast, responsive dashboard experience for tracking market movement, sector rotation, and stock-level insights.
- Real-time market context with embedded TradingView widgets (overview, heatmap, quotes, and top stories).
- Scalable frontend architecture using reusable hooks and composable UI primitives.
- Production-minded backend foundation with MongoDB connection caching and Better Auth integration scaffolding.
- Type-safe development workflow with TypeScript, ESLint, and organized domain constants.
- Clear product direction toward personalized investing workflows (risk profile, investment goals, preferred sectors).
- Market Overview with curated watch groups (Financial, Technology, Services).
- S&P 500 sector heatmap for quick sentiment scanning.
- Market timeline/news feed.
- Market quotes table for comparative symbol monitoring.
- Sign-up flow captures:
- Full name
- Email and password
- Investment goals
- Risk tolerance
- Preferred industry
- Sign-in and sign-up pages built with
react-hook-formand reusable form components.
- Better Auth configured with MongoDB adapter.
- Session-friendly plugin support for Next.js cookies.
- MongoDB connection reuse logic to avoid repeated connection overhead across requests.
| Layer | Technologies |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS v4, custom utility classes, shadcn-style UI components |
| Forms | React Hook Form |
| Data/Auth | MongoDB, Mongoose, Better Auth |
| Visualization | TradingView embedded widgets |
| DX/Quality | ESLint, modular component architecture |
- App Router layout separation: route groups for authenticated app surfaces and auth surfaces.
- Reusable widget abstraction:
useTradingViewWidgetencapsulates script injection, lifecycle cleanup, and load-guarding. - Centralized config: widget and domain constants are maintained in
lib/constants.tsfor consistency and easier iteration. - Database resilience: global Mongoose cache prevents unnecessary reconnects in development and serverless-like environments.
stocks-app/
|- app/
| |- (auth)/ # Sign-in/up experience
| |- (root)/ # Main dashboard pages
| |- layout.tsx # Root metadata + global shell
|- components/
| |- forms/ # Reusable form fields
| |- ui/ # Primitive UI components
| |- TradingViewWidget.tsx # Generic market widget wrapper
|- hooks/
| |- useTradingViewWidget.tsx
|- lib/
| |- better-auth/auth.ts # Better Auth configuration
| |- constants.ts # Widget + domain constants
|- database/
| |- mongoose.ts # Connection + cache logic
git clone <your-repo-url>
cd stocks-app
npm installCreate a .env file in the project root with:
MONGODB_URI=<your_mongodb_connection_string>
BETTER_AUTH_SECRET=<your_secret>
BETTER_AUTH_URL=http://localhost:3000npm run devVisit http://localhost:3000.
npm run dev- Start local development server.npm run build- Build for production.npm run start- Run production server.npm run lint- Run ESLint checks.npm run test:db- Verify MongoDB connectivity.
- Widget configs are strongly centralized to reduce duplication and simplify experimentation.
- Form architecture favors reusable field primitives over one-off page-level inputs.
- Current auth pages are UI-complete and wired for form submission; full auth action integration is the next implementation step.
- Complete Better Auth sign-up/sign-in action wiring.
- Add stock search route and symbol-level analytics pages.
- Implement watchlist persistence per authenticated user.
- Add alert creation, threshold tracking, and notification delivery.
- Expand test coverage for form validation and data access logic.
This project demonstrates:
- Product thinking in a real domain (retail investing and market intelligence).
- Strong frontend engineering with modular, reusable abstractions.
- Full-stack readiness through auth/data layer setup.
- The ability to design for scale early, then iterate toward richer features.
If you are evaluating this as part of an interview process, I can walk through architecture decisions, trade-offs, and planned production hardening steps.