@serve.zone/gitops

easy maintenance of your gitea/gitlab instance.

readme.md for @serve.zone/gitops

A unified dashboard for managing Gitea and GitLab instances β€” browse projects, manage secrets, monitor CI/CD pipelines, stream build logs, sync configurations, and receive webhook notifications, all from a single app. πŸš€

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

✨ Features

πŸ“¦ Install

Prerequisites

Setup

# Clone the repository
git clone https://code.foss.global/serve.zone/gitops.git
cd gitops

# Install frontend dependencies
pnpm install

# Build the frontend bundle
pnpm build

# Start the server
deno run --allow-all mod.ts server

The app will be available at http://localhost:3000.

βš™οΈ Configuration

All configuration is done through environment variables:

Variable Default Description
GITOPS_PORT 3000 HTTP/WebSocket server port
GITOPS_ADMIN_USERNAME admin Admin login username
GITOPS_ADMIN_PASSWORD admin Admin login password

Data is stored at ~/.serve.zone/gitops/:

~/.serve.zone/gitops/
β”œβ”€β”€ storage/          # Connection configs (JSON, tokens replaced with keychain refs)
β”‚   └── connections/  # One file per connection
└── tsmdb/            # Embedded MongoDB data (cached secrets, projects)

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    GitOps App                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ OpsServerβ”‚ ConnectionMgr β”‚ SecretsScanService        β”‚
β”‚ (HTTP/WS)β”‚ (Providers)   β”‚ (24h background scan)     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€               β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Handlers β”‚  GiteaProviderβ”‚ CacheDb                   β”‚
β”‚(12 total)β”‚  GitLabProviderβ”‚ (SmartMongo + SmartdataDb)β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                  StorageManager                       β”‚
β”‚            (filesystem key-value store)               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                   SmartSecret                         β”‚
β”‚             (OS keychain / encrypted file)            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Frontend SPA                        β”‚
β”‚        Lit + dees-catalog + smartstate                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Dashboard β”‚ 11 Views β”‚ WebSocket Client β”‚ Auto-Refreshβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Backend (ts/)

Frontend (ts_web/)

Shared Types (ts_interfaces/)

πŸ”Œ API

All endpoints use TypedRequest β€” a typed RPC protocol over HTTP POST to /typedrequest.

Authentication

// Login β†’ returns JWT identity
{ method: 'adminLogin', request: { username, password } }
// β†’ { identity: { jwt, userId, role, expiresAt } }

// All other requests require identity
{ method: 'getProjects', request: { identity, connectionId } }

Connections

Method Description
getConnections List all connections (tokens masked)
createConnection Add a new Gitea/GitLab connection
updateConnection Update connection name/URL/token
testConnection Verify connection is reachable
deleteConnection Remove a connection

Data

Method Description
getProjects List projects (with search/pagination)
getGroups List groups/orgs (with search/pagination)
getAllSecrets Get all secrets for a connection+scope (cache-first)
getSecrets Get secrets for a specific entity (cache-first)
createSecret / updateSecret / deleteSecret Secret CRUD
getPipelines List pipelines for a project (with time-range filtering)
getPipelineJobs List jobs for a pipeline
retryPipeline / cancelPipeline Pipeline actions
getJobLog Fetch raw build log for a job

Managed Secrets

Method Description
getManagedSecrets List managed secret definitions
createManagedSecret / updateManagedSecret / deleteManagedSecret Managed secret CRUD

Sync

Method Description
getSyncConfigs List sync configurations
createSyncConfig / updateSyncConfig / deleteSyncConfig Sync config CRUD
getRepoSyncStatus Get sync status for repos

Actions

Method Description
forceScanSecrets Trigger immediate full secrets scan
getScanStatus Get scan status, last result, timestamp
getActionLog Query global audit trail

Webhooks

# Register this URL in your Gitea/GitLab webhook settings
POST http://your-server:3000/webhook/<connectionId>

Events are parsed from X-Gitea-Event / X-Gitlab-Event headers and broadcast to all connected WebSocket clients as webhookNotification.

πŸ§ͺ Development

# Watch mode β€” auto-rebuilds frontend + restarts backend on changes
pnpm run watch

# Run tests (Deno)
pnpm test

# Build frontend bundle only
pnpm build

# Start server directly
deno run --allow-all mod.ts server

Project Structure

