Skip to main content
Private preview. fremforge is in private preview — invited customers only. Content is still subject to change. Request access →
Security features at a glance

Security features at a glance

Everything fremforge ships, in one scannable table. Each row links into the dedicated page for configuration, override flow, and the underlying tool’s documentation.

fremforge is deliberately transparent about the OSS tooling underneath every control: customers under BSI C5, ISO 27001, BaFin, or ENISA-regulated review need the tool-level audit trail, and we’d rather you can grep our source than reverse-engineer a black box. The differentiation is the integration (hooks, RBAC, audit chain, EU residency, no Microsoft, no AWS) — not the scanner.

Code-push controls

ControlWhat it doesToolConfigurable per tenant
Push protectionPre-receive secret-scan; rejects commits containing credentials before they enter git historyGitleaks v8 (120+ patterns)Override rules + per-pattern bypass
Branch protectionPer-branch rules: required reviewers, status checks, signed-commit requirement, force-push blocksForgejo nativeYes (per branch)
Two-factor authTOTP + WebAuthn for every user account. Enforceable per-orgForgejo native + custom enforcement hooksYes (org-wide enforce, per-user opt-in)
OIDC MFA verificationCryptographically verify your IdP asserted MFA on every sign-in via the OIDC amr claim (RFC 8176). Replaces the legacy operator-attested “trust IdP MFA” checkbox — the token says ["pwd","mfa"] or it’s not MFACustom claim-check middlewarePer-tenant required-amr policy
SSO break-glassWhen your IdP is unavailable, misconfigured, or the SSO connection is broken, named org owners can recover access via a separately-managed break-glass credential path. Audit-loggedCustom (fremforge-written)Per-tenant named owners
Keyless commit signing (sigstore / gitsign)OIDC-bound signing — your IdP identity (Entra, Okta, Google Workspace, Authentik) signs the commit via a 10-minute Fulcio cert. Forgejo renders Verified by sigstore: <email> via <IdP>. Root CA in T Cloud DEW KMS (FIPS 140-2 Level 3 HSM, Germany). Fulcio at sign.frem.sh, TSA at tsa.frem.sh. Deliberately no Rekor / transparency log — TSA-anchored timestamping only, keeps signatures off any third-party logSelf-hosted Fulcio v1.8.5 + TSA on T Cloud eu-de, customer-side gitsignOrg admin → Allowed OIDC issuers + strictness level
Commit signing — SSH keySign commits with the same SSH key Forgejo uses for push. “Verified” badge appears natively in the web UI. Coexists with keyless; org admin sets strictnessOpenSSH + Forgejo’s allowedSignersFilePer-user enable
Commit signing — GPGStandard git commit.gpgsign flow. Upload public key at user settings, Forgejo verifies + renders the “Verified” badgeGnuPG + Forgejo nativePer-user enable

Code-quality + vulnerability scanning

The following controls ship as workflow templates auto-scaffolded into every new repo on creation (Forgejo repository.created event → workflow-installer service). No customer action required — push code and the scanners run on every PR. Existing repos can backfill via Org admin → Repos → Install fremforge defaults.

ControlWhat it doesToolConfigurable
SASTStatic analysis on every PR via the scaffolded sast-opengrep.yaml workflow. Detects injection, XSS, hardcoded secrets, dangerous APIs across 30+ languagesOpenGrep 1.21 (FOSS Semgrep successor)Custom rules URL
Dependency scanning (OSV)Dependency CVE/GHSA scan on every PR via the scaffolded dep-scan-osv.yaml workflow. Surfaces fixable CVEs with the suggested upgradeosv-scannerSeverity threshold
Container image scanningThe scaffolded image-scan-trivy.yaml workflow runs trivy image (Trivy is baked into the runner image — no install step) and POSTs results back to fremforge. Findings surface at Org admin → Code security → Container images, attached to the image + commit. Merge-block policy on unfixed high-severity is opt-inTrivySeverity threshold + ignore-policy + merge-block toggle
OpenSSF ScorecardWeekly scorecard run on every repo. Surfaces best-practice gaps (branch protection, MFA enforcement, pinned dependencies, code review coverage)scorecardSchedule + stale-repo skip
Malware scanEvery push scanned for known-bad signatures + LFS objects scanned on uploadClamAV + SaneSecurity feedsOverride on known-FP signatures
Workflow security gatePre-receive hook (04-workflow-security) parses every changed workflow YAML and rejects pushes that introduce: docker:// references to non-allowlisted registries (must be swr.eu-de.otc.t-systems.com/fremforge-prd/ by default), dangerous pull_request_target + script injection patterns, unpinned uses: references to non-mirrored orgsCustom rules (fremforge-written)Per-tenant docker-URI allowlist override
IP allowlistOptional per-tenant push-time IP allowlist enforced by the 05-ip-allowlist pre-receive hook. Pushes from CIDRs outside the allowlist are rejected; admin-tab override availableCustom rules (fremforge-written)Per-tenant CIDR list

