AimTrack is een moderne, self-hosted schietlog voor sportschutters. Registreer sessies (met wapens/afstanden), voeg bijlagen toe, krijg AI-reflecties en wapen-trends, stel vragen aan een AI-coach en genereer CSV/PDF-exports voor o.a. WM-4-achtige aanvragen. Gebouwd met Laravel 12, Filament 4 en Livewire 3.
- Sessies: datum, baan/vereniging, locatie, tijden, notities, attachments en meerdere wapen × afstand entries.
- Reflectie: handmatige reflectie + AI-reflectie (samenvatting, went_well, needs_improvement, next_focus).
- Wapenbeheer: wapens met type/kaliber/serienummer/opslag; inzicht in gebruik per sessie.
- AI-coach: vrije vragen op basis van eigen sessies/wapens.
- Export: CSV/PDF per periode + wapenselectie met NL-disclaimer.
- Infra: Docker Compose (nginx, php-fpm, db, queue) en queue-jobs voor AI-taken.
- PHP 8.4/8.5, Laravel 12
- Filament 4 + Livewire 3
- Database: PostgreSQL (default) of MySQL
- Queue: database driver (queue-worker container)
- Kopieer
.env.local.examplenaar.env.local(niet committen) en vul waarden in.UID/GID: gebruikid -u/id -gbinnen WSL om permissies correct te houden. Defaults 1000 werken voor de meeste installaties.COMPOSE_PROJECT_NAME=aimtrack_devvoorkomt containernaam-conflicten.
- Start stack:
docker compose -f docker/compose.dev.yml --env-file .env.local up -d. - Installeer dependencies:
docker compose -f docker/compose.dev.yml --env-file .env.local exec app composer install. - Genereer key:
docker compose -f docker/compose.dev.yml --env-file .env.local exec app php artisan key:generate. - Migreer (en seed):
docker compose -f docker/compose.dev.yml --env-file .env.local exec app php artisan migrate --seed. - Stop stack:
docker compose -f docker/compose.dev.yml --env-file .env.local down(voeg-vtoe om volumes op te ruimen). - Open
http://localhost:8080vanuit Windows of WSL-browser en log in (standaard Laravel-auth). Gebruik Filament om sessies/wapens te beheren.
- Zet
AI_DRIVER,AI_MODEL,OPENAI_API_KEYenOPENAI_BASE_URL(of andere provider variabelen) in.env. - AI-calls verlopen via queue-jobs (
GenerateSessionReflectionJob,GenerateWeaponInsightJob). Zorg dat dequeuecontainer draait. - Prompts bevatten NL-disclaimers; AI-output is adviserend en vervangt geen veiligheidsregels of instructeurs.
Gebruik de Filament Export-pagina om CSV of PDF te downloaden. Periode is verplicht; wapenselectie optioneel. Download bevat een disclaimer dat de gebruiker zelf verantwoordelijk blijft voor actuele WM-4-eisen.
- Techniek:
docs/architecture.md,docs/ai.md,docs/export.md,docs/infra.md,docs/operations.md,docs/security.md - Gebruiker:
docs/user/quickstart.md,docs/user/sessions.md,docs/user/weapons.md,docs/user/export.md,docs/user/ai-coach.md - AI Agents:
docs/ai-agents.md- Automated development with AI agents - Overige plannen:
docs/PLAN.md,docs/BACKUPS.md,docs/PROD_HARDENING.md
- Meld kwetsbaarheden via security@aimrack.nl met impact, reproduceerbare stappen en relevante logs.
- We bevestigen ontvangst binnen 2 werkdagen vanaf hetzelfde adres.
- Versleutel gevoelige details (PGP op aanvraag) en dien geen publiek issue in tot het probleem is opgelost.
- Zie
SECURITY.mdvoor het volledige disclosure-proces en richtlijnen voor onderzoekers.
- Lint:
composer lint(Laravel Pint). - Tests:
composer test(Pest/phpunit). - Houd NL-labels aan in Filament en gebruik queue voor AI-taken.
AimTrack supports automated development via AI agents:
- Gebruik
@claudein issues om automatisch pull requests te laten genereren - Agent analyseert de issue, implementeert de wijziging en creeërt een PR
- Werkt volgens projectconventies en voegt automatisch tests toe
- Zie
docs/ai-agents.mdvoor gedetailleerde instructies
Voorbeeld:
## Add Session Export Feature
@claude please add a CSV export feature for shooting sessions...- Creëer geïsoleerde ontwikkel-omgevingen:
./scripts/clone-for-agent.sh agent-name - Elke agent heeft eigen Docker containers en git workspace
- Ideaal voor testing en development door AI agents
- Zie
docs/ai-agents.mdvoor setup instructies
- Vereisten: Windows 11, WSL2 (Ubuntu 22.04 aanbevolen), Docker Desktop met WSL-integratie, Node/npm alleen wanneer je Vite-assets bouwt.
.env.local.examplebevat alle aanbevolen variabelen voor lokaal gebruik, inclusiefUID,GIDenCOMPOSE_PROJECT_NAME. Kopieer naar.env.localen pas waar nodig aan.- Gebruik consistent
--env-file .env.localzodat UID/GID en projectnaam ook gelden voordocker compose exec. - Queue-worker draait als aparte service
queue; Mailpit luistert ophttp://localhost:8025(UI) ensmtp://localhost:1025. - Xdebug toevoegen? Plaats een ini-bestand in
docker/php/conf.den herstart deapp-container.
- Container name conflict:
- Oorzaak: oude containers bestaan nog of hebben een andere projectnaam.
- Fix:
docker compose -f docker/compose.dev.yml --env-file .env.local down --remove-orphans && docker container prune. Zet desnoodsCOMPOSE_PROJECT_NAMEop een uniekere waarde voor parallelle projecten.
- UID/GID warnings / permissieproblemen:
- Controleer
UIDenGIDin.env.local(gebruikid -u,id -g). - Run
sudo chown -R $(id -u):$(id -g) storage bootstrap/cachebinnen WSL als bestanden root-eigenaar zijn geworden.
- Controleer
- Poort al in gebruik (8080/8025/1025/5432):
netstat -tlnp | grep 8080binnen WSL om conflicterende processen te vinden. Pas poortmapping aan in.env.localendocker/compose.dev.ymlindien nodig.
- Clean rebuild (na grote dependency updates):
docker compose -f docker/compose.dev.yml --env-file .env.local down -vdocker compose -f docker/compose.dev.yml --env-file .env.local build --no-cachedocker compose -f docker/compose.dev.yml --env-file .env.local up -d
- Branch:
staging→ workflow.github/workflows/deploy-staging.yml. - GitHub Environment: staging met secrets:
SSH_HOST(WireGuard IP),SSH_USER,SSH_PORT(optioneel),SSH_KEY(PEM),DEPLOY_PATHAPP_URL,ENV_FILE_B64(base64 van.env),GHCR_USERNAME,GHCR_TOKEN,WG_CONFIG
- Flow: build & push image naar
ghcr.io/<owner>/aimtrackmet tags<short_sha>+staging-latest, installeer/start WireGuard in de workflow (config viaWG_CONFIG), rsyncdocker/+scripts/naar de Pi,remote_deploy.shdraaitdocker compose -f docker/compose.staging.yml pull/up, optioneel migrations en healthcheck (/health). Tunnel wordt in een cleanup-stap weer afgesloten. - Networking:
staging.aimtrack.nlverwijst naar het publieke IP van de Pi; forward extern poort 8080 (of gewenste poort) naar de hostWEB_PORT(default 8080). TLS is optioneel voor staging; verkeer loopt via VPN/forwarding. - Concurrency: één staging deploy tegelijk; tag van de laatste succesvolle deploy wordt lokaal opgeslagen voor rollback.
- Branch:
main→ workflow.github/workflows/deploy-production.yml(vereist succesvolle CI-run). - GitHub Environment: production met dezelfde secret-namen als staging (andere waarden, inclusief
WG_CONFIG). - Tags:
<short_sha>+prod-latest. - Compose file:
docker/compose.prod.yml(image uit GHCR, volumes voor code/storage/bootstrap cache). - Deploy stap gebruikt dezelfde scripts als staging; healthcheck via
APP_URL/health. Publiek verkeer komt binnen op extern poort 18080 → forwarded naar webcontainer (inclusief HTTPS offload volgens hostconfig).
- Maak user
deploy(of vergelijkbaar), voeg toe aandocker-group en zetPermitRootLogin no, key-only auth in~deploy/.ssh/authorized_keys. - Installeer Docker Engine + Compose plugin. Controleer dat
docker compose versionwerkt voor de deploy user. - Bereid
DEPLOY_PATH(bijv./opt/aimtrack) en zorg voor schrijfrechten voordeploy. - Netwerk: als de Pi alleen op LAN bereikbaar is, gebruik een self-hosted runner met labels
self-hosted,linux(en evt.arm64), of zorg voor VPN/Tailscale zodat GitHub-hosted runners via SSH kunnen verbinden. - SSH firewall open voor GitHub runner of LAN-runner;
ssh-keyscanwordt in workflows gebruikt voor known_hosts.
- Secrets per Environment in GitHub:
SSH_HOST,SSH_USER,SSH_KEY,DEPLOY_PATH,APP_URL,GHCR_USERNAME,GHCR_TOKEN,WG_CONFIG, optioneelSSH_PORT,ENV_FILE_B64. - Raspberry Pi: deploy user + docker group, Docker/Compose geïnstalleerd,
DEPLOY_PATHaangemaakt. - Runner-keuze: GitHub-hosted (als host publiek bereikbaar) of self-hosted op het LAN/VPN.
-
.env.stagingen.env.productionklaar op de server (of base64 in secrets). - DNS/hostnames naar staging/production URL ingesteld; poorten afgestemd (
WEB_PORTin.env, extern 8080 voor staging, 18080/443 voor productie).
MIT – zie LICENSE.