Discover · Aspire · Transform · Achieve · Develop
A Student Operating System — study, career, finance, community and reflection in one calm, engineered place, with a single AI identity called Dax running through all of it. No ads. No feeds. No data selling. Built and maintained by one person.
Notes live in one app, placement deadlines in a WhatsApp group, expenses nowhere at all, and the resume in a Word file that gets renamed final_v7. Every tool solves one slice. DATAD is the attempt to hold the whole thing — without becoming another app that optimises for your attention instead of your outcomes.
Context-switching between five tools during placement season means missed deadlines, forgotten prep, and burnout — not because students lack discipline, but because nothing holds the picture for them.
Study, career, finance, community and personal reflection share one login, one data model, and one AI. Progress in one dimension is visible to the others.
No infinite scroll, no streak-guilt, no dark patterns. Success is measured in outcomes, not in minutes spent inside the product.
Five verbs for the arc of a student's journey — and the initials T.A.D of the person who built it.
Each one shipped incrementally, without breaking what came before. Click any card to see the models and routes behind it.
DATAD has exactly one AI identity. Not a chatbot plus a summariser plus a recommender — one intelligence that shows up in different places doing different work. A student should never have to wonder which AI they're talking to, because there is only one.
The naming rule is written down and enforced: if a student can read it, it says Dax; if a machine reads it, it doesn't. Wire-protocol roles, database collections and model-provider names are deliberately left alone.
Dax reads your actual resume, knows your tier and quota, sees your placement timeline and exam schedule, and carries memory across resume iterations and interview attempts. The provider running underneath is shown as provenance — never hidden, never presented as the identity.
// client/src/utils/dax.js — the name lives in exactly one place export const DAX = 'Dax'; export const DAX_CAPABILITY = { chat: 'Dax Chat', insights: 'Dax Insights', resumeReview: 'Dax Resume Review', careerCoach: 'Dax Career Coach', /* …and six more */ }; // Attribution: Dax is the author, the model is provenance. export const daxAttribution = (provider) => provider ? `${DAX} · ${provider}` : DAX;
A React SPA talking to a layered Express API over JWT, with MongoDB Atlas underneath and a handful of well-chosen third parties at the edges.
1. helmet, CORS allow-list, 1 MB JSON cap, mongo-sanitize, hpp, general rate limiter ·
2. route-level limiters — stricter on auth, on photo upload, on announcements ·
3. verifyToken resolves the Bearer JWT to req.user ·
4. checkRole('admin') guards the admin surface ·
5. controller runs, Mongoose enforces field limits ·
6. the error handler maps validation and duplicate-key errors to 4xx and everything else to a generic 500 — details stay in the server log.
Every private query is scoped to the caller's own user id. There is no endpoint anywhere in the API that returns another user's finances, resume, or journal — including for admin.
| Data | Owner | Visibility | Who can change it |
|---|---|---|---|
| Notes | author | Shared | Author only |
| Albums & Photos | createdBy / uploadedBy | Shared | Owner only |
| Tasks | createdBy + assignee | Shared | Creator or assignee |
| Expenses & Budgets | user | Private | The user, alone |
| Resume | user (unique) | Private | The user, alone |
| Journal | user | Private | The user — invisible to admin |
| Announcements | createdBy | Readable by all | Admin |
Passwords hashed at 10 rounds, minimum 8 chars with a letter and a number. Tokens expire in 7 days; no server-side session store.
Auth endpoints capped at 20 requests per 15 minutes, with heavier limits on uploads and announcement sends.
Email verification, honeypot fields, and password reset flows over Resend.
Admin sees the student register and platform counts. The admin's own journal is scoped to their own id, exactly like everyone else's.
The free tier stays genuinely free and genuinely ad-free, because paid tiers cover the compute. Prices below are the ones currently in the code, exclusive of 18% GST.
The principle throughout: never break what already works. Ship small, verify in the browser, commit per feature.
Auth, dark mode, Notes, Photos, Planner, private Finance, Resume Builder, roles and admin console, Intelligence Center with live news and market data, Support and legal pages.
Render blueprint for the server, Vercel for the client, email verification, rate limiting, profile pages, code-split routes, PWA install.
Placement Hub with per-student status tracking, internship board, multiple stored resumes and more templates.
Community feed with posts, polls and comments; student directory; pinned announcements and a real-time notification centre.
Notes graduate into a full Resource Library across file types, plus event management with RSVP and certificates, and group projects with kanban.
Dax study companion and case coach, gamified contribution scores, skill exchange marketplace, public portfolio generator, analytics dashboards.
Founder · Engineer · Designer
Self-taught full-stack engineer · psychology student at KCLAS · sole author of DATAD
“I built DATAD alone — backend, frontend, database, design system and AI pipeline — because I watched my own batchmates run placement season across five disconnected apps, and no tool existed that understood the whole of student life. Not a startup exercise. Not a portfolio side project. The tool students actually needed, written by someone living the same problem.”
Built by a student, for students. Not designed in a boardroom —
built by someone who lived the problem.
A psychology background applied directly to product decisions: no infinite scroll, no streak guilt, no manufactured urgency. Reflection and recovery are built in alongside productivity, because burnout is not a feature.
Express API, React SPA, MongoDB schema design, the Dax AI pipeline, the design system, deployment and the docs — around 57,000 lines across 590 files, every one of them authored and reviewed by the same person.
Every feature has to answer the same test before it ships: does this actually help someone? Anything that only helps the metrics doesn't get built.
Lines I won't cross
const DATAD = { madeBy: 'one student', forWho: 'all students', hasAds: false, sellingData: false, philosophy: 'human first', };