Pogo
CI Runs Login

Readme

Pogo is a centralized version control system designed to be straightforward and efficient. It features an easy-to-use CLI client, a simple web UI, and robust support for both text and binary files. Pogo treats conflicts as first-class citizens, allowing them to be pushed to the remote to be resolved later.

✨ Goals

🚀 Installation

NPM

npm install -g @pogo-vcs/pogo

Homebrew

brew install --cask pogo-vcs/tap/pogo

Scoop

scoop bucket add pogo-vcs https://github.com/pogo-vcs/scoop-bucket.git
scoop install pogo

Docker (server)

docker pull ghcr.io/pogo-vcs/pogo:alpine

From Source

To build Pogo from source, run the following commands:

git clone https://github.com/pogo-vcs/pogo.git
cd pogo
just build

This will create a pogo binary in the current directory. You can move this binary to a directory in your PATH to make it accessible from anywhere.

Required software for building:

đŸ•šī¸ Usage

The intended workflow for Pogo is simple and efficient:

  1. describe your changes: Before you start working, use the pogo describe command to write a detailed description of the changes you are about to make and why. This helps you to think about the changes and to communicate them to others.
  2. Make your changes: Make the changes to your files as you normally would.
  3. Iterate on the description: As you work, you can iterate on the description to reflect the changes you are making. Maybe your implementation plan changed and you need your description to reflect that.
  4. Push your changes: Regularly push your changes to the server using the pogo push command. A daemon process that pushes automatically will be added later. You constantly overwrite the current change until you are satisfied with it.
  5. Create a new change: When you are done with your changes, create a new one using the pogo new command. You can optionally add one or more parent changes to the command. By default, your current change is used as the parent.
  6. Maintain a "main" bookmark: Use bookmarks to tag important changes. You can set a bookmark with pogo bookmark set main to set the current change as the main one, or pogo bookmark set main <change> to set a specific change as main. "main" ist just a string, you can use any format for version bookmarks you want. But "main" is a special value, treated like a default branch in Git.

For running the server, you need to have a PostgreSQL database running and the following environment variables set:

📋 Commands

Command Subcommand Aliases Description
pogo The root command for the Pogo CLI.
pogo bookmark b Manage bookmarks.
set s Set a bookmark to a specific change. If no change is specified, the current change is used.
list l List all bookmarks.
pogo ci Manage CI pipelines.
test Test a CI pipeline configuration.
runs Inspect recorded CI runs.
runs list List CI runs for the current repository.
runs inspect Show the detailed log output for a CI run.
pogo clone Clone a repository from a Pogo server.
pogo commit Combines describe, push, and new into a single command.
pogo daemon service Manage Pogo daemon service.
install Install Pogo daemon service.
stop Stop the Pogo daemon service.
start Start the Pogo daemon service.
uninstall Uninstall Pogo daemon service.
pogo describe desc, rephrase Set the description for the current change.
pogo diff Show differences between changes in unified diff format.
pogo diff local Show differences between local unpushed changes and the remote state.
pogo discard Discard all local changes and revert to the remote state.
pogo edit checkout Sets the specified revision as the working-copy revision.
pogo gc Run garbage collection on the server.
pogo info Display the current working copy status.
pogo init Initialize a new repository.
pogo invite inv Manage user invitations.
create Create a new invitation link.
list ls, l List all invitations you have created.
pogo log Show the change history.
pogo new Create a new change based on one or more parent changes.
pogo visibility Set repository visibility to public or private.
pogo push Push a change to the repository.
pogo rm Remove a change from the repository.
pogo secrets Manage repository secrets for CI pipelines.
list l List all secrets in the repository.
get g Get the value of a secret.
set s Set a secret value.
delete d, rm, remove Delete a secret.
pogo serve Start the Pogo server.
pogo token Manage personal access tokens.
set Set or update a personal access token for a server.
remove Remove a personal access token for a server.
pogo whoami Show the personal access token being used for the current repository.

đŸ—ī¸ Architecture

Pogo uses a PostgreSQL server to store all metadata about repositories, changes, and files. The actual file contents are stored in an object store on the file system. This separation of metadata and content allows for efficient storage and retrieval of data.

đŸ—‘ī¸ Garbage Collection

Pogo includes an automatic garbage collection system that removes unreachable data to prevent unbounded storage growth. The GC system cleans up both database records and filesystem objects that are no longer referenced by any repository.

How to Use

Adaptive Implementation

The garbage collection system uses an adaptive strategy based on the total number of files in the database:

The threshold can be configured via the GC_MEMORY_THRESHOLD environment variable. CI run logs are cleaned up during this process; the retention window is controlled by CI_RUN_RETENTION (default 30 days).

🔐 Secrets Management

Pogo provides a secure way to manage secrets for your CI pipelines. Secrets are encrypted values that can be referenced in your CI pipeline YAML files using the {{ secret "KEY" }} template function. They are useful for storing sensitive data like API tokens, deployment keys, and credentials.

Secrets are scoped to a repository and can only be accessed by users with access to that repository.

How to Use

📜 License

This project is published under the Zlib license.

In short:

If you make any modifications to Pogo, I would appreciate it if you shared them with me. I'm always interested in learning from others and improving my own work.

License

zlib/libpng license

Copyright (c) 2025 Frank Mayer

This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the
use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

    1. The origin of this software must not be misrepresented; you must not
    claim that you wrote the original software. If you use this software in a
    product, an acknowledgment in the product documentation would be
    appreciated but is not required.

    2. Altered source versions must be plainly marked as such, and must not
    be misrepresented as being the original software.

    3. This notice may not be removed or altered from any source
    distribution.

Files