gitops/
β”œβ”€β”€ mod.ts                    # Entry point
β”œβ”€β”€ deno.json                 # Deno config + import map
β”œβ”€β”€ package.json              # npm metadata + scripts
β”œβ”€β”€ .smartconfig.json         # tsbundle + tswatch config
β”œβ”€β”€ html/index.html           # HTML shell
β”œβ”€β”€ ts/                       # Backend
β”‚   β”œβ”€β”€ classes/              # GitopsApp, ConnectionManager, SyncManager, ActionLog
β”‚   β”œβ”€β”€ providers/            # BaseProvider, GiteaProvider, GitLabProvider
β”‚   β”œβ”€β”€ storage/              # StorageManager
β”‚   β”œβ”€β”€ cache/                # CacheDb, CacheCleaner, SecretsScanService
β”‚   β”‚   └── documents/        # CachedProject, CachedSecret
β”‚   └── opsserver/            # OpsServer + 12 handlers
β”‚       β”œβ”€β”€ handlers/         # AdminHandler, SecretsHandler, SyncHandler, etc.
β”‚       └── helpers/          # Guards (JWT verification)
β”œβ”€β”€ ts_interfaces/            # Shared TypeScript types
β”‚   β”œβ”€β”€ data/                 # IProject, ISecret, IPipeline, etc.
β”‚   └── requests/             # TypedRequest interfaces
β”œβ”€β”€ ts_web/                   # Frontend SPA
β”‚   β”œβ”€β”€ appstate.ts           # Smartstate store + actions
β”‚   └── elements/             # Lit web components
β”‚       └── views/            # 11 view components
β”œβ”€β”€ ts_bundled/bundle.ts      # Embedded frontend (base64, committed)
└── test/                     # Deno tests

This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the license file.

Please note: The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.

Trademarks

This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.

Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.

Company Information

Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany

By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

changelog.md for @serve.zone/gitops

2026-03-28 - 2.13.0 - feat(cache,build,docs)

switch cache storage to SmartMongo and align build configuration with updated dependencies

2026-03-02 - 2.12.0 - feat(pipelines)

add pipelines view modes, time-range filtering, group aggregation, sorting, and job log polling

2026-03-02 - 2.11.1 - fix(meta)

update repository metadata (non-functional change)

2026-03-02 - 2.11.0 - feat(sync)

add branch & tag listing support and improve sync mirroring and sync log routing

2026-02-28 - 2.10.0 - feat(managed-secrets)

add centrally managed secrets with GITOPS_ prefix pushed to multiple targets

2026-02-28 - 2.9.0 - feat(sync)

remove target avatar when source has none to keep avatars fully in sync

2026-02-28 - 2.8.0 - feat(sync)

add sync subsystem: SyncManager, OpsServer sync handlers, Sync UI and state, provider groupFilter support, and realtime sync log streaming via TypedSocket

2026-02-24 - 2.7.1 - fix(repo)

update file metadata (mode/permissions) without content changes

2026-02-24 - 2.7.0 - feat(secrets)

add ability to fetch and view all secrets across projects and groups, include scopeName, and improve frontend merging/filtering

2026-02-24 - 2.6.2 - fix(meta)

update file metadata only (no source changes)

2026-02-24 - 2.6.1 - fix(package.json)

apply metadata-only update (no functional changes)

2026-02-24 - 2.6.0 - feat(webhook)

add webhook endpoint and client push notifications, auto-refresh UI, and gitea id mapping fixes

2026-02-24 - 2.5.0 - feat(gitea-provider)

auto-paginate Gitea repository and organization listing; respect explicit page option and default perPage to 50

2026-02-24 - 2.4.0 - feat(opsserver)

serve embedded frontend bundle from committed ts_bundled instead of using external dist_serve directory

2026-02-24 - 2.3.0 - feat(storage)

add StorageManager and cache subsystem; integrate storage into ConnectionManager and GitopsApp, migrate legacy connections, and add tests

2026-02-24 - 2.2.1 - fix(ts_bundled)

add generated bundled JavaScript and source map for ts build (bundle.js and bundle.js.map)

2026-02-24 - 2.2.0 - feat(opsserver)

Serve bundled frontend from a dedicated dist_serve directory and update frontend UI/packaging

2026-02-24 - 2.1.0 - feat(opsserver)

switch to TypedServer and serve bundled UI assets; add index.html; update bundling output and dev watch configuration

2026-02-24 - 2.0.0 - BREAKING CHANGE(providers)

switch GitLab and Gitea providers to use @apiclient.xyz client libraries and export clients via plugins

2026-02-24 - 1.0.0 - initial release

Initial commit and first release of the project.