|
|
1 ay önce | |
|---|---|---|
| .vscode | 1 ay önce | |
| messages | 1 ay önce | |
| project.inlang | 1 ay önce | |
| src | 1 ay önce | |
| static | 1 ay önce | |
| .gitignore | 1 ay önce | |
| .npmrc | 1 ay önce | |
| AGENTS.md | 1 ay önce | |
| LICENSE.md | 1 ay önce | |
| README.md | 1 ay önce | |
| config.json.example | 1 ay önce | |
| jsconfig.json | 1 ay önce | |
| package.json | 1 ay önce | |
| pnpm-lock.yaml | 1 ay önce | |
| pnpm-workspace.yaml | 1 ay önce | |
| vite.config.js | 1 ay önce |
A modern SvelteKit application with Svelte 5 runes, Tailwind CSS, and Flowbite components.
Install dependencies:
pnpm install
Copy the example configuration to create your local config.json:
cp config.json.example config.json
This file contains settings for database and server configuration. See Configuration below for available options.
Start the dev server on http://localhost:3000:
npm run dev
# Auto-open in browser
npm run dev -- --open
Hot module reload enabled by default.
Create a production build:
npm run build
Preview the production build locally:
npm run preview
Production output goes to /build/ (configured for Node.js via @sveltejs/adapter-node).
src/routes/ — SvelteKit filesystem routessrc/lib/ — Reusable components and utilities (access via $lib alias)src/app.html — HTML shell (dark mode enabled via class="dark")@tailwindcss/vite + Forms/Typography plugins@sveltejs/adapter-node)All .svelte files use runes mode by default. Use:
$state() for reactive variables$derived for computed values$effect() for side effects{#snippet} for component snippets (e.g., icon slots)See Svelte 5 runes documentation.
app.html (remove class="dark" from <html> to disable)<style> blocks in .svelte filesThe project uses Paraglide JS for i18n with:
/en/ or /es/)getLocale(), setLocale(), and deLocalizeUrl() from $lib/paraglide/runtime.js$lib/paraglide/messages.jsAll routes are automatically localized. No manual language handling needed.
The config.json file (copied from config.json.example) controls server and database settings:
{
"database": {
"type": "sqlite3",
"sqlite3": {
"fileMustExist": false,
"filename": "app.db",
"readonly": false,
"timeout": 5000,
"performance": {
"foreignKeys": true,
"journalMode": "wal",
"synchronous": 1,
"tempStore": "memory"
}
}
},
"password": {
"algorithm": "argon2id",
"options": {
"memoryCost": 61440,
"timeCost": 3,
"parallelism": 1
}
}
}
database.type — Database backend (currently sqlite3)database.sqlite3.filename — Path to the SQLite database filedatabase.sqlite3.timeout — Query timeout in millisecondsdatabase.sqlite3.performance — Performance tuning options (WAL mode, foreign keys, etc.)password.algorithm — Password hashing algorithm (currently argon2id)password.options — Argon2id configuration (memory cost in KiB, time cost iterations, parallelism level)The database is automatically initialized on first creation with:
users table — Stores user accounts with email and password (hashed) fieldsadmin@delete.me and password deleteme (hashed with argon2id)Database initialization is idempotent and runs only once when the database file is first created. The admin user is seeded only if no users exist.
Passwords are hashed using Argon2id (configured in config.json). Crypto utilities are available in src/lib/crypto.js for hashing and verification.
The application uses the following exit codes for process termination:
| Code | Meaning | Trigger |
|---|---|---|
0 |
Success / Graceful shutdown | SIGTERM, SIGINT signals |
1 |
Runtime error | Uncaught exceptions or unhandled promise rejections |
2 |
Cleanup error | Error during graceful shutdown cleanup logic |
Exit codes are defined in src/hooks.server.js and are emitted when the process receives termination signals or encounters runtime errors.