Supply-chain provenance

ControlWhat it doesToolConfigurable
SBOMsCycloneDX 1.5 + SPDX 2.3 SBOM generated on every release-tag push (v* semver / calver tags) via the auto-scaffolded sbom-syft.yaml workflow. Results attached to the artifact + queryable at Org admin → Code security → SBOMsSyftCustomer-customisable
SLSA provenanceSLSA Level 2 provenance generated for every release via the auto-scaffolded slsa-provenance.yaml workflow. buildType=https://frem.sh/buildtypes/forgejo-actions/v1. Signed with cosign against the local Fulcio CA. Verifiable with the standard slsa-verifier binary against fremforge’s published trust root. L3 hardened-builder posture is in scope for a future iterationCustom builder (fremforge-supplied workflow) + cosign + Fulcio
Cosign image signing + verificationThe auto-scaffolded cosign-verify.yaml workflow walks the repo, finds every digest-pinned image, runs cosign verify against the local Fulcio CA (sign.frem.sh), reports results at Org admin → Code security → Container images. Customer CI signs with its own OIDC identity — no long-lived signing keyscosign + self-hosted FulcioCustomer-customisable
Digest pinningEvery FROM in customer Dockerfiles can be auto-pinned to digests via the sha-pin-scan workflow; runs daily and opens PRs when upstream tags moveCustomEnable per repo
Action mirroruses: actions/checkout@v4 resolves to frem.sh/actions/checkout — Forgejo native pull-mirror of upstream with 8-hour sync. No build-time github.com fetch on the customer’s critical path. Mirrored orgs include actions, docker, pnpm, aws-actions, azure, google-github-actions, peter-evans, softprops, sonarsource, step-security, dornyForgejo native pull-mirror + Forgejo [actions] DEFAULT_ACTIONS_URL=https://frem.sh(Operator-managed; transparent to customers)
Marketplace compatibility surfaceThe top-20 most-used GitHub Marketplace actions verified to work unmodified on fremforge — GITHUB_TOKEN, GITHUB_SHA, GITHUB_REF, GITHUB_API_URL etc all populated identicallyForgejo Actions runtime
Hosted RenovateA managed Renovate bot that opens dependency-bump PRs for every customer repo on a 15-minute schedule. Identifies stale deps, action versions, container base images. Skips repos opted out via .renovaterc.jsonRenovate + custom orchestration cronPer-repo enable/disable

Runtime isolation (hosted CI runners)

ControlWhat it doesToolConfigurable
Hosted runner sandboxOne job = one dedicated VM node = one kernel. The runner-controller spawns a fresh CCE Turbo VM node per queued job, places exactly one runner pod on it (podAntiAffinity + dedicated taint), then deletes the node on completion. No two jobs — same tenant or cross-tenant — ever share a kernel. Pods carry per-pod VPC ENI + Security Group (network isolation), seccompProfile: RuntimeDefault, no kube SA token. The reaper backstop kills orphan nodes whose pod never started or never finished. Same model as GitHub-hosted and GitLab-hosted runnersT Cloud CCE Turbo + Yangtse CNI + forgejo-runner (act_runner v6.2.1) + fremforge runner-controller with CCE node:delete IAMLimitRange (CPU/RAM per pod), per-tenant concurrency cap
Per-tenant concurrent cap30 concurrent jobs per tenant (matches GitHub Pro). Higher caps for paid tiersSpawner-level enforcementPer-tenant override
Runner-minute poolseat_cap × 1000 min/month. Overage-enabled tenants keep running; others get refused dispatch with reason runner_minute_capSpawner pre-dispatch check vs metering_events aggregaterunner_minutes_cap override
Egress proxyCustomer workflows reach the public internet through outbound-proxy-runners (SSRF-only deny, CGNAT-permissive — matches GitHub-hosted behaviour)Custom proxy (fremforge-written, Hono-based)
Job wall-clock60-min hard ceiling per job (activeDeadlineSeconds=3600). Stale-pod sweeper kills anything older than 90 minCron runner-stale-sweep + spawnerStep-level timeout-minutes

