Testing Guide
Quick Verification
API Endpoints
| Endpoint |
Method |
Purpose |
/health |
GET |
Server status |
/api/check/:name |
GET |
Name availability |
/api/deploy |
POST |
Start deployment |
/api/status/:id |
GET |
SSE progress stream |
/api/stack/:name |
DELETE |
Delete stack and cleanup |
Test Checklist
Backend
| Test |
Command |
Expected |
| Server starts |
bun run dev |
"starting on http://0.0.0.0:3000" |
| Health endpoint |
curl localhost:3000/health |
{"status":"healthy"...} |
| TypeScript |
bun run typecheck |
No errors |
| Dokploy connection |
Check /api/check/test-name |
Returns availability |
Frontend
| Test |
Action |
Expected |
| Page loads |
Open localhost:3000 |
Dark theme, centered content |
| Typewriter |
Wait 2s |
"Choose Your Stack Name" animates |
| Language switch |
Click 🇲🇦 |
Arabic text, RTL layout |
| Name validation |
Type "ab" |
Error: too short |
| Reserved name |
Type "admin" |
Error: reserved |
| Valid name |
Type "my-stack" |
"✓ Name is available!" |
Deployment Flow
| Step |
Indicator |
| Submit form |
Progress bar appears |
| SSE updates |
Log entries animate in |
| Success |
Typewriter: "Deployment Complete" |
| Error |
Typewriter: "Deployment Failed" |
Infrastructure
| Service |
URL |
Purpose |
| Dokploy |
https://app.flexinit.nl |
Container orchestration |
| Traefik |
144.76.116.169 |
SSL termination |
| Stacks |
*.ai.flexinit.nl |
Deployed AI assistants |
Full Deployment Test
Cleanup Commands
Common Issues
| Issue |
Solution |
| CSS not loading |
Check /style.css returns CSS, not HTML |
| 401 on Dokploy |
Regenerate API token in Dokploy dashboard |
| Typewriter not running |
Check browser console for JS errors |
| RTL not working |
Verify dir="rtl" on <html> element |
| Health check timeout |
Container startup can take 1-2 min, timeout is 3 min |
| SSL cert errors |
Health check treats SSL errors as "alive" during provisioning |
| SSE disconnects |
idleTimeout set to 255s (max), long deployments should complete |
Production Verification (2026-01-10)
Verified Working
| Component |
Status |
Notes |
| Portal Health |
✅ |
https://portal.ai.flexinit.nl/health returns healthy |
| Name Validation |
✅ |
/api/check/:name validates correctly |
| Frontend UI |
✅ |
3 languages (NL, AR, EN), RTL support, typewriter animation |
| Stack Deployment |
✅ |
Full flow: project → app → domain → deploy → health check |
| Stack Cleanup |
✅ |
DELETE /api/stack/:name removes all resources |
| SSL/HTTPS |
✅ |
Wildcard cert working for all *.ai.flexinit.nl |
Critical Configuration
Known Gotchas (Fixed)
- Registry URL format - Use
git.app.flexinit.nl, NOT https://git.app.flexinit.nl
- Username in image path - Must be
oussamadouhou, not odouhou
- Dokploy URL - Must use public URL for container-to-container communication
- Health check - Now uses Dokploy API status check (not HTTP fetch)
- Resource limits - Removed temporarily (Dokploy API format issues with CPU/memory values)
- Typewriter race condition - Fixed by tracking active instances and canceling previous
UI/UX Fixes (2026-01-10 v2)
| Issue |
Fix |
Status |
| Double letters in typewriter |
Track active instances, cancel before starting new |
✅ Verified |
| Flag emojis not showing |
Replaced with text labels (NL/AR/EN) |
✅ Verified |
| SSE disconnects during deployment |
Use Dokploy API status instead of HTTP health check |
✅ Verified |
| 'yourname' not translated |
Added translation key per language |
✅ Verified |
Health Check Change
The health check was changed from HTTP fetch (which failed from inside Docker) to Dokploy API status check:
Test Commands
Dokploy Direct Commands
Gitea Actions CI/CD Status
Check Workflow Status
The oh-my-opencode-free Docker image is built via Gitea Actions. To check CI status:
Web UI:
API (requires token):
API Response Fields
| Field |
Description |
status |
queued, in_progress, completed |
conclusion |
success, failure, cancelled, skipped (only when status=completed) |
head_sha |
Commit SHA that triggered the run |
run_number |
Sequential run number |
display_title |
Commit message or PR title |
Gitea API Authentication
From Gitea docs:
BWS Token Reference
| Key |
Purpose |
GITEA_API_TOKEN |
Gitea API access for workflow status |
DOKPLOY_API_TOKEN |
Dokploy deployment API (BWS ID: 6b3618fc-ba02-49bc-bdc8-b3c9004087bc) |