Skip to main content

Introduction

iForge is a task-driven, lightweight, self-hosted Git service platform that deeply integrates project management with code development.

Core Philosophy

Most Git platforms treat "code hosting" and "project management" as two separate modules—you manage tasks in Jira and code in GitHub/GitLab, maintaining the connection manually.

iForge's core design philosophy is task-driven development—enabling project management and code development to work together in a single system, where every code change is traceable to business requirements:

Requirements → Break down into Stories → Link to Git branches → Commit code → Create MR → Merge → Task automatically completed

Core Workflow

Here's a typical iForge development workflow:

┌─────────────────────────────────────────────────────────────────┐
│ 1. Product manager creates requirements on the board, │
│ breaks them down into Stories and Tasks │
│ ── TASK-12: Fix user login timeout issue │
│ │
│ 2. Developer creates a development branch from the task card │
│ (automatically bound to the task) │
│ └── task-12-fix-login-timeout │
│ │
│ 3. Commit code normally, no need to write task number │
│ └── git commit -m "Optimize database queries" │
│ │
│ 4. Create merge request, automatically linked to task │
│ └── MR-45: Fix login timeout → linked to TASK-12 │
│ │
│ 5. Code review passed, task status automatically updated │
│ after merge │
│ └── TASK-12 status: In Progress → Completed │
└─────────────────────────────────────────────────────────────────┘
Core Difference

Branches are bound to tasks when created. You don't need to write task numbers in commit messages. All changes are automatically attributed to the task timeline.

Four Core Features

FeatureDescriptionTraditional Platforms
🔗 Branch as TaskOne-click create development branches from task cards, automatically binding tasks and branchesManually create branches, disconnected from task system
📝 Commit as RecordCommit normally, all changes automatically attributed to task timeline, no need to write task numbersNeed to manually reference task numbers in commit messages
🔀 MR as DeliveryMerge requests linked to tasks, task status automatically updated after mergeNeed to manually update task status after merge
📊 Board as PanoramaDrag tasks on the board, real-time reflection of development progressNeed to switch between multiple systems to check progress

Core Capabilities

ModuleDescription
Task-Code LinkageTask ↔ Branch ↔ Commit ↔ MR full-chain association, bidirectional traceability
Code HostingGit HTTP/SSH protocols, public/private repositories, branch protection, file browsing, commit history
Agile Project ManagementFull Scrum chain: Epic → User Story → Sprint → Task board, AI-assisted breakdown
CollaborationIssue tracking, Merge Requests (MR), Wiki, comment system, @mention notifications, real-time WebSocket push
CI/CDBuilt-in Pipeline/Job/Runner, .iforge-ci.yml declarative pipeline, Docker sandbox isolation
Authentication & PermissionsLocal accounts, LDAP, OIDC single sign-on, organizations/teams, SSH keys, access tokens
ExtensionsPlugin system, Webhooks, mirror synchronization, Release management

Security Features

iForge has undergone deep security hardening, benchmarking against world-class open-source project standards:

FeatureDescription
Git Input ValidationAll branch names, tag names, and file paths are strictly validated to prevent command injection and path traversal attacks
Docker Sandbox IsolationCI/CD Job containers have network disabled by default (--network=none), limited to 2GB memory, 2 CPU cores, 256 processes
Shell Executor Disabled by DefaultProduction environment uses Docker Executor by default, preventing direct execution of user code on the host
Repository-Level Concurrency LocksAll Git write operations ensure concurrency safety through repository-level mutex locks
Runner Permission IsolationExternal Runners can only execute Jobs for repositories they have permission for, supporting global/user/repository three-level scope
Working Directory Auto-CleanupWorking directories are automatically cleaned up after Job execution to prevent disk space exhaustion
Secure Encryption Key GenerationUses database transactions + row-level locks to prevent concurrent race conditions leading to key inconsistency

Tech Stack

Backend

  • Framework: Go + Fiber v2
  • Database: SQLite (default) / MySQL / PostgreSQL
  • Git Implementation: go-git
  • Authentication: JWT + Session Cookie

Frontend

  • Framework: Next.js 16 + React 19
  • UI Library: Chakra UI
  • Styling: Emotion + Framer Motion
  • Virtual Scrolling: @tanstack/react-virtual

Project Structure

iforge/
├── server/ # Backend service (Go/Fiber)
│ ├── cmd/server/ # Service entry
│ ├── internal/
│ │ ├── handler/ # HTTP handlers
│ │ ├── service/ # Business logic
│ │ ├── model/ # Data models
│ │ ├── middleware/ # Middleware
│ │ ├── router/ # Route definitions
│ │ ├── git/ # Git operation encapsulation (with input validation, repository locks)
│ │ └── container/ # Dependency injection container
│ └── data/ # Data directory (generated at runtime)

├── web/ # Frontend application (Next.js 16)
│ └── src/
│ ├── app/ # Next.js pages
│ ├── components/ # React components
│ ├── contexts/ # React Context (authentication, WebSocket, i18n)
│ └── lib/ # Utility functions, API client

├── docker-compose.yml # Docker deployment orchestration (supports SQLite/MySQL/PostgreSQL)
└── .env.example # Environment variable example
RepositoryDescription
iforgeMain platform (server + web)
iforge-siteOfficial documentation site (Docusaurus)
iforge-runnerCI/CD executor (deployed independently)
iforge-nginxNginx reverse proxy configuration (unified domain routing management)

License

Apache License 2.0 + additional conditions — see LICENSE for details.

  • ✅ Allows commercial use, secondary development, enterprise delivery
  • ❌ Must not operate multi-tenant SaaS services based on the source code
  • ❌ Must not remove the LOGO and copyright information in the console

Ready? Go to Quick Start or Docker Deployment.