Commission Website
- Svelte 68.2%
- TypeScript 31.6%
- HTML 0.1%
- JavaScript 0.1%
| src | ||
| static/media/sketchsaturday | ||
| .env | ||
| .env.example | ||
| .gitignore | ||
| deploy.bat | ||
| dev-bot.db | ||
| dev-bot.db-shm | ||
| dev-bot.db-wal | ||
| dev-site.db | ||
| dev-site.db-shm | ||
| dev-site.db-wal | ||
| nvm | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| velte-kit .gitignore | ||
| vite.config.ts | ||
impforhire — current state
Infrastructure
- VPS: Hetzner
135.181.100.23, Ubuntu 24, Nginx, PM2 - Site:
/root/impforhire— SvelteKit 2 + Svelte 5, port 3001 - Bot:
/root/bot— Tabb Discord bot, port 4040 - DB:
/root/db/bot.db— shared SQLite WAL (commissions, media, users, discord_meta, queues) - DB:
/root/db/site.db— site sessions + users only - Media:
/root/media/— commission finals, WIPs, refs, legacy images - Git: Forgejo at
git.impforhire.com, deploy viagit push+ SSH hook - PM2:
impforhire(site),tabb(bot)
Nginx config
/etc/nginx/sites-enabled/impforhire (main site + media)
server {
listen 80;
server_name impforhire.com www.impforhire.com;
location /media/ {
alias /root/media/;
}
location / {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# SSL block added by certbot
/etc/nginx/sites-enabled/impforhire-images (bot assets)
server {
server_name images.impforhire.com;
location /commissions/legacy-media/ {
alias /root/media/commissions/legacy-media/;
}
location / {
proxy_pass http://127.0.0.1:4040/assets/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
# SSL block managed by certbot
}
/etc/nginx/sites-enabled/forgejo-ip (IP access + Forgejo)
server {
listen 80;
server_name 135.181.100.23;
location /git/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /media/ {
alias /root/media/;
}
location / {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
File permissions required
chmod o+x /root
chmod o+x /root/media/commissions/legacy-media
chmod o+x /root/media/commissions/legacy-media/imported_*/finals
# Files themselves are 644 (root:root) — readable by www-data
Env vars (/root/impforhire/.env)
BOT_API_SECRET=grimsby_has_big_horns
BOT_API_URL=https://tabb.impforhire.com
ASSET_BASE_URL=https://images.impforhire.com
BOT_MEDIA_PATH=/root/media
BOT_DB_PATH=/root/db/bot.db
SITE_DB_PATH=/root/db/site.db
SESSION_SECRET=...
NODE_ENV=production
PORT=3001
SITE_URL=https://impforhire.com
Media layout
/root/media/
commissions/
9/finals/9_final_v4.png ← real bot commissions (served via images.impforhire.com/commissions/...)
10/finals/...
legacy-media/
imported_223/finals/imported_223_final.png ← legacy imports (served via images.impforhire.com/commissions/legacy-media/...)
imported_77/finals/...
DB key conventions
discord_metakeyart_finalpath_<commission_id>→ absolute local path to final imagediscord_metakeyimport_old_<supabase_id>→ new commission ID (marks legacy as imported)commission_media.local_path→ absolute local path (mirrors art_finalpath_ for legacy rows)
Known issues / next steps
- Many bot test commissions are published and showing in gallery — need per-commission publish toggle
/admin/commissionsoverview page not yet built — needed for bulk publish management- DNS for
impforhire.comnot yet propagated to VPS IP (currently accessible via IP only) - Old
impforhire.comsite still live at old host until DNS cutover