Tech stack
The approved technologies for Mladi Pirati projects, and what each one is for.
Everyone uses the same small stack, so any developer can pick up any project. If you think a project needs something that isn't listed here, talk to Aiken before you build on it.
Language
TypeScript, always. No plain JavaScript: not in app code, scripts or new files. Where the tooling supports it, config files are TypeScript too (drizzle.config.ts, astro.config.ts, and so on).
- Enable
strictmode (the templates already do). - Don't use
any. If a type really is unknown, useunknownand narrow it. - Prefer inferred types and discriminated unions over type assertions (
as).
What to use for what
| Use case | Technology | Template |
|---|---|---|
| Static sites (landing pages, campaigns, blogs) | Astro | Astro template |
| Web apps (anything with logins, dashboards or dynamic data) | Next.js | Next.js template |
| Database | PostgreSQL + Drizzle ORM | Included in the Next.js template |
| Mobile apps | React Native + Expo | React Native template |
| Documentation | Fumadocs in Next.js | This site |
| Authentication | Keycloak + NextAuth, or NextAuth alone | See Authentication |
| File / object storage | Garage (S3-compatible) | See S3 storage |
Astro or Next.js?
- If the content is mostly static and there are no user accounts, use Astro.
- If there are logins, forms that write to a database, or per-user data, use Next.js.
Recommended libraries
These aren't strict requirements, but reach for them first so projects stay consistent:
| Need | Library |
|---|---|
| Validation (forms, API input, env vars) | Zod |
| Client-side data fetching | TanStack Query |
| Styling | Tailwind CSS |
| Dates | date-fns |