Ref is a SvelteKit citation workspace focused on fast project-based reference generation, collaboration, and RMIT-ready workflows.
- Free citation workspace with team collaboration.
- Multi-style support: APA, MLA, Chicago, IEEE, and RMIT Harvard.
- Auto citation generation pipeline with metadata extraction and scholarly matching.
- Better Auth email/password authentication with OTP email verification.
- Onboarding survey flow with redirect guards.
- Admin panel for user analytics and quota request review.
- Weekly citation quota system with expansion requests.
- RMIT student bonus program for eligible domains (
rmit.edu.vn,rmit.edu.au).
- Svelte 5 + SvelteKit 2
- TypeScript
- Tailwind CSS 4 + shadcn-svelte + bits-ui
- Better Auth
- Drizzle ORM + Drizzle Kit
- Neon Postgres (
@neondatabase/serverless) - Resend (OTP email delivery)
- Semantic Scholar + OpenAI fallback for citation resolution
src/
routes/
+page.svelte # Landing
auth/ # Login/register + OTP verification
onboarding/ # Survey flow
dashboard/ # User workspace
dashboard/projects/[id]/ # Project citation workspace
admin/ # Admin analytics and moderation
lib/
components/ # UI and page components
server/
auth.ts # Better Auth config
onboarding.ts # Onboarding guard helpers
citations/ # Citation normalization + generation pipeline
db/ # Drizzle schema and DB client
docs/
backend.md # Backend architecture and route/action docs
npm installcp .env.example .envSet at least:
DATABASE_URLBETTER_AUTH_SECRETRESEND_API_KEYMODE(devby default)BETTER_AUTH_URLorORIGIN(required in production)SEMANTIC_SCHOLAR_API_KEY(recommended)OPENAI_API_KEY(required when Semantic Scholar cannot resolve all sources)
npm run auth:schema
npm run db:push -- --forceNotes:
- After changing Better Auth additional fields in
src/lib/server/auth.ts, run both commands again. npm run db:migrate/npm run db:generateare available if you prefer migration files.
npm run devnpm run devstart development servernpm run buildproduction buildnpm run previewpreview buildnpm run checkSvelte + TypeScript diagnosticsnpm run lintPrettier check + ESLintnpm run formatapply formattingnpm run auth:schemaregenerate Better Auth schema filenpm run db:pushpush schema to databasenpm run db:studioopen Drizzle Studio
- Session and user are loaded in
hooks.server.tsfrom Better Auth. - Onboarding is enforced globally for authenticated users until survey completion.
- Most mutations are SvelteKit form actions (
+page.server.ts), not REST endpoints. - Citation generation flow:
- normalize input and extract metadata
- prioritize Semantic Scholar resolution
- apply deterministic formatter paths (including news heuristics)
- fallback to OpenAI for unresolved sources
See docs/backend.md for full backend documentation.
- Ensure production
MODE=productionand setBETTER_AUTH_URL(orORIGIN). - Configure Postgres and email delivery before enabling real user signup.
- If citation generation is enabled in production, configure Semantic Scholar and OpenAI keys.
Internal project. Add a license section if this repository becomes public.