Post-release roadmap for Forail beyond v2026.03.0. Organized by priority tiers with estimated effort and dependencies.
Features that address the most common community pain points and provide immediate competitive advantage over AWX and alternatives.
Problem: AWX surveys only support static, hardcoded choices. Users cannot populate dropdown options from inventory, host facts, or external APIs. This is the single most upvoted feature request in the AWX community.
Solution:
- Add a
dynamic_choicesfield to survey question spec - Support three sources: Jinja2 template (from inventory/facts), API endpoint (external URL returning JSON array), and database query (hosts, groups, projects)
- Evaluate choices at launch time, not at template save time
- Cache results with configurable TTL to avoid slow launches
- Frontend: async dropdown that fetches choices when the launch dialog opens
Effort: 2-3 weeks
Files: awx/main/models/jobs.py, awx/api/views/job_templates.py,
awx/ui_next/src/components/LaunchDialog.tsx
Problem: AWX can only run jobs on schedules or manual triggers. There is no way to react to real-time events (monitoring alerts, Git pushes, cloud events). AAP 2.5+ has this as an exclusive feature.
Solution:
- Add an event router service that accepts inbound webhooks and evaluates them against user-defined rules (YAML rulebooks)
- Rule format:
source(webhook path/filter) +condition(Jinja2 expression)action(launch job template, workflow, or notification)
- Integrate with common sources: GitHub/GitLab webhooks, Alertmanager, PagerDuty, Datadog, CloudWatch, generic HTTP POST
- Store rules as a new model (
EventRule) with RBAC - Outbound webhooks: push job status/completion to external systems
Effort: 4-6 weeks Dependencies: None (builds on existing webhook receiver in AWX)
Problem: AWX runs playbooks but does not track what changed between runs. There is no way to detect configuration drift or prove compliance. Ascender's "Ledger" product fills this gap commercially.
Solution:
- Capture host facts (
ansible_facts) after each playbook run and store as snapshots in aHostFactSnapshotmodel - Compare snapshots between runs to detect drift (new packages, changed configs, modified users/groups, open ports)
- Dashboard widget showing drift summary across hosts
- Alert rules: notify when drift exceeds threshold or specific facts change
- Compliance report export (PDF/CSV) showing baseline vs current state
Effort: 3-4 weeks Dependencies: Fact caching must be enabled on job templates
Problem: Users need contextual help while using the platform. Error messages from failed jobs are often cryptic. New users struggle with RBAC, credentials, and inventory setup.
Solution: (detailed in docs/chat_plan.md)
- Ollama LLM (mistral:7b or llama3.1:8b) running as a Docker service
- ChromaDB vector store with indexed Forail/Ansible documentation
- Django API endpoint
/api/v2/assistant/with SSE streaming - Frontend chat panel integrated into Forail UI
- Context-aware: knows which page the user is on
- Error analysis: explain failed job output
Effort: 4 weeks Dependencies: GPU recommended (CPU fallback with smaller model)
Problem: AWX activity stream records changes but lacks detail for compliance auditing. No way to generate audit reports or track credential access.
Solution:
- Extend activity stream with: source IP, user agent, session ID
- Add credential access logging (who used which credential, when, on which host)
- Immutable audit log table (append-only, no updates or deletes)
- Audit report generator: filter by user/resource/date range, export PDF/CSV
- Retention policies: auto-archive old records to cold storage
- SIEM integration: structured JSON log export for Splunk/ELK/Datadog
Effort: 2-3 weeks Dependencies: None
Features that position Forail as a modern platform beyond basic AWX capabilities.
Problem: Non-technical users (helpdesk, operations, managers) cannot use AWX without training. They need a simplified interface to run pre-approved automation without understanding templates, inventories, or credentials.
Delivered:
ServiceCatalogItemmodel wraps an existing JobTemplate or WorkflowJobTemplate with portal metadata (icon, category, tags,requires_approval,approver_team).ServiceRequestlifecycle (pending_approval→approved/rejected→running→successful/failed/canceled) withsubmit/approve/rejectmethods and a post_save signal that mirrors terminal UnifiedJob status back onto the linked request.- Approver permission model: superuser,
approver_teammembership, or org admin fallback when no team is set. - REST API mounted at
/api/v2/service_catalog_items/and/api/v2/service_requests/(CRUD +launch_data,submit,approve,reject,pending_approvalsinbox). - Frontend: Service Portal (catalog grid), multi-step
ServiceRequestDialog(justification → workflow survey → per-node surveys → confirm), My Requests, Approvals inbox, Catalog Admin CRUD. - Reuses existing launch pipeline (
create_unified_job) and theSurveyQuestionInputextracted fromWorkflowLaunchDialog— no duplication. - Tests: 22 standalone backend lifecycle tests + 10 frontend type-shape tests.
- See
forail-backend/docs/17-self-service-portal.mdfor full architecture.
Problem: No governance framework to enforce rules like "production jobs must have approval", "credentials must rotate every 90 days", or "only signed playbooks can run on production inventories".
Delivered:
Policymodel storing Rego modules + metadata; pushed to aforail-opasidecar (OPA 0.69.0) on save via post_save signal.PolicyDecisionaudit row per evaluation hit; full launch context preserved as JSON.evaluator.evaluate_launch()hooked intoJobTemplateLaunch.post,WorkflowJobTemplateLaunch.post, andAdHocCommandList.create, strictly betweencreate_unified_jobandsignal_start.- Three-tier enforcement: global
OPA_ENABLEDkill switch + per-organizationpolicy_enforcement(none/warn/enforce) + per-policyenforcement(warn/enforce). Orgwarncaps any policy from blocking. All combinations covered by a unit-tested resolver. - Configurable fail mode:
OPA_FAIL_MODE=allow(default, fail-open with audit) ordeny(fail-closed) when the OPA sidecar is unreachable. - REST API at
/api/v2/policies/(CRUD + enable/disable + dry-run test endpoint) and/api/v2/policy_decisions/(audit log). - Frontend: Policies CRUD page with sync status badges, PolicyForm with Rego editor and dry-run panel, PolicyDecisions audit log with expandable context viewer. Compliance sidebar group extended with Policies and Policy Decisions entries.
forail-opasidecar added toforail-deploy/docker-compose.yml(imageopenpolicyagent/opa:0.69.0-rootless, healthcheck against/health).- 19 standalone backend tests + 6 frontend type-shape tests, 0 TS errors.
- See
forail-backend/docs/19-policy-as-code.mdfor the full architecture.
Problem: AWX supports LDAP, SAML, and social auth but lacks native OIDC and passwordless login. WebAuthn/passkeys are now the standard for phishing-resistant authentication.
Delivered:
- OIDC client wired through the existing
social_core.backends.open_id_connect.OpenIdConnectAuth(no new dependency — already vendored). Configuration via Settings → Generic OIDC. New settings: button label, scope override, organization map, team map. JIT user provisioning + org/team mapping reusesforail.sso.social_pipeline. - WebAuthn / FIDO2 via
py_webauthn==2.5.2:WebAuthnCredentialmodel + 5-minute challenge stores.- REST API at
/api/v2/webauthn/credentials/,register/{begin,complete}/,authenticate/{begin,complete}/. - Replay protection via monotonic sign-count guard.
- Origin / RP-ID derived from request — same image works on any host.
- Org-level MFA enforcement:
Organization.webauthn_required(none/admins/all) +WebAuthnMfaEnforcementMiddlewarethat flipssession.mfa_pendingwhen policy applies. - Frontend:
/me/securitycredential management page,/auth/mfapost-primary-auth interstitial, Sign in with security key and Sign in with OIDC buttons on the login page, TopBar dropdown "Security" entry. Browser side uses@simplewebauthn/browserv13. - 16 standalone backend tests (policy resolver, replay guard, TTL, base64url helpers) + 5 frontend type-shape tests.
- See
forail-backend/docs/18-oidc-webauthn.mdfor the full architecture.
Problem: Workflow job templates only support surveys at the workflow level. Users cannot prompt for different variables at individual job template nodes within a workflow.
Solution:
- Add
survey_spectoWorkflowJobTemplateNodemodel - At launch time, merge workflow-level and node-level survey prompts
- Frontend: multi-step launch dialog showing prompts grouped by node
- Support
ask_variables_on_launchper node (not just per workflow)
Effort: 2-3 weeks Dependencies: None
Problem: AWX provides basic metrics but no insight into automation value, trends, or efficiency. Managers cannot answer "how much time did automation save this month?"
Solution:
- New analytics models tracking: job duration trends, success/failure rates over time, most-used templates, busiest hosts, automation coverage
- Time savings calculator: estimated manual time vs automated time
- Dashboard with Recharts visualizations: job trends, host coverage map, template usage heatmap, failure analysis
- Scheduled email reports: weekly/monthly automation summary
- API:
/api/v2/forail_analytics/with date range filters
Effort: 3 weeks Dependencies: None (uses existing job data)
Long-term features for enterprise scale and ecosystem growth.
- Microkernel design: core handles jobs, scheduling, inventory; everything else is a plugin (credential backends, notification channels, inventory sources, SCM providers)
- Plugin SDK with documented hooks: pre-job, post-job, credential resolution, inventory sync, notification dispatch
- Plugin registry with install/update/remove via UI
- Sandboxed execution: plugins run in isolated containers
Effort: 8-12 weeks
Problem: Forail had Organizations and per-org RBAC, but running a single install for multiple customers required trusting RBAC to be airtight, manually provisioning every customer's org/admin/team, manually enforcing "fair use" (there were no quotas — one noisy tenant could hog all Celery workers), and manually skinning the UI per customer.
Delivered (v1 — soft multi-tenancy, no new compose service):
Organizationextended with 11 additive fields:is_tenant_root,tenant_max_concurrent_jobs,tenant_max_daily_launches,tenant_max_hosts,tenant_max_storage_mb,tenant_isolation_strict,tenant_logo_url,tenant_primary_color,tenant_secondary_color,tenant_custom_domain(indexed),tenant_contact_email. All default to safe values — existing orgs are untouched (zero-downtime migration0204_multi_tenancy).TenantUsage(OneToOne with Organization) — rolling counters for concurrent jobs, launches-today, hosts_count, storage_mb_used, with alaunches_today_window_startfor calendar-UTC day rollover.TenantQuotaEvent— one audit row per quota decision (allow or block), mirrors thePolicyDecisionshape; cachedorganization_nameso the row survives org delete.TenantIsolationEvent— v1 audit-only row for cross-tenant reads observed whentenant_isolation_strict=True(blocking deferred to v2).forail/main/tenancy/package: pure helpers (check_quota_value,is_window_expired,reset_daily_window,format_quota_message,normalize_branding_host,validate_hex_color),quota.pywithcheck_tenant_quota+on_job_finished,provisioning.pywith atomicprovision_tenant(Org + admin User + default Team + TenantUsage in one transaction),branding.pywithget_branding_for_host,usage.pywithrecalculate_tenant_usagedrift reconciliation,isolation.pymiddleware.- Launch hook inserted before Policy-as-Code and IaC Scanning in
JobTemplateLaunch.post,WorkflowJobTemplateLaunch.post, andAdHocCommandList.create. Blocked launches return HTTP 429 with the quota kind that tripped, inside theforail.launchOTel span (addsquota_blocked=<kind>attribute for trace filtering). - Job-finished signal decrements
concurrent_jobs_count; Celery beatrecalculate_tenant_usage_allruns everyTENANCY_QUOTA_RECALC_INTERVAL_Sseconds and also reconciles the concurrent counter against actual running UnifiedJob count. - Settings (System category):
TENANCY_ENABLED(global kill switch, default off),TENANCY_DEFAULT_MAX_CONCURRENT_JOBS,TENANCY_DEFAULT_MAX_DAILY_LAUNCHES,TENANCY_QUOTA_RECALC_INTERVAL_S(default 300s). - REST API:
/api/v2/tenants/(superuser CRUD + provision + recalculate),/api/v2/tenant_quota_events/(audit log), and/api/v2/branding/?host=<hostname>— PUBLIC (no auth classes) so the frontend can skin itself before login. Returns 404 on miss. - Frontend:
/tenants,/tenants/new,/tenants/:id,/tenants/:id/edit,/tenant_quota_eventspages with usage bars, branding preview, color pickers, quota inputs (empty = unlimited), danger-zone delete. NEW sidebar group Tenancy (Building2 + Activity icons) above Compliance. - Boot-time branding:
src/branding/applyBranding.tscalled fromsrc/main.tsxbefore React mounts. Fetches/api/v2/branding/?host=window.location.hostnamewith no credentials, sets CSS variables--forail-primary/--forail-secondaryon:root, swaps the favicon and document title, caches in localStorage for 5 min. Tailwind exposes the CSS vars ascolors.brand.primary/secondary. - No new compose service — tenancy piggybacks on the existing
forail-webandforail-taskcontainers and is gated byTENANCY_ENABLED. - Standalone tests in
tests_standalone/test_tenancy.pycover all pure helpers, QuotaResult aggregation, window rollover edge cases, branding host normalization, and provisioning payload validation. - See
forail-backend/docs/22-multi-tenancy.mdfor the full architecture.
Deferred to v2:
- Postgres row-level security policies (real DB-level isolation).
- Strict-mode enforcement (cross-tenant reads blocked, not just audited).
- Per-tenant API rate limiting at the middleware layer (token bucket).
- Per-tenant Celery queues (single shared queue + quota is the v1 fairness story).
- Custom-domain TLS provisioning (Let's Encrypt automation).
- Billing / metering hooks.
- Tenant-scoped LDAP/SAML/OIDC federation.
Effort: 6-8 weeks
Delivered:
- 9 CRDs spanning the full Forail resource model:
Inventory,Credential,JobTemplate,Schedule,Project,Organization,Team,Workflow,ForailInstance(inforail-operator/api/v1alpha1/). - Reconciliation controllers for each CRD with finalizer-driven cleanup, 60-second drift reconcile, and Secret watch for instant Credential rotation.
- Helm chart (
forail-operator/helm/) with full RBAC + all 9 CRD manifests; chart bumped to 1.0.0. - OLM bundle:
config/manifests/bases/forail-operator.clusterserviceversion.yamlwithalm-examplesfor all 9 CRDs,spec.icon,bundle.Dockerfile, Makefile targets (bundle,bundle-build,bundle-validate,catalog-build).operator-sdk bundle validateclean. - Multi-cluster control plane via
ForailInstanceCR +forailapi.ClientPool(per-CR routing to different Forail backends by name + tokenSecretRef; generation-gated cache invalidation). - Declarative Workflow DAG:
spec.nodes[]keyed byidentifier, three edge types (successNodes,failureNodes,alwaysNodes) reconciled against/workflow_job_template_nodes/. - e2e tested live against 3m+4w k3s 1.30 cluster
(see
forail-dev-cluster/for the topology).
Effort spent: 5 days (2026-05-17 → 2026-05-21).
Problem: Policy-as-Code (Tier 2.2) gates launches on metadata (who,
what, where) but never inspects the playbook body. Nothing prevents a
playbook from disabling SELinux, embedding a secret, using shell:
with unquoted user input, pulling an unpinned role, or importing a
Python package with a known CVE.
Delivered:
Scannermodel — one row per configured tool (ansible-lint, checkov, pip-audit) with severity threshold + enforcement +applies_to.ScanResultaudit row per scanner execution (status ok / warn / blocked / error / timeout, duration, finding_count, highest severity, truncated raw output, cached scanner_name so rows survive delete).ScanFindingchild row per finding at or above threshold (rule_id, severity, file_path, line, message).forail/main/scanning/runner.py— subprocess runner with per-scanner timeout, project checkout path + playbook resolution, output parsing, ScanResult + ScanFinding persistence, aggregateScanRunResult.- Tool adapters in
forail/main/scanning/tools/— one module per CLI (ansible-lint -f json --strict,checkov -o json,pip-audit --format json) with severity normalization to info/low/medium/ high/critical. - Pure helpers:
severity_at_or_above,effective_enforcement,aggregate_status,fail_mode_decision— unit-tested standalone. - Hook inserted after the Policy-as-Code hook in
JobTemplateLaunch.post,WorkflowJobTemplateLaunch.post, andAdHocCommandList.create. Blocked launches return 403 withreasons; warn launches append a one-liner tojob_explanation. - Settings:
SCANNER_ENABLED(master switch),SCANNER_TIMEOUT_S(per-scanner subprocess timeout),SCANNER_FAIL_MODE(allow / deny on timeout/crash),SCANNER_RAW_OUTPUT_MAX— all in the Security category. - REST API at
/api/v2/scanners/(CRUD + enable/disable) and/api/v2/scan_results/(audit log with embedded findings). - Frontend: Scanners CRUD page with tool badge, severity threshold, enforcement badge, last-run status, enable toggle; ScannerForm with tool dropdown, severity selector, JSON config editor, applies_to checkboxes; ScanResults audit table with status filter and finding drawer. Compliance sidebar group extended with Scanners and Scan Results entries.
- Scanner CLIs bundled into the
forail-backendimage (installed into/var/lib/awx/venv/awx), no new compose service — the existingforail_projectsvolume is already mounted on every forail container. - Standalone backend tests for helpers, adapter parsers, applies_to matching, and fail-mode resolver.
- See
forail-backend/docs/20-iac-scanning.mdfor the full architecture.
Deferred to v2:
- Collection / role provenance verification (sigstore / checksums) — needs a separate signing infrastructure conversation.
- Live CVE feed for non-Python EE packages (system OS packages).
- In-line annotations on the playbook source viewer.
- Custom rule authoring UI.
Effort: 3-4 weeks
Detailed plan in docs/mobile_plan.md:
- Deployment approval with biometric verification
- Real-time server monitoring (containers, CPU, RAM, disk)
- Live log streaming
- Push notification alerts
- AI assistant chat
Effort: 7 weeks
- OpenTelemetry export for all automation runs (traces, metrics)
- Distributed tracing across multi-node receptor mesh
- Grafana dashboard templates for Forail metrics
- Closed-loop: observability alerts feed into EDA rules
Effort: 3-4 weeks
| # | Feature | Impact | Effort | Priority |
|---|---|---|---|---|
| 1.1 | Dynamic Surveys | High | 2-3w | DONE |
| 1.2 | Event-Driven Automation | High | 4-6w | DONE |
| 1.3 | Drift Detection | High | 3-4w | DONE |
| 1.4 | AI Assistant (Ollama) | High | 4w | DONE |
| 1.5 | Audit Trail | Medium | 2-3w | DONE |
| 2.1 | Self-Service Portal | High | 3-4w | DONE |
| 2.2 | Policy-as-Code (OPA) | Medium | 4-5w | DONE |
| 2.3 | OIDC + WebAuthn | Medium | 3-4w | DONE |
| 2.4 | Workflow Node Surveys | Medium | 2-3w | DONE |
| 2.5 | Analytics Dashboard | Medium | 3w | DONE |
| 3.1 | Plugin Architecture | High | 8-12w | P2 |
| 3.2 | Multi-Tenancy | High | 6-8w | DONE |
| 3.3 | Kubernetes Operator | Medium | 5d (spent) | DONE (v2026.05.0) |
| 3.4 | IaC Scanning | Medium | 3-4w | DONE |
| 3.5 | Mobile App | Medium | 7w | P2 |
| 3.6 | Observability (OTel) | Medium | 3-4w | DONE |
Provision Kubernetes test instance for Forail Platform— DONE (2026-05-13..16).forail-dev-clusterswitched from 2-master + 2-worker kubeadm to 3-master + 4-worker k3s 1.30.4 Vagrant cluster (192.168.56.30-36, 14 vCPU / 28 GB total) with embedded etcd HA, bundled Traefik / local-path / klipper-lb / metrics-server, and--flannel-iface=eth1fix for the long-standing VirtualBox cross-node VXLAN issue. This unblocked Tier 3.3 (Kubernetes Operator v1.0.0) and lets us validate 3.6 manifest stubs end-to-end.
| Feature | Forail | AWX | AAP 2.5+ | Ascender | Semaphore |
|---|---|---|---|---|---|
| Docker Compose deploy | Yes | No | No | Yes | Yes |
| Dynamic surveys | Yes | No | No | No | No |
| Event-driven (EDA) | Yes | No | Yes | No | No |
| Drift detection | Yes | No | No | Yes | No |
| AI assistant | Yes | No | Yes | No | No |
| Self-service portal | Yes | No | Yes | No | No |
| Policy-as-Code | Yes | No | Planned | No | No |
| OIDC native | Yes | Partial | Yes | Partial | No |
| WebAuthn/passkeys | Yes | No | No | No | No |
| Modern UI (React 18) | Yes | Legacy | Yes | Legacy | Yes |
| Multi-tenancy | Yes | No | Yes | No | No |
| K8s operator | Yes (9 CRDs, multi-cluster) | Yes | Yes | Yes | No |
| Open source | Yes | Yes | No | Partial | Yes |
- AWX GitHub Issues — feature requests
- Ansible Forum — Is there a future for AWX?
- Ansible Forum — Programmable survey feature
- Ascender Ledger — CIQ
- AAP 2.5 Release Notes — Red Hat
- What's New in AAP 2.6 — Red Hat
- Event-Driven Ansible — Red Hat
- Terraform Cloud Alternatives 2026 — env0
- GitOps 2026 Complete Guide — Calmops
- AI and AIOps in 2026 — Refonte Learning
- Policy-as-Code Tools 2026 — Spacelift
- OpenTelemetry in 2026 — The New Stack
- Multi-Tenant Architecture 2026 — QABash
- Authentication Trends 2026 — C# Corner
- IaC Security 2026 — Fidelis
- Semaphore vs AWX
Problem: Novi developeri koji pristupe projektu nemaju pregled arhitekture, ne znaju šta koji fajl radi, niti kako su komponente povezane. Bez kvalitetne dokumentacije, onboarding traje predugo i razvoj se usporava.
Cilj: Napraviti ultra detaljnu wiki dokumentaciju koja objašnjava svaki fajl i modul u projektu, tako da budući kolege mogu samostalno da se snadju i razvijaju platformu.
Sadržaj wiki dokumentacije:
- Architecture Overview — dijagram sistema (backend, frontend, task engine, Redis, PostgreSQL, Receptor), kako komponente komuniciraju
- Backend (Django) — objašnjenje svakog modula:
forail/main/models/— svaki model, relacije, migracijeforail/api/views/— svaki API endpoint, šta radi, koji serializer koristiforail/api/serializers/— logika validacije i transformacije podatakaforail/main/tasks/— Celery taskovi, job runner, callback pipelineforail/main/signals/— Django signali i side-effectiforail/conf/— settings, konfiguracija, environment varijable
- Frontend (React/TypeScript) — struktura UI koda:
- Svaka stranica i komponenta
- Routing, state management, API pozivi
- Stilizacija i UI framework
- Task Engine — kako se jobovi pokreću, lifecycle joba od launcha do završetka, receptor mesh, izolacija izvršavanja
- Authentication & RBAC — autentifikacija, permisije, organizacije, timovi, kako RBAC radi od API-ja do baze
- Database Schema — ER dijagram, ključne tabele, relacije
- Docker & Deployment — objašnjenje svakog kontejnera, docker-compose konfiguracija, environment varijable, volumeni
- CI/CD Pipeline —
.github/workflows/ci.yml, build proces, testovi - Testing — kako pokrenuti testove, struktura testova, šta koji test pokriva
- Contributing Guide — coding standardi, git workflow, PR proces, commit konvencije
Format: GitHub Wiki (u okviru forail-platform/forail-platform repozitorijuma)
ili docs/wiki/ direktorijum u samom projektu.
Effort: 3-4 weeks Dependencies: None — može se raditi paralelno sa razvojem feature-a
Problem: Forail trenutno radi isključivo na Linux-u (Ubuntu 24.04+) i u Docker kontejnerima. FreeBSD korisnici, koji često koriste Ansible za upravljanje serverima i mrežnom opremom, nemaju mogućnost da pokrenu Forail nativno na svom sistemu.
Cilj: Omogućiti pokretanje Forail platforme direktno na FreeBSD hostu i unutar FreeBSD jail-a kao alternativu Docker deployment-u.
Potrebne izmene:
- Dependency kompatibilnost — proveriti i prilagoditi sve Python zavisnosti za FreeBSD (posebno: psycopg2, uwsgi/gunicorn, receptor, channels/daphne)
- Konfiguracija servisa — rc.d skripte za pokretanje Forail komponenti (web, task engine, daphne/websocket, beat scheduler)
- PostgreSQL & Redis — dokumentovati instalaciju iz portova/pkg-a, konfiguracija za Forail
- Jail deployment — jail konfiguracija sa izolovanim Forail okruženjem, networking (VNET ili alias IP), storage (ZFS dataset per jail)
- Port/package — kreirati FreeBSD port (
sysutils/forail-platform) za jednostavnu instalaciju putempkg install - Receptor mesh — proveriti da receptor radi na FreeBSD-u, prilagoditi ako koristi Linux-specific sistemske pozive
- Testiranje — pokrenuti test suite na FreeBSD 14.x, ispraviti sve platform-specifične probleme (putanje, signali, korisnici/grupe)
- Dokumentacija — instalacioni vodič za FreeBSD host i jail deployment
Effort: 4-6 weeks Dependencies: FreeBSD 14.x test okruženje, Python 3.12+ iz portova