Secrets + access control

ControlWhat it doesToolConfigurable
Deploy secretsPer-environment encrypted secrets. AES-256-GCM at rest with a MASTER_ENCRYPTION_KEY held in DEW KMS. Decrypted only inside the runner pod that needs them. Key rotation supports a two-key window (current + previous) for in-place rotationCustom (Node crypto) + per-env scoping + DEW KMSPer env / per repo / per org
RBAC + per-tenant scopingForgejo’s native RBAC + fremforge’s tenant-scoping layer; all platform API endpoints enforce tenant_id from the JWT, no cross-tenant data leaks. Org admin → Members → RolesForgejo + fremforge api middlewarePer-team granularity
OIDC single sign-onPreferred IdP path. Connect Okta, Entra, Google Workspace, Authentik, Keycloak, Auth0 — any OpenID Connect provider — for inbound federation. Domain verification, just-in-time user provisioning, group → team mapping. Configured at Org admin → SSO → Auth sourcesForgejo native OIDC auth-sourcePer-tenant IdP config
SAML 2.0 single sign-onFor IdPs without OIDC support (ADFS, legacy PingFederate, some on-prem SAML stacks). Same domain-verify + auth-source registration flow as OIDCForgejo native SAML auth-sourcePer-tenant IdP config
SCIM 2.0 user provisioningPush users from your IdP into your fremforge org via SCIM 2.0. Per-tenant bearer-token auth, dual-token rotation window, idempotent CRUD on Forgejo users. Works with any SCIM-compliant IdPCustom api endpoints under /<slug>/scim/v2/*Per-tenant SCIM token
SSH CASSH access to git uses a CA-signed certificate, not raw key fingerprints. Per-user cert with TTL; revocable via the org admin UIOpenSSH CA + fremforge-managed cert issuanceTTL + per-user revoke
Authentication policyPer-org bundle of enforcement toggles: hardware-backed keys (WebAuthn-only, no TOTP), max PAT lifetime (cap below the 90-day platform default), signed-commits required (block unsigned pushes), SSH disabled (HTTPS-only), 2FA required, SSO-only sign-in (block local Forgejo username/password). Mirrors the GHEC enterprise-policy surface. Each toggle audit-emits on changeForgejo carried patches + fremforge enforcement hooksPer-tenant policy bundle
Email-domain allowlistPer-org allowlist of email hostname patterns. When enabled, members can only add @acme.com-style addresses matching the configured patterns. Closes the “claim commits as attacker@arbitrary-domain.com” path during forensic review. Pre-existing emails not auto-evicted; OIDC sign-in is exempt (the IdP attests). Patterns support exact + *.subdomain shapesCustom rules + Bunny edge intercept on /user/settings/account/emailPer-tenant patterns + enforce flag
Workflow secretsOrg-level + repo-level Actions secrets injected into every CI job as env vars. Forgejo stores encrypted at rest; fremforge admin proxies CRUD with audit events (value never persisted in fremforge DB or audit log). Override secret = same form is the rotation flowForgejo native secrets + fremforge admin proxyPer-org / per-repo / per-environment
Workflow OIDC for cloud authRunner pods get a fresh OIDC JWT with aud=fremforge per job. Customer cloud trust policies key off this for short-lived credential exchange (no long-lived AWS keys, GCP service-account JSONs, or Azure client secrets in workflow secrets)Custom OIDC issuer signed by fremforge runner-OIDC key (rotated 30d)
Agent-native authenticationThree IdP-side patterns for non-human callers: (1) Direct customer-IdP JWT bearer — present an Entra workload-identity / Okta service-account / Google service-account JWT directly as Authorization: Bearer on any /api/v1/* endpoint; (2) RFC 8693 token exchange + OBOPOST /api/v1/auth/token-exchange accepts subject_token and optional actor_token; audit chain records both actor and on_behalf_of; (3) RFC 6749 client_credentialsPOST /api/v1/oauth/token for apps without an IdP. Per-tenant audience binding (https://frem.sh/<slug>), per-source claim assertions (tid/hd), DB-level UNIQUE preventing two tenants from claiming the same issuer for direct bearerCustom (auth_sources + oauth_clients + token-exchange pipeline using jose)Per-source opt-in; per-client scope cap

DevOps observability

ControlWhat it doesToolConfigurable
DORA dashboardThe four canonical DORA metrics — Deployment frequency, Lead time for changes, Change-failure rate, MTTR — computed over a 30-day rolling window from a tenant-scoped dora_deployments table. Ingest path is the Forgejo release webhook plus a manual POST /api/v1/dora/deployments for workflows that don’t tag releases. Visible at Org admin → DORACustom (fremforge-written, against tenant DB)Rolling window + manual ingest
Code-security overviewSingle admin tab aggregating findings from every scanner in the supply chain (Gitleaks pre-receive, OpenGrep SAST, osv-scanner deps, Trivy images, Scorecard, cosign verification). Filter by repo, severity, age. Each row links into the underlying tool’s reportCustom aggregatorPer-tenant severity floor
Workflow run inspectorEvery Actions run streams structured logs (annotated with step + line) into the tenant audit log and into a per-run viewer at Org admin → Actions → Runs. Failed-job filter + workflow YAML diff vs last green runForgejo Actions UI + fremforge audit overlay
Runner usage panelPer-month runner-minute count + per-job duration table at Org admin → CI runners → Usage. Drives invoice line items via the metering_events tableCustom (runner_jobs aggregation)

AI posture

ControlWhat it doesToolConfigurable
BYO AI — agent-native accessfremforge is AI-agnostic. Customer Claude Code / Cursor / Windsurf / Codex CLI / Aider operate against the same Git + REST surface as humans (machine-readable OpenAPI spec). Combined with Agent-native authentication (direct IdP JWT bearer, RFC 8693 token exchange + OBO, RFC 6749 client_credentials), agents authenticate as first-class principals — no human PAT borrowing. No forge-locked-in AI product, no agentic features that demand a specific vendorStandards-compliant Git + RESTCustomer-controlled
AI integrations (BYOK)Org admin → AI integrations: register your own AI vendor key (Anthropic, OpenAI, Mistral, others). Enables: AI PR review (drafts review comments on diff), Renovate AI explanations (plain-English changelog summaries on dep-bump PRs), and the /api/v1/orgs/<slug>/ai/complete gateway for workflow-side LLM callsCustom gateway (fremforge-written)Per-org vendor + key

Compliance + audit

ControlWhat it doesToolConfigurable
Audit logEvery state-changing operation (push, role change, secret create, runner override, billing change) logged with actor + timestamp + before/after. Two-tier retention: queryable hot tier (90 / 180 / 365 / 730 days, configurable per tenant) + 3-year cryptographic-chain archive in T Cloud OBS WORMCustom append-only (audit_events table)Per-tenant retention window
Audit chainHash-chained audit log + Merkle root anchored every 2 min into T Cloud OBS WORM. Verifier cron checks chain integrity hourly + full-sweep every 30 min. Customers can verify “no event was deleted or modified after the fact”Custom (fremforge-written, BSI C5 alignment)
SIEM streamingReal-time stream of audit events to a customer-provided endpoint (Splunk HEC, Sentinel, ELK, OpenSearch, generic HTTPS webhook). EU-resident relay, no data leaves the eu-de region. Per-tenant endpoint health visible to operator + tenant adminCustom forwarder + siem_endpoints tablePer-customer endpoint config
Data export (GDPR portability)Self-service tenant data export: repos (as git bundles), audit events (JSON), members, secrets metadata, billing invoices. Streamed to a one-time signed OBS URL valid 24h. Required for GDPR Art. 20 portability + offboardingCustom exporterTriggerable any time
Lifecycle policiesPer-tenant retention + deletion automation: stale-repo archive, runner-minute-cap behaviour, audit-log retention window, tenant-suspension grace period, end-of-contract data-erasure SLACustom (tenant_lifecycle table)Per-tenant policy
Repo mirroring (inbound migrations)Pull-mirror customer repos from GitHub, GitLab, Bitbucket, or any other Git host into fremforge with credential-based auth + periodic sync. Used during phased migrations; mirror is removable once cutover is completeForgejo native pull-mirror + fremforge admin proxyPer-repo source + interval
Notification preferencesOrg-wide event routing: which audit events emit mail/webhook/SIEM, which roles get paged on Critical findings, billing-event escalation contactsCustom (notification_preferences table)Per-tenant routing
Vulnerability disclosuresecurity.txt published, security@frem.sh 24h ack SLA, public hall-of-thanks page, no-litigation-for-good-faith-research policy
Severity SLAsPer-org SLA pill next to every open finding. Default deadlines (Critical 7d / High 30d / Medium 90d / Low none) — tightenable per tenant. NIST SP 800-40r4-anchoredCustom (fremforge-written)Per-tenant tightening

What we explicitly don’t do

Anti-featureWhy
No Microsoft footprint (no GitHub, no Azure AD, no Office 365, no Defender, no GHAS CodeQL)EU sovereignty + Schrems II — see trust
No US-hosted Sigstore / Fulcio / Rekor in the verification pathSame. fremforge runs its own Fulcio + TSA on T Cloud eu-de with the root CA in DEW KMS (FIPS 140-2 Level 3 HSM, Germany). No public Sigstore, no Rekor / transparency log — TSA-only timestamping by design
No AWS, GCP, or any US-cloud-controlled dependency on the platform critical pathSame
No third-party CDN-loaded fonts (Google Fonts etc.)Self-hosted at www.frem.sh/fonts/ via Bunny EU edge
No black-box scanners (proprietary detection rules you can’t audit)Customer audit trail requires tool-named transparency
No long-lived service-account credentials in customer workflowsOIDC-only for cloud auth; long-lived keys are an opt-in deprecated path

Tool transparency — full bill of materials

If you need this for an RFP, BSI C5 audit, or internal security review, the canonical list — with versions, pull sources, and the platform-foundation vendor row — lives at docs.frem.sh/security/bill-of-materials/. The table below is a quick-reference subset.

LayerToolWhere usedLicense
Source-control coreForgejo v15Repo hosting, code review, Actions runner protocolGPLv3
CI runner binaryforgejo-runner (act_runner) v6.2.1Per-job ephemeral podMIT
Secret scanningGitleaks v8Pre-receive hookMIT
SASTOpenGrep v1.21PR-time analysisLGPLv2.1
Container CVE scanningTrivyCustomer CI + runner-image baked-inApache 2.0
Dependency scanningosv-scannerPR-time analysisApache 2.0
SBOM generationSyftRelease-tag workflowApache 2.0
Image signing + verifycosignCustomer CI via cosign-verify-images.yaml templateApache 2.0
Keyless code signing — CAFulcio v1.8.5 (Helm chart 2.9.0)Self-hosted on T Cloud eu-de at sign.frem.shApache 2.0
Keyless code signing — TSASigstore TSA (timestamp authority)Self-hosted on T Cloud eu-de at tsa.frem.shApache 2.0
Customer-side gitsigngitsignCustomer git client; OIDC-bound commit signingApache 2.0
Dependency bumperRenovateHosted bot, 15-min cron, per-repo opt-outAGPLv3
Image build (rootless)kanikoContainer build in customer workflowsApache 2.0
Malware scanningClamAVPre-receive scan + LFS uploadGPLv2
OpenSSF best-practice scoringscorecardWeekly per-repoApache 2.0
Platform CDN + WAFBunny CDNEU-resident edge, no Cloudflare/Fastly(Vendor — EU-based, no US sub-processor)
Cloud platformOpen Telekom Cloud (Deutsche Telekom)Compute, storage, networking, DB(Vendor — eu-de region exclusively)
Email (transactional)Lettermint (NL)Auth emails, invoices, alerts(Vendor — EU)
Mailboxmailbox.orgOperational mailbox(Vendor — EU)
PaymentsMollie (NL)Billing(Vendor — EU)
BookkeepingDinero (DK)Invoice issuance(Vendor — EU)

Every vendor on this list is contractually EU-resident with no US sub-processor in the data path. See the trust page for the full DPA + sub-processor chain.

Roadmap (demand-gated)

FeatureStatusTrigger
Bring-your-own-KMS for MASTER_ENCRYPTION_KEY (customer-supplied DEW CMK in their own T Cloud account)DesignedFirst customer commits
SLSA Level 3 (hardened builder posture for the runner image build pipeline)DesignedCustomer demand
MCP signing + verifier for AI-agent supply chainDesignedIndustry standard finalises