ProGit is an ultra-fast, single-binary, self-hosted Git collaboration platform engineered in pure Go with zero CGO dependencies and an embedded modern React frontend.
Core Mission & Philosophy
ProGit provides development teams and enterprises with an ultra-lightweight, resilient, and beautiful alternative to bloated Git platforms. It runs on any machine with less than 50 MB of RAM, boots in under 50 milliseconds, and operates without external database servers like PostgreSQL or MySQL.
Single Binary Simplicity
Everything — the HTTP REST engine, the Smart Git protocol handler, the built-in SSH server (port 2222), the SQLite WAL database engine, and the production React single-page frontend — is embedded into a single, compact, static binary.
Key Capabilities at a Glance
Pure Go & Zero CGO: Cross-compiles instantaneously to Linux, macOS, and Alpine containers without native GCC toolchains.
High-Concurrency SQLite WAL: Uses modernc.org/sqlite with Write-Ahead Logging (WAL) and automated checkpoint maintenance.
GitHub-Class Developer Experience: Complete with Pull Request line-by-line review comments, native Git merge engine, fork mechanics, and Kanban project boards.
Built-in ProGit Pages: Host static websites, documentation, and Jekyll/Markdown sites directly from your repository branches with zero setup.
Dual-Interface Wiki Engine: Edit documentation through the web interface or clone and push directly as a Git bare repository (<repo>.wiki.git).
In-Browser Code Editor & Prettier: Create files, edit code online, upload entire folder structures, and format with 8 built-in themes.
Understand how ProGit achieves maximum portability, concurrency, and security with zero CGO dependencies.
Pure Go SQLite WAL Engine
Traditional Git web applications that use SQLite rely on CGO bindings to the C SQLite library (such as mattn/go-sqlite3). This causes several critical operational headaches: slow cross-compilation, reliance on host GCC/Clang toolchains, and complex multi-architecture container setups.
ProGit completely eliminates CGO by using modernc.org/sqlite — a 100% pure Go translation of SQLite. Features include:
Zero CGO (CGO_ENABLED=0): Single static Go binary without libc/musl dependency conflicts.
Deploying ProGit with production-grade container isolation and persistent volumes.
Automated Deployment Script
ProGit includes dedicated scripts for one-click building and deployment using Podman or Docker:
# Build the lightweight Alpine container image (~37 MB)
bash podman/build.sh
# Deploy with persistent volumes and healthcheck validation
bash podman/deploy.sh
Volume Persistence
ProGit stores all state in /data inside the container. We recommend mapping named volumes to ensure seamless data persistence across container updates:
Internal Path
Volume Purpose
/data/db
SQLite database file (progit.db) and WAL journal
/data/repositories
Bare Git repositories (.git)
/data/config
Custom app.ini configuration overrides and SSL certs
Build both the React UI and Go backend from the official repository.
Prerequisites
Go 1.24 or higher
Node.js 22+ and npm
Git CLI installed on system
Build Instructions
# 1. Clone repository
git clone https://github.com/sanjeevsenapati/progit.git
cd progit
# 2. Build Frontend UI
cd web
npm ci
npm run build
cd ..
# 3. Copy built frontend assets into internal/ui/dist
cp -r web/dist/* internal/ui/dist/
# 4. Compile Pure Go Binary (Zero CGO)
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o progit ./cmd/progit
# 5. Start ProGit
./progit web
Configure your instance parameters and initialize the Super Administrator.
Wizard Fields
Field
Default
Description
Application Name
ProGit
Branding shown on navbar and titles
Domain
localhost
Domain name used for clone URLs
HTTP Port
3000
Port for web traffic
Root URL
http://localhost:3000/
Full canonical base URL
Admin Username
admin
Super administrator username
Admin Email
admin@example.com
Super administrator email address
Admin Password
(required)
Super admin login password (min 6 chars)
Automatic Installation Lock
Once installation finishes, ProGit permanently sets INSTALL_LOCK = true in conf/app.ini. The wizard endpoint (/install) is immediately disabled and returns HTTP 403 to prevent unauthorized reconfiguration.
If CERT_FILE or KEY_FILE are not specified when PROTOCOL = https, ProGit automatically generates an ECDSA P-256 self-signed certificate on boot, ensuring immediate encryption without configuration.
In WAL mode, writes are committed to a temporary journal file (progit.db-wal) and periodically merged into the main database file. Administrators can trigger a manual checkpoint at any time via the admin endpoint:
curl -X POST http://localhost:3000/api/v1/admin/maintenance/wal-checkpoint \
-H "Authorization: Bearer <admin_token>"
Wiki HTTP: http://localhost:3000/<owner>/<repo>.wiki.git
Wiki SSH: ssh://git@localhost:2222/<owner>/<repo>.wiki.git
Personal Access Tokens for CLI
When pushing over HTTP, developers can authenticate using Personal Access Tokens (PATs) instead of their primary account password. Create PATs in Settings > Access Tokens.
Blank Repository Quick Setup (GitHub-Style)
When creating a repository without an initial README (or when a bare repository has zero commits), ProGit displays a comprehensive setup guide matching GitHub's workflow:
Quick Setup Bar: Instant toggle between HTTPS and SSH clone URLs with one-click clipboard copying.
Create a new repository on the command line: Ready-to-copy terminal commands initializing Git, adding a README, committing, setting main branch, and pushing to ProGit.
Push an existing repository from the command line: Copyable commands to add ProGit as remote and push existing branches.
Import code from another repository: Direct shortcut button linking to the repository import wizard.
Repository Import
ProGit allows importing external Git repositories directly via /new/import or POST /api/v1/repos/import. The server clones the entire history (all commits, branches, and tags) using Git mirror replication and seamlessly binds it to your personal or organization account.
Feature-rich in-browser editing with real-time syntax highlighting and 8 Prettier themes.
8 Curated Themes
Theme ID
Name
Palette Description
github-dark
GitHub Dark (Default)
Base dark theme matching #0d1117 with emerald accents
github-light
GitHub Light
Crisp, high-contrast light theme
dracula
Dracula
Famous dark purple, pink, and cyan palette
monokai
Monokai Pro
Iconic vibrant amber, magenta, and green
nord
Nordic Frost
Calm arctic blues and teals
one-dark
One Dark Pro
Balanced Atom/VS Code dark styling
solarized-dark
Solarized Dark
Ethan Schoonover's legendary solarized palette
synthwave-84
Synthwave '84
Neon glowing 80s cyberpunk aesthetic
Online Commits
Edit any file, provide a custom commit message and optional extended description, and choose between committing directly to the active branch or creating a new feature branch.
When creating a new file online, type the entire target path (e.g., src/controllers/auth.go). ProGit automatically creates intermediate directories and commits the file atomically.
Directory Uploads with Subdirectory Preservation
ProGit supports dragging and dropping whole folders or using the Upload a directory picker. Folder structures like assets/icons/logo.svg are preserved and committed in a single atomic Git tree update.
Full GitHub-style code collaboration with unified diffs, inline comments, and native merges.
Branch Comparison
Compare any two branches across commits. The compare view highlights added, modified, and deleted lines with unified diff formatting.
Formal Code Review States
Approve: Submit an approval to authorize merging.
Request Changes: Indicate blocking feedback that must be addressed.
Comment: General feedback without explicit approval/rejection.
Native Git Merges
Authorized reviewers and repository owners can execute a native Git merge with a single click. ProGit performs the merge on the server side and commits the merge commit to the target branch.
Host static sites, documentation, and HTML portfolios directly from your Git repositories.
Enabling ProGit Pages
Navigate to your repository and click the Pages tab.
Toggle Enable ProGit Pages on.
Choose your source branch (e.g. main or docs) and source directory (/ or /docs).
Click Save Pages Settings.
Public Website URL
Your site is immediately published at:
http://localhost:3000/pages/<owner>/<repo>/
Automatic Markdown Rendering
If your repository only has a README.md and no index.html, ProGit Pages automatically parses your Markdown and serves it as a beautifully styled HTML webpage!
Manage company repositories, team assignments, and fine-grained collaborator permissions.
Roles & Access Levels
Organization Owner: Complete control over the organization, all its teams, members, and repositories.
Team Permissions:
read: Can clone and view code, issues, and wiki.
write: Can push commits, create branches, edit online, and manage project boards.
admin: Full settings and collaborator management on team repositories.
External Collaborators: Invite individual users to private repositories with granular read, write, or admin permissions without adding them to an organization.
Trigger CI/CD pipelines, Slack/Discord notifications, and custom webhooks automatically on Git push, issue, and pull request events.
Overview
ProGit features an asynchronous, pure-Go webhook dispatch engine. When events occur in your repository (such as code pushes over HTTP or native SSH, issue creation, or pull request reviews), ProGit queues and delivers HTTP POST payloads with cryptographic HMAC signatures to your subscribed endpoints.
Supported Event Triggers
Event
Trigger Condition
Payload Contents
push
Code committed or branch pushed via Git CLI (Smart HTTP / SSH) or online file editor
When you configure a secret token on a webhook, ProGit calculates a cryptographic HMAC-SHA256 signature for every payload and transmits it in both standard GitHub-compatible and ProGit headers:
Repository administrators can trigger an immediate test ping from the Repository Settings → Webhooks tab to verify network connectivity and signature verification. Each delivery is logged with full request/response diagnostics, HTTP status codes, and execution duration.
Built-in developer communication system for private messaging, peer feedback, and sprint coordination.
Overview
ProGit includes an integrated messaging system that allows developers and contributors to communicate privately within the platform without leaving their code workspace. Whether coordinating code reviews, discussing sprint priorities, or providing private feedback, developers can exchange messages directly.
Key Capabilities
Real-time Unread Badge: The top navigation bar displays a live unread message counter that updates as messages arrive.
Inbox & Outbox: Clean tabbed interface separating received messages from sent communications.
One-Click Reply: Reply directly to sender with automated subject prefixing (Re: ...) and conversation continuity.
Quick Developer Directory: Message composer with auto-population of active platform developers.
Markdown Formatting: Messages support rich Markdown text, code blocks, lists, and inline links.
Instant Access
Access your messaging portal anytime by clicking the Messages icon in the navigation bar or visiting /messages in the web client.
Located in the Settings → Danger Zone tab of every repository, these operations protect high-stakes repository transitions:
Action
Behavior
Security Safeguards
Change Visibility
Toggle between Public and Private status.
Requires repository administrator privileges. Immediately restricts access in Web UI, REST API, Git HTTP, and native SSH.
Archive Repository
Places repository into permanent read-only status.
Enforces strict read-only mode across all layers: rejects Git CLI pushes (receive-pack), online commits, file edits, uploads, and issue creation with HTTP 400. Can be unarchived at any time by owner.
Transfer Ownership
Reassigns repository to another developer or organization.
Atomically moves the Git bare repository folder on disk to the new owner namespace and reassigns database records. Validates target account existence and prevents collisions.
Delete Repository
Permanently purges repository and bare Git storage.
Requires typing repository name to confirm in a themed dialog. Destroys all issues, PRs, wiki pages, webhooks, and disk assets permanently.
Collaborator-Scoped Issue Assignees
Security Hardening: Strict Collaborator Scoping
To eliminate information disclosure and unauthorized assignment risks, ProGit strictly restricts issue assignees to confirmed repository owners and collaborators:
The GET /api/v1/repos/{owner}/{repo}/assignees endpoint returns exclusively users with valid collaborator or owner privileges.
Assigning an issue to any external user or stranger is blocked at the backend API layer with HTTP 400 Bad Request ("user must be a collaborator or owner of this repository").
ProGit provides a responsive, debounced search bar embedded in the global top navigation on every page:
Real-Time Autocomplete: Matches repositories dynamically across repository names, descriptions, owner handles, and combined owner/repo paths (e.g., cbdc/website or cbdc/) as you type.
Canonical Git Path Search: Developers can search in owner/repository format directly, allowing instant filtering of specific organizations or owners.
Root Query & Clean Shortcut Handling: Typing / cleanly focuses the input without character leakage, or returns all accessible repositories when queried directly.
Rich Dropdown Feedback: Results display the repository owner, name, visibility badges (Private lock or Public), description snippet, and star counts.
Direct Navigation: Clicking any search result or selecting it via keyboard navigates instantly to the target repository overview.
Keyboard Shortcuts
Designed for power users and keyboard-first developer workflows:
Key / Shortcut
Context
Action
/
Global (outside input/textarea)
Instantly focuses the navbar search bar and selects existing text
ArrowDown / ArrowUp
Search input active
Navigates through dropdown search results
Enter
Search input active
Jumps directly to the selected repository; if none is highlighted, navigates to /explore?q=...
Escape
Search dropdown open
Dismisses the autocomplete dropdown and blurs the search input
Explore Page Search & Pagination
The Explore page (/explore) allows comprehensive repository discovery with server-side pagination:
URL Query & Page Binding: Directly open or bookmark /explore?q=keyword&page=2 to immediately navigate to filtered results.
Interactive Pagination Controls: Displays total repository counts, previous/next controls, and direct page jumps with smooth scrolling.
Live Browser History: Searching inside the Explore view automatically updates the browser's URL using window.history.replaceState, enabling instant copy-paste sharing with team members.
Multi-Tenant Access Control & Privacy
Zero Information Leakage Guarantee
Repository search is fully multi-tenant and access-controlled directly at the database engine layer:
Anonymous / Unauthenticated Users: Can only discover public repositories (is_private = false).
Authenticated Developers: Can discover all public repositories, plus private repositories where they are the owner, a confirmed collaborator, or an organization member.
System Administrators: Hold global visibility across all public and private repositories.
Global repository management and disk usage telemetry.
Global Repository List
In /admin > Repositories, administrators can inspect all repositories hosted across all user accounts and organizations, including visibility status and disk usage.
Administrative Deletion
Administrators can delete any repository directly from the admin panel. ProGit purges the metadata from SQLite and permanently removes the .git directory from disk.
Interact programmatically with ProGit using the REST v1 API.
Base URL
http://localhost:3000/api/v1
Authentication Methods
ProGit supports two primary authentication schemes for API interaction:
Personal Access Tokens (Bearer PAT): Ideal for scripts, CI/CD runners, and automated tools.
Authorization: Bearer pgt_34f8a92...
Web Session Cookie: Sent automatically by browsers when authenticated (`progit_session`). SameSite is enforced with HttpOnly security.
IP Rate Limiting
To neutralize credential brute-force attacks while preserving automated test throughput, authentication routes (/api/v1/auth/login and /api/v1/auth/register) enforce an IP-based sliding window rate limit of 120 requests per minute. Requests exceeding this threshold receive HTTP 429:
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
{
"error": "Too many authentication attempts. Please try again later."
}
Standard JSON Error Format
All client and server errors return structured JSON with an explanatory error key:
{
"error": "resource not found or access denied"
}
Health & Readiness Probes
GET/api/health
Verifies Go HTTP server, pure-Go SQLite WAL database connectivity, and repository disk access.
Retrieves the authenticated developer's personalized dashboard context including their active repositories, paginated recent activity stream, affiliated organizations, and starred projects.
REST API Reference (v1)/Repositories & Branches API
Repositories & Branches API
Endpoints for repository creation, metadata inspection, stars, collaborators, and branch lifecycle.
List Repositories
GET/api/v1/repos
Lists repositories. Optional query parameters include ?owner={username} to filter by owner handle, or ?q={query} to perform keyword filtering.
Search Repositories
GET/api/v1/repos/search?q={query}&limit=20&page=1
Global repository search supporting keyword matching against repository name, description, owner username, and combined owner/repo paths (e.g. cbdc/website or cbdc/). Supports ?q=/ to discover all accessible repositories without filter elimination. Includes strict access control: unauthenticated users only discover public repositories; authenticated users discover public repositories and private repositories where they are the owner, a confirmed collaborator, or an organization member.
Retrieves paginated repositories and platform highlights for the Explore page. Supports keyword search via ?q={query}, current page selection via ?page={page}, and page size via ?limit={limit}.
Clones an external Git repository from GitHub, GitLab, Bitbucket, or any Git remote URL directly into ProGit with complete commit history, branches, and tags. Supports optional authentication credentials for private repositories.
{
"clone_url": "https://github.com/octocat/Hello-World.git",
"owner": "dev_alice",
"name": "Hello-World",
"description": "Imported repository with full history",
"private": false,
"auth_username": "",
"auth_password": ""
}
Returns tree entries, root README content (if available), total commits count, and the latest commit details for the requested ref and path (matching GitHub's repository code view).
Returns only users eligible for issue assignment: confirmed repository owners and collaborators. External users and platform strangers are strictly excluded.
Answers to common operational questions and error resolutions.
Q: Why do Git pushes over HTTP fail with 401 Unauthorized?
Ensure you authenticate with a valid username and password, or use a Personal Access Token (PAT) created from Settings > Access Tokens.
Q: How do I change the default SSH port from 2222?
Set SSH_PORT = <port> and SSH_LISTEN_PORT = <port> under [server] in app.ini, or pass PROGIT_SSH_PORT=<port> as an environment variable.
Q: How does ProGit Pages resolve file MIME types?
ProGit has a built-in MIME-type registry covering HTML, CSS, JavaScript, SVG, PNG, WebP, JSON, and WebAssembly. It delivers assets with proper Content-Type headers.