From 8c94701c41f1728cadafed5e1d4fa647cabab42e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 10:36:30 +0000 Subject: [PATCH 01/25] Sync content data --- src/data/projects.json | 66 +++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 4e52e47..e299e44 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -124,12 +124,12 @@ "homepage": "", "language": "PHP", "stars": 1213, - "forks": 1165, + "forks": 1166, "topics": [ "opensid", "sistem-informasi-desa" ], - "updatedAt": "2026-07-18T07:46:28Z", + "updatedAt": "2026-07-21T06:49:39Z", "pushedAt": "2026-07-18T13:09:40Z", "latestRelease": { "name": "Rilis v2607.0.0", @@ -140,9 +140,9 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 351, + "openIssues": 352, "openPullRequests": 6, - "subscribers": 109, + "subscribers": 110, "communityHealth": 50, "readmeHtml": "

Selamat datang di OpenSID! ๐Ÿ‘‹

\"readme-image\"

\n

๐Ÿค” Apa itu OpenSID?

\n

OpenSID adalah Sistem Informasi Desa (SID) yang dikembangkan secara terbuka dan kolaboratif oleh komunitas yang peduli dengan SID.

\n

SID diharapkan dapat membantu pemerintah desa dalam beberapa hal berikut:

\n\n
\n

OpenSID bertujuan agar sebanyak mungkin desa di Indonesia dapat menerapkan sistem informasi untuk memajukan desa masing-masing..

\n
\n

Strategi pengembangan OpenSID adalah untuk:

\n\n

OpenSID dikelola di GitHub untuk:

\n\n

๐Ÿ“ƒ PEDOMAN PENGGUNAAN

\n

Panduan pemasangan dan penggunaan OpenSID tersedia di Panduan OpenSID.

\n

๐Ÿ“‘ Distribusi \"VERSI PUBLIK (UMUM)\" dan \"VERSI PREMIUM\":

\n\n

๐Ÿ“‘ Hak Cipta dan Lisensi Tambahan:

\n\n

๐Ÿ“‘ HAK CIPTA, SYARAT, DAN KETENTUAN

\n

Sistem Informasi Desa (SID) pertama kali dikembangkan oleh Combine Resource Institution sejak tahun 2009. Hak cipta awal dimiliki oleh Combine Resource Institution (http://lumbungkomunitas.net/).

\n

Sistem ini dikelola berdasarkan lisensi GNU General Public License Versi 3 (http://www.gnu.org/licenses/gpl.html).

\n

Versi GitHub ini dikembangkan sejak Mei 2016, gratis dan bebas dimanfaatkan serta dikembangkan oleh semua desa. Hak Cipta OpenSID kini dipegang oleh Perkumpulan Desa Digital Terbuka (https://opendesa.id), sebuah lembaga hukum yang dibentuk khusus untuk mengelola OpenSID.

\n

๐Ÿ’ป DEMO

\n\n

๐Ÿ’ฌ FORUM

\n

Bergabunglah dengan Forum Pengguna dan Pegiat OpenSID di Facebook atau di Telegram.
Forum ini bersifat informal, sebagai wadah berbagi informasi dan saling membantu dalam menggunakan dan mengembangkan OpenSID.

\n

๐Ÿค KEMBANGKAN BERSAMA

\n

Laporkan masalah, usulan, atau permintaan pengembangan OpenSID melalui issue GitHub.
Kontribusi dari komunitas SID sangat dihargai, baik untuk dokumentasi di Wiki OpenSID maupun untuk source code di repo utama.

\n

๐Ÿ’ฐ DONASI

\n

\"Backers\n\"Sponsors

\n

๐Ÿง‘ Pendukung

\n

Peduli OpenSID dan misi membangun desa? Dukung OpenSID di sini.

\n
\n

Atau donasi langsung melalui rekening bank. Info lengkap di sini.

\n
\n

โญ๏ธ Sponsor

\n

Apakah desa, lembaga, atau perusahaan Anda mendapat manfaat dari OpenSID?
Bantu kami mengembangkan OpenSID dengan menjadi sponsor.
Logo sponsor Anda akan tampil di sini dengan tautan ke situs Anda.

\n

\n

๐Ÿ‘จโ€๐Ÿ’ป KONTRIBUTOR

\n

Berikut adalah para kontributor luar biasa yang telah membantu mengembangkan OpenSID:

\n

\"Contributors\"

\n" }, @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 897, + "stars": 898, "forks": 279, "topics": [], - "updatedAt": "2026-07-21T01:48:51Z", + "updatedAt": "2026-07-21T07:50:22Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -291,7 +291,7 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 311, + "stars": 312, "forks": 29, "topics": [ "ai-agents", @@ -313,13 +313,13 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T03:08:12Z", - "pushedAt": "2026-07-21T03:08:08Z", + "updatedAt": "2026-07-21T10:05:21Z", + "pushedAt": "2026-07-21T10:21:32Z", "latestRelease": { - "name": "v0.6.2", - "tagName": "v0.6.2", - "url": "https://github.com/fajarhide/omni/releases/tag/v0.6.2", - "publishedAt": "2026-07-17T11:31:44Z" + "name": "v0.6.3", + "tagName": "v0.6.3", + "url": "https://github.com/fajarhide/omni/releases/tag/v0.6.3", + "publishedAt": "2026-07-21T10:28:44Z" }, "archived": false, "licenseSpdx": "MIT", @@ -353,7 +353,7 @@ "tiptap-editor" ], "updatedAt": "2026-07-20T09:52:59Z", - "pushedAt": "2026-07-21T00:48:22Z", + "pushedAt": "2026-07-21T10:29:22Z", "latestRelease": { "name": "v3.1.3", "tagName": "v3.1.3", @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 121, + "stars": 123, "forks": 15, "topics": [ "ai", @@ -490,7 +490,7 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-21T03:10:39Z", + "updatedAt": "2026-07-21T09:18:59Z", "pushedAt": "2026-07-21T03:17:27Z", "latestRelease": { "name": "Release v0.9.1", @@ -501,8 +501,8 @@ "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", - "openIssues": 3, - "openPullRequests": 0, + "openIssues": 6, + "openPullRequests": 1, "subscribers": 0, "communityHealth": 75, "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" @@ -576,7 +576,7 @@ "url": "https://github.com/adenaufal/anti-slop-writing", "homepage": "", "language": "", - "stars": 98, + "stars": 99, "forks": 7, "topics": [ "agent-skill", @@ -595,7 +595,7 @@ "writing", "writing-style" ], - "updatedAt": "2026-07-19T17:18:23Z", + "updatedAt": "2026-07-21T04:06:58Z", "pushedAt": "2026-07-06T04:02:38Z", "latestRelease": { "name": "v3.0", @@ -718,7 +718,7 @@ "sveltekit" ], "updatedAt": "2026-07-20T01:33:20Z", - "pushedAt": "2026-07-20T23:57:22Z", + "pushedAt": "2026-07-21T07:49:35Z", "latestRelease": { "name": "svelte-audio-ui@1.0.1", "tagName": "v1.0.1", @@ -815,7 +815,7 @@ "url": "https://github.com/wauputr4/bansos", "homepage": "https://bansos.dev", "language": "Svelte", - "stars": 49, + "stars": 50, "forks": 7, "topics": [ "bansos", @@ -829,8 +829,8 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-07-20T09:11:40Z", - "pushedAt": "2026-07-20T09:10:23Z", + "updatedAt": "2026-07-21T06:53:31Z", + "pushedAt": "2026-07-21T06:52:25Z", "latestRelease": { "name": "Bansos v0.0.13", "tagName": "v0.0.13", @@ -983,8 +983,8 @@ "stars": 45, "forks": 10, "topics": [], - "updatedAt": "2026-07-18T17:14:35Z", - "pushedAt": "2026-07-18T17:14:32Z", + "updatedAt": "2026-07-21T04:20:00Z", + "pushedAt": "2026-07-21T04:20:02Z", "latestRelease": { "name": "v0.15.1", "tagName": "v0.15.1", @@ -995,7 +995,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-06-13T11:29:36Z", "openIssues": 2, - "openPullRequests": 3, + "openPullRequests": 2, "subscribers": 0, "communityHealth": 85, "readmeHtml": "

\n \"agentmap\n

agentmap

\n

The TS/JS-accurate repo map for your coding agent โ€” a compiler-grade ts-morph import/symbol graph that answers \"where is it / what breaks / does this already exist\" in ~98% fewer context tokens.

\n

Your AI coding agent re-learns your codebase every session โ€” opening files and grepping to find\nwhat connects to what, burning tokens before it writes a line. agentmap gives it a queryable,\nranked code-relationship map for TypeScript/JavaScript repos instead โ€” a ts-morph import/symbol\ngraph (the real TypeScript compiler, so aliases, vite/webpack resolve.alias, package.json\n#imports subpaths, and workspace cross-package imports all resolve) ranked by personalized\nPageRank. Ask it to \"add a field\" or \"fix the login bug\" and it\nfinds the right files, their imports, and what already exists in\n~98% fewer context tokens on average (up to ~99.9% per task; figures are chars/4 estimates applied equally to both sides) โ€” kept current by a post-commit\nauto-refresh and actually used via a PreToolUse(Grep) hook.

\n
\n

agentmap's wedge in one line: it's the TS/JS-accurate repo map โ€” a real TypeScript-compiler graph, not a tree-sitter approximation โ€” with a published, honest accuracy eval to back it. That precision is the point; the auto-refresh/nudge wiring below is convenience, not the moat.

\n
\n

\"npm\"\n\"CI\"\n\"License:\n\"node\"

\n
\n

One file, one runtime dependency (ts-morph, which bundles the TypeScript compiler โ€” ~10 MB installed). No vector DB, no embedding API, no server.\nnpx @raymondchins/agentmap --any <query> and you have a ranked answer.

\n

Fully local โ€” no network calls, no telemetry, no data leaves your machine. agentmap\nreads your code, writes a cache under .claude/agentmap/, and never phones home (there is\nnot a single fetch/http call in the source). Your code is never sent anywhere.

\n

โš ๏ธ Always install the scoped name: @raymondchins/agentmap. npx agentmap\n(unscoped) runs an unrelated package by a different author โ€” this project is\n@raymondchins/agentmap, and the scoped name is required in every install and command.\nnpmjs.com/package/@raymondchins/agentmap

\n
\n
\n

Benchmark

\n

Every task you hand a coding agent starts with the same hidden step โ€” find the relevant code.\nHere's the token cost of that step, reading raw files vs querying agentmap, on a real 154-file\nNext.js app (vercel/ai-chatbot). Every figure is captured\ntool output (node benchmark/bench.mjs <repo> at the pinned sha):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
The question the agent has to answer firstReading filesWith agentmapSaved
Where is this symbol defined?1,9502099%
Does a helper for this already exist? (reuse)14,7401999.9%
What breaks if I change this file? (blast radius)81,03861699.2%
What files make up this feature?6,1211,02583.3%
Give me a repo overview3,0651,12763.2%
Load the whole repo into context150,2811,12799.3%
What does this one file import?58351711.3%
All 7 tasks combined257,7784,45198.3%

Context tokens the agent burns to answer each question โ€” token est = chars/4, applied to both sides.

\n

That's the agent reaching the same answer on 58ร— fewer tokens overall โ€” and the pattern holds\nacross zod (367 files, 99.2%) and\ntaxonomy (125 files, 96.0%), peaking at 646ร— fewer\non a single whole-repo map. Reproducible at pinned shas; full per-scenario tables in\n./benchmark/RESULTS.md.

\n
\n

Methodology note: the 58ร— overall figure is dominated by the whole-repo-load scenario\n(Scenario F โ€” 150 K vs 1 K tokens), which skews the combined ratio sharply upward. Excluding it,\nthe per-task overall ratio on the same sample repo is approximately 32ร—. Both numbers are real;\nthe headline captures the most common agent worst-case (repo-dump on session start), while the\nper-task average better represents typical individual queries. RESULTS.md has the full breakdown.

\n
\n

Fewer tokens, but are they the right tokens? Token efficiency is only half the story โ€” a\nseparate EVAL.md (npm run eval) scores retrieval accuracy against ground\ntruth derived live from real repos (zod, zustand, hono). Headline: agentmap returns the symbol\ndefinition in the top 3 ~95% of the time (naive grep ~79%) at ~2.6ร— fewer tokens, and\nidentifies a module's dependents at ~100% precision (grep ~58%). Honest tradeoffs and method\nin EVAL.md.

\n

Speed: a cold build (parse + PageRank + symbol graph) takes ~1.2s; a warm cached query\nreturns in ~0.1s (the lazy-loaded path added in 0.2.2) โ€” the agent has a ranked answer back\nbefore it would have finished opening the first handful of files.

\n

Honest notes: the win scales with the work โ€” the small rows above (63%, 11%) are the floor, and a\ntrivial single-file lookup can even cost more than cat+grep (taxonomy's file-import task\nhit โˆ’313%; we leave it in). Numbers measure context-token volume, not answer quality or wall-clock.

\n
\n

Why it's different

\n

Many \"repo context\" tools are a photocopy: they dump your repository (or a slice of it) into\nthe prompt once and walk away โ€” the copy goes stale the moment you edit a file, and nothing\nmakes the agent actually read it. agentmap is queryable and ranked instead: the agent\ninterrogates it flag-by-flag rather than swallowing a dump.

\n

But the real reason to reach for agentmap is accuracy. It's built on ts-morph โ€” the actual\nTypeScript compiler โ€” so its import graph resolves the things a text/tree-sitter scanner guesses\nat: tsconfig/jsconfig paths, vite/vitest/webpack resolve.alias, package.json Node\n#imports subpaths, and pnpm/npm/yarn workspace cross-package imports. It reports an\nedgeCoverage map-health signal and warns loudly when a repo's imports mostly don't resolve,\nso a broken map is never framed as success โ€” and a separate EVAL.md scores\nretrieval accuracy against live ground truth. That compiler-grade precision on TS/JS is the wedge.

\n

The self-refreshing side โ€” a post-commit rebuild plus a PreToolUse hook that steers the agent\nto the map before it serial-greps โ€” is genuinely useful, but it isn't unique: CodeGraph\n(colbymchenry/codegraph, ~57kโ˜…) ships a native\nOS-event file watcher (FSEvents/inotify) with debounced auto-sync and an installer that\nauto-configures eight agent CLIs. agentmap's honest edge over the multi-language graph tools is\nnarrower and sharper: TS/JS resolution the others approximate, with a published accuracy eval.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
agentmapAider repo mapRepoMapperRepomixcode2prompt
Ranking algorithmPersonalized PageRank (file + symbol graphs)PageRank (graph ranking)Importance heuristicsNone (file order)None (file order)
LanguagesTS/JS + Vue SFC (via ts-morph)Many (tree-sitter)Many (tree-sitter)Language-agnostic (text)Language-agnostic (text)
Token-budget outputYes โ€” --map [--tokens N] ranked digestYes (built into Aider's context)PartialYes (size caps)Yes (templates/caps)
TS/JS resolution depthCompiler-grade โ€” tsconfig paths + vite/webpack alias + #imports + workspaces (ts-morph)Basename/regex heuristicsBasename/regex heuristicsN/A (text)N/A (text)
Retrieval-accuracy evalYes โ€” published EVAL.md vs live ground truthNoNoNoNo
Agent-loop wiringYes โ€” post-commit auto-refresh + PreToolUse hookIn-process (Aider only)NoNoNo
Dependenciests-morph onlyPython + tree-sitter stackPython + tree-sitterNodeRust binary
Installnpx @raymondchins/agentmappip install aider-chatpip installnpx/globalcargo/binary
\n

What that table is not claiming: agentmap is TS/JS-only (the others are multi-language),\nand it's a file-level import graph, not a full call-site/reference resolver (see\nScope & limitations). The differentiators are narrow and honest:\n(1) compiler-grade TS/JS resolution (aliases, vite/webpack, #imports, workspaces) with a\npublished accuracy eval, and (2) the --any router. The agent-loop wiring is real and\nconvenient but not unique โ€” CodeGraph and others\nauto-sync and auto-configure agent CLIs too; we don't claim it as a moat.

\n
\n

The agent loop (staying current, staying used)

\n

A common failure of repo-map tools: they build a beautiful map, and then the\nagent forgets it exists and greps anyway. A map the agent doesn't open is just dead weight.

\n

agentmap closes that loop. Two hooks (in ./hooks/) do the work: the map\nrefreshes itself after every commit, and the agent gets nudged to query it before it\nserial-greps. You wire it once โ€” then it stays current on its own, and stays used.

\n
\n

This wiring is table stakes, not the moat โ€” CodeGraph\nand other tools also auto-sync (via native OS file watchers) and auto-configure agent CLIs.\nagentmap ships it because it's genuinely useful; the actual point of agentmap is the\ncompiler-grade TS/JS accuracy the map is built on.

\n
\n

1. Auto-refresh on commit

\n

hooks/post-commit rebuilds .claude/agentmap/map.json after each\ncommit, detached + silenced so it never slows the commit. It skips during\nrebase/merge/cherry-pick and no-ops if Node is missing.

\n

The hooks ship inside the npm package. The simplest setup:

\n
npx @raymondchins/agentmap --install-hooks\n
\n

This copies hooks/post-commit into .git/hooks/, sets it executable, ensures\n.claude/agentmap/ is in .gitignore, and auto-wires the PreToolUse nudge\nhook into .claude/settings.json (merge-safe + idempotent) so map enforcement is\non by default โ€” no manual paste. Manual alternative for just the post-commit hook:

\n
# from your repo root\ncp hooks/post-commit .git/hooks/post-commit\nchmod +x .git/hooks/post-commit\n
\n

The hook resolves the builder to the installed package โ€” node_modules/.bin/agentmap,\na PATH agentmap binary verified to be @raymondchins/agentmap, then\nnpx @raymondchins/agentmap. It never runs a repo-local ./agentmap.mjs unless you opt in\nwith AGENTMAP_HOOK_ALLOW_LOCAL=1 (for developing agentmap itself), so an\nattacker-planted agentmap.mjs can't execute on your next commit.

\n

2. Force the agent to use it โ€” PreToolUse hook

\n

hooks/agentmap-nudge.mjs is a non-blocking hook for\nClaude Code that covers both the Grep tool and raw Bash text-searchers\n(grep/rg/egrep/fgrep/ag/ack). When either looks like a dependency /\nwho-imports / component-usage / reuse / where-is-symbol search, it injects a reminder\nsteering the agent to agentmap --any first. It never denies the call, and stays silent\nfor raw-string / Tailwind-class / lowercase-HTML-tag sweeps and for pipe-filtered commands\nlike ps aux | grep node โ€” so it's high-signal, not nagging.

\n

Fires on: import/require/export/from '...' patterns, JSX component tags\n(<Hero, <ProviderCard), explicit intent words (where is, who imports, reuse,\nexisting component), and โ€” in both the Grep tool and the Bash branch โ€” bare multi-hump\nPascalCase identifiers (ProviderCard, TopProviders) that almost always mean \"where is\nthis symbol / who uses it\". The Bash branch additionally only fires when the searcher is the primary command (at the start,\nor after ;/&&); piped log-filters stay silent.

\n

All four nudge/gate variants (this one, Codex, Gemini, OpenCode) also self-gate on\nproject presence: since they ship at user/global scope too (plugin bundle, ~/.gemini,\n~/.codex, ~/.config/opencode), they walk up from the tool call's cwd to the\nfilesystem root looking for node_modules/@raymondchins/agentmap or a built\n.claude/agentmap/map.json before doing anything else, so a repo with no agentmap stays\nsilent instead of nagging (or, for Codex, denying a grep it has no business denying).

\n

--install-hooks writes both matchers into .claude/settings.json for you (merge-safe โ€”\npreserves existing settings, won't duplicate on re-run). The single hook file dispatches\ninternally on tool_name. For reference, or to wire it by hand:

\n
{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Grep\",\n        \"hooks\": [{ \"type\": \"command\", \"command\": \"node ./hooks/agentmap-nudge.mjs\" }]\n      },\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [{ \"type\": \"command\", \"command\": \"node ./hooks/agentmap-nudge.mjs\" }]\n      }\n    ]\n  }\n}\n
\n

That's the \"forced to use it\" in the tagline: the map stays current on its own, and the\nagent is steered to it the moment it reaches for a dependency-shaped grep or Bash search.

\n

3. Agent skills (Cursor, Claude Code, Codex, OpenCode, Gemini, Antigravity, Copilot)

\n
npx @raymondchins/agentmap --install-skill\n
\n

โ€ฆor grab just the skill (no agentmap flags) via the skills\nCLI โ€” agentmap ships the skills/agentmap/SKILL.md layout it expects:

\n
npx skills add raymondchins/agentmap\n
\n

--install-skill copies packaged SKILL.md files and a Cursor rule (.cursor/rules/agentmap.mdc,\nalwaysApply: true) into the current repo or global agent directories. Paths follow\neach platform's official skill-directory conventions. Options:

\n
agentmap --install-skill --platform cursor           # Cursor rule only (project)\nagentmap --install-skill --platform claude           # .claude/skills/agentmap/SKILL.md\nagentmap --install-skill --platform codex            # .codex/skills/ (project) or ~/.codex/skills/ (global)\nagentmap --install-skill --platform opencode         # .opencode/skills/ (project) or ~/.config/opencode/skills/ (global)\nagentmap --install-skill --platform gemini           # .gemini/skills/ (project); global ~/.gemini/skills/ (Windows global: ~/.agents/skills/)\nagentmap --install-skill --platform antigravity      # .agents/skills/ (project) or ~/.gemini/config/skills/ (global)\nagentmap --install-skill --platform copilot          # .copilot/skills/ or ~/.copilot/skills/\nagentmap --install-skill --global --platform claude  # ~/.claude/skills/...\nagentmap --install-skill --platform agents           # legacy .agents/skills/ (project or global); excluded from default `all`\nagentmap --install-skill --dry-run                   # preview paths, no writes\n
\n

--platform all installs: claude, cursor, codex, opencode, gemini, antigravity, copilot (not legacy agents).

\n

Some platforms also get always-on docs and hooks in the same command:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
--platformSkillAlso installs (project)Global docs
gemini.gemini/skills/โ€ฆ/SKILL.mdGEMINI.md + .gemini/settings.json BeforeTool nudge~/.gemini/GEMINI.md
codex.codex/skills/โ€ฆ/SKILL.mdAGENTS.md merge-safe <!-- agentmap:begin/end --> block~/.codex/AGENTS.md
opencode.opencode/skills/โ€ฆ/SKILL.mdAGENTS.md + .opencode/plugins/agentmap-nudge.js~/.config/opencode/AGENTS.md
\n

Codex and OpenCode share one repo-root AGENTS.md on project install. Existing content outside the marked block is preserved.

\n

Pair with --install-hooks (Claude Code) or --mcp (Cursor MCP).

\n

4. Claude Code plugin (one-command bundle)

\n

Prefer the plugin over --install-skill/--install-hooks if you're on Claude Code and\nwant the skill, the PreToolUse grep/Bash nudge, and the stdio MCP server in a single\ninstall that auto-updates:

\n
# in Claude Code\n/plugin marketplace add raymondchins/agentmap\n/plugin install agentmap@agentmap\n
\n

The plugin bundles: the packaged SKILL.md, the PreToolUse nudge (both the Grep\ntool and Bash text-searchers, via ${CLAUDE_PLUGIN_ROOT}), and the stdio MCP server\n(npx -y @raymondchins/agentmap --mcp, so ts-morph is fetched on demand โ€” the plugin\ncache ships no node_modules).

\n
\n

One thing the plugin can't do: install the git post-commit hook. Claude Code\nplugins can't write into .git/hooks/, so the auto-refresh-on-commit still needs a\none-time npx @raymondchins/agentmap --install-hooks in each repo (it also wires the\nnudge into .claude/settings.json, harmlessly redundant with the plugin's copy).\nWithout it the map still rebuilds on any dirty query โ€” you just lose the commit-time\nrefresh.

\n
\n

Onboarding by platform

\n

Enforcement isn't uniform โ€” some CLIs get a live hook that actively steers grep to\nagentmap, some get an MCP server the agent can call, and some are docs-only (a\nskill/rule the agent may or may not consult). Honest matrix:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PlatformInstallEnforcementKnown gaps
Claude Code/plugin install agentmap@agentmap (or --install-hooks)live hook โ€” PreToolUse nudge on Grep + Bash searchersnon-blocking (never denies grep); bare-symbol Grep nudge requires the #3 hook fix
Gemini CLI--install-skill --platform geminilive hook โ€” .gemini/settings.json nudgefires on the AfterTool/systemMessage path (the earlier BeforeTool + additionalContext combo was silently dropped โ€” fixed in #4)
OpenCode--install-skill --platform opencodelog-only โ€” .opencode/plugins/agentmap-nudge.js writes to the log, does not inject contextplugin can't steer the model; relies on the AGENTS.md block being read
Cursor--install-skill --platform cursor + .cursor/mcp.json (below)MCP + docs โ€” alwaysApply rule + the MCP serverCursor's own hooks aren't wired; the rule is advisory
Codex CLI--install-skill --platform codexlive gate โ€” .codex/config.toml PreToolUse hookdenies only high-confidence structural greps; allow-fallback for logs/pipes/non-TS-JS; AGENTMAP_CODEX_GATE=0 bypasses; needs a trusted dir + Codex hooks-GA
Copilot CLI--install-skill --platform copilotdocs-only โ€” .copilot/skills/same as Codex โ€” no live hook yet
\n

Cursor MCP โ€” copy-paste .cursor/mcp.json (Cursor's --mcp wiring is a documented\ndead-end otherwise; drop this at your repo root):

\n
{\n  \"mcpServers\": {\n    \"agentmap\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@raymondchins/agentmap\", \"--mcp\"]\n    }\n  }\n}\n
\n

Then Cursor exposes the 11 query tools (any, find, relates, map, hubs,\nfeatures, feature, symbols, search, callers, calls). Run agentmap --doctor any time to see what's wired\nvs missing.

\n

Uninstall

\n

agentmap only writes files into your repo/home โ€” remove them to fully uninstall. agentmap --doctor lists every path it wrote, and every docs merge lives inside an\n<!-- agentmap:begin/end --> (or # agentmap:begin/end) fence, so deleting just that block\nleaves the rest of your AGENTS.md / GEMINI.md intact.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PlatformRemove
Claude Code.claude/skills/agentmap/ + the agentmap PreToolUse block in .claude/settings.json
Cursor.cursor/rules/agentmap.mdc + the agentmap entry in .cursor/mcp.json
Codex.codex/skills/agentmap/, the # agentmap:begin/end block in .codex/config.toml, .codex/hooks/agentmap-codex-nudge.mjs, and the fenced block in AGENTS.md
OpenCode.opencode/skills/agentmap/, .opencode/plugins/agentmap-nudge.js, the AGENTS.md block
Gemini.gemini/skills/agentmap/, .gemini/hooks/agentmap-nudge.mjs, the BeforeTool hook in .gemini/settings.json, the GEMINI.md block
Allmap cache rm -rf .claude/agentmap/; npm devDep npm rm @raymondchins/agentmap; the agentmap block in .git/hooks/post-commit
\n

Troubleshooting

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SymptomCause / fix
features (0)--features only detects Next.js app/ routes; a TanStack src/routes/ repo legitimately shows 0. Use --map / --symbols instead.
Empty or wrong mapUsually no tsconfig.json / resolvable aliases in the target repo, so no edges resolved โ€” run agentmap --doctor and check edgeCoverage in --json.
Stale-looking resultsBy design the map rebuilds from disk on a dirty tree / SHA mismatch. Force a rebuild by just running agentmap.
Codex/Gemini nudge never firesCodex's gate is opt-in โ€” set [features] hooks = true in .codex/config.toml (AGENTMAP_CODEX_GATE=0 disables it). Gemini needs the BeforeTool hook that --install-skill writes.
Installed the wrong agentmapThis is @raymondchins/agentmap (npm scope) โ€” not the unrelated unscoped agentmap packages.
Cursor MCP tools missing--mcp doesn't auto-wire Cursor; add the copy-paste .cursor/mcp.json from the matrix above and restart Cursor.
\n
\n

Quickstart

\n

No install needed:

\n
npx @raymondchins/agentmap --any <query>\n
\n

โ€ฆor run it directly from a checkout:

\n
node agentmap.mjs --any <query>\n
\n

The first run builds and caches the map to .claude/agentmap/map.json (add\n.claude/agentmap/ to .gitignore). Subsequent runs serve the cache when the tree is clean and HEAD is\nunchanged, and silently rebuild from disk when there are uncommitted .ts/.tsx/.js/...\nedits โ€” so queries always reflect your in-flight work.

\n

Run with no flag to build + print a one-line summary:

\n
$ node agentmap.mjs\nagentmap: 154 files | 4 features | top hub: lib/utils.ts (deg 52, pr 0.105171)\n
\n
\n

The --any router

\n

Don't want to learn eight flags? You don't have to. Throw anything at --any โ€” a filename, a\nfunction, a feature, even a raw string โ€” and it figures out what you meant, returning the first\nlayer that hits:

\n
--any <query>\n   โ”‚\n   โ”œโ”€ 1. FILE     exact path โ†’ unique basename โ†’ unique substring\n   โ”œโ”€ 2. SYMBOL   exported name contains the query (across all files)\n   โ”œโ”€ 3. FEATURE  app/-router feature name contains the query\n   โ””โ”€ 4. CONTENT  live `git grep` (tracked + untracked) โ€” never stale\n
\n

Layers 1โ€“3 read the cached structural map (fast, ranked). Layer 4 is a live disk read\nvia git grep -F, so raw strings, copy, Tailwind classes, and config values the structural\ngraph never indexes still resolve instead of coming up empty.

\n

Symbol hit (query resolved to a symbol โ†’ full block):

\n
$ node agentmap.mjs --any cn\n[structure] 1 symbol, 0 feature match for \"cn\"\n  lib/utils.ts โ†’ cn (FunctionDeclaration)\n
\n

Ambiguous file hit (query matched multiple files โ†’ narrow it):

\n
$ node agentmap.mjs --any utils\n[structure] \"utils\" matched 3 files โ€” narrow it:\n  lib/utils.ts\n  lib/db/utils.ts\n  tests/prompts/utils.ts\n
\n

Content fallback (no file/symbol/feature match โ†’ live git-grep):

\n
$ node agentmap.mjs --any streamText\n[content] 13 lines:\napp/(chat)/api/chat/route.ts:8:  streamText,\napp/(chat)/api/chat/route.ts:194:        const result = streamText({\nartifacts/code/server.ts:1:import { streamText } from \"ai\";\nartifacts/code/server.ts:18:    const { fullStream } = streamText({\nartifacts/code/server.ts:40:    const { fullStream } = streamText({\nartifacts/sheet/server.ts:1:import { streamText } from \"ai\";\nartifacts/sheet/server.ts:11:    const { fullStream } = streamText({\n
\n
\n

Commands

\n

Every snippet below is representative output (long lists trimmed) from running agentmap against the public\n154-file Next.js repo vercel/ai-chatbot (sha 2becdb4).

\n

--any <q> โ€” the router (file โ†’ symbol โ†’ feature โ†’ live content)

\n

See The --any router above. Default first move for any\n\"where/what/who\" question.

\n

--find <q> โ€” reuse-before-rebuild symbol search

\n

Find every symbol whose name contains the query โ€” exported symbols plus non-exported\ntop-level declarations. Use it before writing a new util or component to check what already\nexists (a private helper counts as reusable too).

\n
$ node agentmap.mjs --find Message\nfind \"Message\": 55 match\n  hooks/use-messages.tsx โ†’ useMessages (FunctionDeclaration)\n  lib/errors.ts โ†’ getMessageByErrorCode (FunctionDeclaration)\n  lib/types.ts โ†’ messageMetadataSchema (VariableDeclaration)\n  lib/types.ts โ†’ MessageMetadata (TypeAliasDeclaration)\n  lib/types.ts โ†’ ChatMessage (TypeAliasDeclaration)\n  lib/utils.ts โ†’ convertToUIMessages (FunctionDeclaration)\n  lib/utils.ts โ†’ getTextFromMessage (FunctionDeclaration)\n  tests/helpers.ts โ†’ generateTestMessage (FunctionDeclaration)\n  app/(chat)/actions.ts โ†’ generateTitleFromUserMessage (FunctionDeclaration)\n  โ€ฆ\n
\n

--search <q> โ€” BM25 lexical search for vague queries

\n

When you don't know the exact symbol name โ€” the query an agent actually types โ€” --search\nranks symbols by BM25 lexical relevance over split-identifier tokens (the symbol name,\nits file's path segments, feature, and kind), fused with file PageRank so a strong hit in an\nimportant file wins ties. No embeddings, no vector DB; the index is built into map.json.\nThe same ranker is wired into --any as a rung that fires only when exact file/symbol\nmatching found nothing, so exact routing is unchanged.

\n
$ node agentmap.mjs --search \"auth retry logic\"\nsearch \"auth retry logic\": 3 match\n  src/authRetry.ts โ†’ retryWithBackoff (FunctionDeclaration)  [6.83]\n  โ€ฆ\n
\n

Stopwords (the, that, of, โ€ฆ) are dropped, so --search \"the function that dedupes symbols\" works. Also available as the search MCP tool.

\n

--relates <path> โ€” blast radius + transitive relevance

\n

The file's own block (exports / imports / direct dependents) plus a random-walk\nrelevance list (personalized PageRank on the bidirectional import graph) โ€” the files most\nrelated to the target, transitively, not just its direct importers.

\n
$ node agentmap.mjs --relates lib/db/schema.ts\nrelates: lib/db/schema.ts  (pr 0.073744)\nexports (14): user(VariableDeclaration), User(TypeAliasDeclaration), chat(VariableDeclaration), Chat(TypeAliasDeclaration), message(VariableDeclaration), DBMessage(TypeAliasDeclaration), โ€ฆ\nimports (0): โ€”\ndependents (21): hooks/use-active-chat.tsx, lib/types.ts, lib/utils.ts, components/chat/artifact.tsx, components/chat/message.tsx, lib/db/queries.ts, app/(chat)/api/chat/route.ts, โ€ฆ\nrelated (random-walk relevance):\n  lib/utils.ts (0.0476)\n  lib/types.ts (0.0376)\n  components/chat/artifact.tsx (0.0372)\n  components/chat/icons.tsx (0.0264)\n  components/chat/message.tsx (0.0237)\n  lib/db/queries.ts (0.0225)\n  app/(chat)/api/chat/route.ts (0.0218)\n  โ€ฆ\n
\n

For a file carrying a React Server Components directive prologue, the output adds one more\nline โ€” boundary: 'use client' (client component) or boundary: 'use server' (server module/actions)\n(rsc: 'client' | 'server' in --json) โ€” right after dependents. This is additive and\noptional: repos with no 'use client'/'use server' directives never see the line.

\n

--callers <sym> โ€” compiler-accurate call graph (experimental)

\n

Who actually calls a symbol, resolved by the TypeScript language service (ts-morph\nfindReferencesAsNodes) โ€” not tree-sitter name-matching. This is symbol-level blast radius:\na type-position mention (typeof foo), a re-export, a bare value reference (const x = foo),\nor a same-named private local in another file is a different symbol and is never\nmis-attributed. --in <path> disambiguates a name defined in more than one file (exported\ndefinitions win over same-named private locals); results are ranked by caller-file PageRank\nand capped.

\n
$ node agentmap.mjs --callers getMessageByErrorCode\ncallers of getMessageByErrorCode  [lib/errors.ts]: 3 call sites\n  app/(chat)/api/chat/route.ts:88 โ†’ POST\n  lib/db/queries.ts:142 โ†’ saveMessage\n  components/chat/message.tsx:57 โ†’ PureMessage\n
\n

A deliberate deep query: it lazily spins up the TS type-checker (a few seconds on a large\nrepo) only when invoked โ€” the map build and every other query never pay that cost, and\nnothing is persisted. Accurate on statically-resolvable calls; dynamic dispatch, reflection,\nand string-keyed access are beyond any static tool. Also available as the callers MCP tool.

\n

--calls <sym> โ€” outgoing call graph (experimental)

\n

The companion to --callers: which in-project symbols a symbol invokes. Each call and\nnew X() site inside its body is resolved by the type checker (getDefinitionNodes), which\nfollows an imported / re-exported binding through to the real declaration โ€” so a same-named\nlocal elsewhere is never confused for the imported one. node_modules and TypeScript\nbuilt-ins (console.log, Array.map, โ€ฆ) are excluded; dynamic dispatch, computed member\naccess, and higher-order callees are honestly skipped.

\n
$ node agentmap.mjs --calls extractFacts\nextractFacts calls  [agentmap.mjs]: 15 in-project targets\n  agentmap.mjs:756 โ†’ makeProject (FunctionDeclaration)\n  agentmap.mjs:944 โ†’ rel (VariableDeclaration)\n  agentmap.mjs:952 โ†’ excluded (VariableDeclaration)\n  โ€ฆ\n
\n

Same lazy, out-of-band model as --callers (builds a Project only on the query, nothing\npersisted). Also the calls MCP tool.

\n

Going transitive โ€” --depth N. Both --callers and --calls accept --depth N\n(default 1, max 5) for an N-hop closure: --callers foo --depth 3 is the transitive\nblast radius (\"everything that reaches foo, up to 3 hops\"); --calls foo --depth 3 is\nthe dependency cone (\"everything foo pulls in\"). It BFS-traverses the same single warm\nProject โ€” no extra build โ€” with cycle detection and node caps so a hub can't explode; each\nresult is tagged with its depth and a via parent. --depth 1 is the default single-hop\nquery.

\n
$ node agentmap.mjs --callers leaf --depth 2\ncallers of leaf  [src/chain.ts]: 2 callers within depth 2\n  src/chain.ts:2 โ†’ mid [depth 1]\n  src/chain.ts:3 โ†’ top [depth 2]\n
\n

--feature <name> โ€” files that make up a feature

\n

Resolves a Next.js app/-router feature to its file set, plus the external files that\ndepend on it.

\n
$ node agentmap.mjs --feature api\nfeature \"api\": 11 files\n  app/(chat)/api/chat/route.ts\n  app/(chat)/api/chat/schema.ts\n  app/(chat)/api/document/route.ts\n  app/(chat)/api/history/route.ts\n  app/(chat)/api/messages/route.ts\n  app/(chat)/api/models/route.ts\n  app/(chat)/api/suggestions/route.ts\n  app/(chat)/api/vote/route.ts\n  app/(auth)/api/auth/guest/route.ts\n  app/(chat)/api/files/upload/route.ts\n  app/(chat)/api/chat/[id]/stream/route.ts\nexternal dependents (0): โ€”\n
\n

--features โ€” list features by size

\n
$ node agentmap.mjs --features\nfeatures (4):\n  api (11 files)\n  login (1 files)\n  register (1 files)\n  chat (1 files)\n
\n

--hubs โ€” most important files (PageRank)

\n

The files that matter most, ranked by PageRank importance (raw dependent degree shown\nalongside).

\n
$ node agentmap.mjs --hubs\nagentmap: 154 files (sha 2becdb4)\nhubs (PageRank importance):\n  lib/utils.ts (deg 52, pr 0.105171)\n  lib/db/schema.ts (deg 21, pr 0.073744)\n  lib/types.ts (deg 23, pr 0.067589)\n  components/chat/artifact.tsx (deg 15, pr 0.036882)\n  components/chat/icons.tsx (deg 27, pr 0.035378)\n  lib/errors.ts (deg 9, pr 0.032787)\n  lib/db/queries.ts (deg 14, pr 0.030085)\n  โ€ฆ\n
\n

--symbols [N] โ€” top ranked symbols (Aider-style)

\n

The most important individual symbols across the repo, ranked by the identifier graph\n(defaults to 30).

\n
$ node agentmap.mjs --symbols 10\ntop 10 ranked symbols (Aider-style):\n  0.109902  lib/utils.ts โ†’ cn (FunctionDeclaration)\n  0.036013  lib/types.ts โ†’ ChatMessage (TypeAliasDeclaration)\n  0.025686  components/chat/artifact.tsx โ†’ ArtifactKind (TypeAliasDeclaration)\n  0.022461  lib/errors.ts โ†’ ChatbotError (ClassDeclaration)\n  0.021068  lib/types.ts โ†’ CustomUIDataTypes (TypeAliasDeclaration)\n  0.020872  lib/db/schema.ts โ†’ Document (TypeAliasDeclaration)\n  0.020555  components/ai-elements/suggestion.tsx โ†’ Suggestion (VariableDeclaration)\n  0.020555  lib/db/schema.ts โ†’ Suggestion (TypeAliasDeclaration)\n  0.018124  lib/db/schema.ts โ†’ DBMessage (TypeAliasDeclaration)\n  0.015034  lib/errors.ts โ†’ ErrorCode (TypeAliasDeclaration)\n
\n

--map [--tokens N] [--focus <path>] โ€” token-budgeted ranked digest

\n

The token-budgeted digest (Aider's killer feature): a ranked, files-and-symbols summary\nthat fits a token budget. Default budget is 8192 (1024 with --focus). --focus <path>\npersonalizes the ranking toward a file you're working on.

\n
$ node agentmap.mjs --map --tokens 400\n# agentmap (154 files, sha 2becdb4) โ€” focus: global, budget ~400 tok\n\nlib/utils.ts:\n  cn (FunctionDeclaration)\n  generateUUID (FunctionDeclaration)\n\nlib/types.ts:\n  ChatMessage (TypeAliasDeclaration)\n  CustomUIDataTypes (TypeAliasDeclaration)\n  ChatTools (TypeAliasDeclaration)\n  Attachment (TypeAliasDeclaration)\n\ncomponents/chat/artifact.tsx:\n  ArtifactKind (TypeAliasDeclaration)\n  UIArtifact (TypeAliasDeclaration)\n  Artifact (VariableDeclaration)\n\nlib/errors.ts:\n  ChatbotError (ClassDeclaration)\n  ErrorCode (TypeAliasDeclaration)\n\nlib/db/schema.ts:\n  Document (TypeAliasDeclaration)\n  Suggestion (TypeAliasDeclaration)\n  DBMessage (TypeAliasDeclaration)\n\n# ~387 tokens (14 files shown)\n
\n

Focused on a working file โ€” the ranking re-centers on what lib/db/queries.ts actually touches:

\n
$ node agentmap.mjs --map --focus lib/db/queries.ts --tokens 350\n# agentmap (154 files, sha 2becdb4) โ€” focus: lib/db/queries.ts, budget ~350 tok\n\nlib/utils.ts:\n  cn (FunctionDeclaration)\n  generateUUID (FunctionDeclaration)\n  getDocumentTimestampByIndex (FunctionDeclaration)\n  fetcher (VariableDeclaration)\n  getTextFromMessage (FunctionDeclaration)\n  convertToUIMessages (FunctionDeclaration)\n  fetchWithErrorHandlers (FunctionDeclaration)\n  sanitizeText (FunctionDeclaration)\n\nlib/db/schema.ts:\n  DBMessage (TypeAliasDeclaration)\n  Suggestion (TypeAliasDeclaration)\n  Document (TypeAliasDeclaration)\n  Chat (TypeAliasDeclaration)\n  User (TypeAliasDeclaration)\n  chat (VariableDeclaration)\n  document (VariableDeclaration)\n  message (VariableDeclaration)\n\nlib/errors.ts:\n  ChatbotError (ClassDeclaration)\n  ErrorCode (TypeAliasDeclaration)\n\n# ~324 tokens (8 files shown)\n
\n

--print โ€” full map as JSON

\n

Dumps the cached map (hubs, features, rankedSymbols, files) as one JSON object โ€”\nfor piping into other tools. Also includes a top-level fileCount.

\n
$ node agentmap.mjs --print | jq '.hubs[0]'\n\"lib/utils.ts (deg 52, pr 0.105171)\"\n
\n

--export <mermaid|dot> โ€” visualize the import graph

\n

Serializes the file import graph (nodes = files, edges = imports, top-N by PageRank, with\nthree light style tiers) as Graphviz DOT or Mermaid โ€” paste straight into\nmermaid.live, a GitHub README mermaid block, or dot -Tsvg.\n--focus <path> scopes to a file's 1-hop neighborhood. It reads the cached map only (no\nts-morph Project), and prints graph text to stdout (so it isn't combined with --json).

\n
$ node agentmap.mjs --export mermaid --focus lib/auth.ts\n%% agentmap import graph โ€” 154 files, sha a1b2c3d, focus lib/auth.ts\nflowchart TD\n  classDef hub fill:#d9d9d9,stroke:#333,stroke-width:2px;\n  n0[\"lib/auth.ts\"]:::hub\n  โ€ฆ\n
\n

Global flags

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FlagDescription
--help / -hPrint a usage block listing every flag and exit 0.
--version / -vPrint the version from package.json and exit 0.
--jsonGlobal modifier. When present, every command prints exactly one JSON object to stdout (no prose). Shapes vary per command: --json --hubs โ†’ {command,fileCount,sha,hubs:[string]}, --json --find X โ†’ {command,query,matches:[{file,name,kind}]}, --json --relates X โ†’ {command,file,pagerank,exports,imports,dependents,related}, --json --any X โ†’ {command,query,kind,โ€ฆpayload}, etc. Bare --json (no query flag) โ†’ {command:\"build\",fileCount,features,topHub}.
--no-localsHide non-exported top-level declarations from --find/--any results (shown by default). Never affects --map/--symbols/--hubs ranking.
--include-dtsInclude .d.ts declaration files in the symbol/ranking pass (excluded by default so generated types don't flood --find/--symbols/--hubs).
--install-hooks [--dry-run]Copy hooks/post-commit into .git/hooks/ (chmod 0755), ensure .claude/agentmap/ is in .gitignore, and auto-wire the Claude Code PreToolUse(Grep) nudge into .claude/settings.json (merge-safe + idempotent). --dry-run previews without writing. Exit 0 on success, stderr + exit 3 on failure.
--hook-statusReport whether the post-commit hook, PreToolUse nudge, and .gitignore entry are installed (no writes).
--doctorRead-only harness health report: git/Claude hook wiring, installed skills + Cursor rule freshness vs package.json version, MCP config entries for OpenCode/Antigravity, and map-cache presence/freshness hints. Always exits 0; suggests fix commands (agentmap --install-hooks, --install-skill, --setup-mcp, agentmap) but never runs them. Combine with --json for a structured report.
--install-skillInstall skills + always-on docs/hooks per platform (--platform claude|cursor|codex|opencode|gemini|antigravity|copilot|agents|all, default all; --project default, or --global; --dry-run preview).
--setup-mcp [--dry-run]Configure agentmap as an MCP server for OpenCode and the Antigravity IDE (merge-safe). --dry-run previews without writing.
--mcpStart agentmap as a stdio MCP server so non-Claude-Code agents (Cursor, Cline, any MCP client) can query the map. Exposes 11 query tools โ€” any, find, relates, map, hubs, features, feature, symbols, search, callers, calls.
\n

Exit-code contract: 0 = success / match / help / version; 1 = query returned zero results (--any, --find, --relates, --feature with no match, or --map --focus that resolves to no file โ€” the global digest still prints, with focusResolved:false in --json); 2 = usage error (missing required arg, unknown flag, two commands at once, or a sub-flag without its parent command); 3 = maintenance command failed (--install-hooks, --install-skill, --setup-mcp, --hook-status, --mcp). Any token starting with - that matches no known flag prints an error to stderr and exits 2.

\n
\n

Scope & limitations

\n

Honesty first โ€” this is deliberately a small, sharp tool, not a universal code-graph.

\n\n
\n

Contributing

\n

Issues and PRs welcome. High-value directions:

\n\n

Keep the dependency footprint minimal โ€” ts-morph is the only runtime dependency (it bundles\nthe TypeScript compiler, ~10 MB installed), and keeping it that way is a feature.

\n

License

\n

MIT. Symbol-ranking algorithm credit: Aider (Apache-2.0).

\n" @@ -1090,8 +1090,8 @@ "stars": 39, "forks": 4, "topics": [], - "updatedAt": "2026-07-17T04:24:06Z", - "pushedAt": "2026-07-17T04:12:10Z", + "updatedAt": "2026-07-21T05:26:01Z", + "pushedAt": "2026-07-21T09:06:02Z", "latestRelease": { "name": "Tycho v0.7.4", "tagName": "v0.7.4", @@ -1102,7 +1102,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-05-23T01:58:17Z", "openIssues": 2, - "openPullRequests": 0, + "openPullRequests": 1, "subscribers": 1, "communityHealth": 100, "readmeHtml": "

Tycho

\n

Tycho - Factorio for Agents.

\n

Tycho is a local-first control center for supervising managed coding agents\nacross many projects. It keeps project context, agent sessions, schedules,\nlogs, attachments, and follow-up questions in one operator workflow, with both\na terminal UI and an optional lightweight Remote UI for checking agent state\nfrom a browser on your local network or tailnet.

\n

Screenshots

\n

\n \"Tycho\n

TUI

\n\n\n\n\n\n\n\n\n\n\n\n
Agents dashboardNew project
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Chat composerAttachment picker
\"Tycho\"Tycho
\n

Remote UI

\n\n\n\n\n\n\n\n\n\n\n\n
Needs attentionAgents
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Chat composerAttachment preview
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Remote connection switcherAgent switcher
\"Tycho\"Tycho
\n

Status

\n

Tycho is early open-source software. It is designed around a single-operator\nworkflow and is currently macOS-first for packaged installs. Source installs\nalso work on Linux-style environments where Ruby and the optional agent CLIs\nare available, and Tycho has been tested on Windows 11 through WSL.

\n

Features

\n\n

Requirements

\n\n

Tycho can run without every optional tool, but features backed by missing tools\nwill show as unavailable.

\n

See docs/SETUP_REQUIREMENTS.md for the\ndependency checklist and hard/soft failure policy used by bin/setup.

\n

Installation

\n

Homebrew

\n

Homebrew is the primary install path for users:

\n
brew tap firewalker06/tycho\nbrew install tycho\ntycho\n
\n

The formula installs one executable, tycho. Remote Sessions and scheduled\nagents run through subcommands:

\n
tycho serve\ntycho schedule daemon\n
\n

Optional integrations are intentionally not installed by the formula. Install\nClaude-compatible harnesses only for the features you use.

\n

Source Checkout

\n

Use a source checkout when contributing or when Homebrew is not suitable.

\n

One-line setup:

\n
curl -fsSL https://raw.githubusercontent.com/firewalker06/tycho/main/setup.sh | bash\ncd tycho\nbin/tycho\n
\n

Pass setup options after bash -s --:

\n
curl -fsSL https://raw.githubusercontent.com/firewalker06/tycho/main/setup.sh | bash -s -- --profile codex\n
\n

Set TYCHO_DIR to clone into a different directory, or TYCHO_REPO_URL to use\nanother Git remote.

\n

Manual source setup:

\n
git clone https://github.com/firewalker06/tycho.git tycho\ncd tycho\nbin/setup\nbin/tycho\n
\n

bin/setup installs gems, creates missing user config files from examples\nunder ~/.tycho, and prints hard failures plus soft feature warnings for\noptional tools. Use bin/setup --check to inspect readiness without changing\nfiles, or pass feature profiles such as bin/setup --profile codex or\nbin/setup --profile claude to make those optional tools mandatory.

\n

Run through Bundler if your shell has conflicting gem versions:

\n
bundle exec bin/tycho\n
\n

Command mapping for source users:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Homebrew commandSource checkout command
tychobin/tycho
tycho servebin/tycho serve
tycho schedule daemonbin/tycho schedule daemon
\n

Configuration

\n

Project definitions live in ~/.tycho/config/hq.yml by default.

\n
projects:\n  - key: my-workspace\n    name: My Workspace\n    group: Personal\n    path: /Users/you/Code/my-workspace\n    agent: codex\n
\n

System prompt templates live beside the project registry as\nsystem_prompts.yml.

\n

Tycho also appends a cross-harness writing policy from response_style.md to\nevery cold and resumed execution. Set response_style on a project or\nstructured prompt template to replace the global text, or set it to false to\ndisable the policy for that scope. Explicit output formats, schemas, code,\nquotations, and user-requested genres take precedence over this default.\nThe global file can be edited from Settings โ†’ Configuration in Remote UI;\nTycho saves it atomically to ~/.tycho/config/response_style.md by default.

\n

Real config files, .env, runtime logs, and generated agent artifacts are\ngitignored. Keep secrets and machine-specific paths out of committed files.\nRuntime state and logs default to ~/.tycho/logs.

\n

Where Tycho Writes Files

\n

Homebrew and source installs use the same user-scoped defaults:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PurposeDefault
Project registry~/.tycho/config/hq.yml
System prompts~/.tycho/config/system_prompts.yml
Response style policy~/.tycho/config/response_style.md
Schedules~/.tycho/config/schedules.yml
Schedule prompt files~/.tycho/schedules/
Hooks~/.tycho/config/hooks.yml
Remote server peersremote_servers in ~/.tycho/config/hq.yml
Runtime state and logs~/.tycho/logs/
Project logs~/.tycho/logs/projects/
Agent logs and artifacts~/.tycho/logs/agents/
Browser push state~/.tycho/logs/push_*.json and ~/.tycho/logs/web_push_vapid.json
\n

Tycho does not write runtime files under the Homebrew Cellar. Set the\nTYCHO_* environment variables below to move config or state for tests,\ntemporary runs, or multi-profile setups.

\n

Environment Variables

\n

Use the TYCHO_ prefix for runtime overrides.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariablePurpose
TYCHO_HOMEOverride the default ~/.tycho root.
TYCHO_CONFIG_DIROverride the default user config directory.
TYCHO_CONFIG_PATHOverride the project registry path.
TYCHO_SYSTEM_PROMPTS_PATHOverride the system prompt template path.
TYCHO_RESPONSE_STYLE_PATHOverride the global response style policy path.
TYCHO_SCHEDULES_PATHOverride scheduled-agent config path.
TYCHO_SCHEDULES_ROOTOverride schedule message file root.
TYCHO_HOOKS_PATHOverride global hooks config path.
TYCHO_LOGS_ROOTOverride runtime state and logs root.
TYCHO_SCHEDULES_STATE_PATHOverride scheduler runtime state path.
TYCHO_SCHEDULER_DAEMON_PATHOverride scheduler daemon heartbeat path.
TYCHO_CODEX_BINOverride Codex executable lookup.
TYCHO_CLAUDE_BINOverride Claude executable lookup.
TYCHO_TAILSCALE_BINOverride Tailscale executable lookup.
TYCHO_REMOTE_TOKENRequire bearer auth for non-local Remote UI/API access.
TYCHO_LOG_LEVELSet Tycho's log level, such as DEBUG or INFO.
\n

Web Push can also use TYCHO_WEB_PUSH_VAPID_PUBLIC_KEY,\nTYCHO_WEB_PUSH_VAPID_PRIVATE_KEY, and TYCHO_WEB_PUSH_VAPID_SUBJECT.

\n

Commands

\n

Homebrew users run tycho. Source checkout users can replace tycho with\nbin/tycho in the examples below.

\n

Open the TUI:

\n
tycho\n
\n

Start the Remote Sessions server:

\n
tycho serve\n
\n

Bind explicitly to localhost:

\n
tycho serve --host 127.0.0.1 --port 7373\n
\n

Manage projects without opening the TUI:

\n
# Quick creation uses the current directory and derives the display name.\ntycho project my-workspace\n\n# The explicit form accepts the same options.\ntycho project create my-workspace \\\n  --path ~/Code/my-workspace \\\n  --name \"My Workspace\" \\\n  --group Personal \\\n  --harness codex \\\n  --model gpt-5.5 \\\n  --reasoning-effort medium\n\ntycho project show my-workspace\ntycho project update my-workspace --group Work --model=\"\"\ntycho project archive my-workspace\n
\n

Create and update also accept --response-style, --pr-url, and a\n--hidden=true|false|inherit visibility override. Add --json to any project\ncommand for script-friendly output. Archive rejects projects with running\nagents; otherwise it moves the project configuration and logs to their normal\narchive locations and archives all managed agents owned by the project.

\n

Connect one Remote UI to multiple Tycho servers by adding remote_servers to\n~/.tycho/config/hq.yml:

\n
remote_servers:\n  - key: vps\n    name: VPS\n    url: http://vps-cd946cb7.tail952bf7.ts.net:7373\n    token_env: TYCHO_VPS_REMOTE_TOKEN\n
\n

The Remote UI always includes the local server and can switch to configured\npeers from Settings or the top-right menu. Agents, projects, schedules, drafts,\nattachments, and mutations are scoped to the active server; Tycho does not\nmerge state across servers.

\n

Run scheduled agents:

\n
tycho schedule list\ntycho schedule daemon --once --dry-run\ntycho schedule daemon\n
\n

Manage schedules without opening the TUI:

\n
tycho schedule validate\ntycho schedule list\ntycho schedule run <schedule-key>\ntycho schedule pause <schedule-key>\ntycho schedule resume <schedule-key>\ntycho schedule reload\n
\n

Run a non-interactive runtime smoke check:

\n
tycho doctor\n
\n

The TUI includes a Schedules screen, and the Remote UI Now view shows\nscheduler daemon freshness plus schedule state. Schedule rows use three\noperator-facing statuses: scheduled, paused, and stopped. Last outcome\ndetails such as failed runs or interactive protection are shown separately. The\nRemote UI keeps the schedule card compact by showing daemon status, PID, and\nlast tick in the header, while schedule rows show project, next run, and a\nhumanized cron cadence such as every 15 minutes.

\n

Scheduled Agents

\n

Schedules create fresh managed agents for projects. They do not run shell\ncommands directly and do not resume old agent sessions. This keeps recurring\nwork reviewable and prevents stale context from accumulating across runs.

\n

Definitions live in ~/.tycho/config/schedules.yml, which is local and gitignored.\nLong prompts should live as Markdown files under ~/.tycho/schedules/.

\n
schedules:\n  - key: pull-request-review\n    name: Pull request review\n    enabled: true\n    cron: \"*/15 * * * *\"\n    timezone: local\n    target:\n      type: agent\n      project_key: my-workspace\n      name: Pull request review\n      message_source: file\n      message_file: schedules/pull-request-review.md\n    policy:\n      overlap: skip\n      missed: run_once_on_start\n      archive_previous_agent: true\n
\n

Use message_source: inline with message: \"...\" for short prompts. Use\nmessage_source: file and message_file: schedules/<name>.md for anything\nlonger than a few lines. Tycho validates cron syntax, project references, and\nthat prompt files stay inside ~/.tycho/schedules/.

\n

Each run automatically appends Tycho's final-output attachment checklist to the\nscheduled prompt, so reports, Markdown files, PRs, reviews, images, and other\ndurable artifacts should be returned in attachments.\nno_action_needed is reserved for successful observational checks where no new\ncondition required action; completed changes, answers, commits, reviews, and\ndeliverables use success even when no next step remains.

\n

Prompt tips for reliable schedules:

\n\n

If you converse with a scheduled agent, Tycho protects that session. A later\ndue run stops the schedule with reason interactive instead of archiving the\nuser-touched agent. Resume the stopped schedule when you want Tycho to archive\nthe active scheduled session and wait for the next scheduled run with fresh\ncontext.

\n

tycho schedule daemon writes daemon heartbeat state to ~/.tycho/logs/scheduler_daemon.json.\nThe schedule UI treats a missing or stale heartbeat as daemon attention. If it\nfinds a running scheduler process without heartbeat state, it reports the\ndaemon as untracked; restart tycho schedule daemon to restore tick freshness.

\n

TUI Tutorial

\n

Start the TUI:

\n
tycho\n
\n

Create A Project

\n
    \n
  1. Press 2 to switch to the Projects screen.
  2. \n
  3. Press N to open the New Project form.
  4. \n
  5. Enter the local project path first. Tycho will offer path suggestions and can\nprefill the project key/name as you tab through the form.
  6. \n
  7. Fill in the project key, name, and group.
  8. \n
  9. Use left/right arrows on the Agent field to choose the default harness\n(codex, claude, or a configured custom harness).
  10. \n
  11. Tab to Create Project and press Enter.
  12. \n
\n

Tycho writes the project entry to ~/.tycho/config/hq.yml, selects the new\nproject, and starts a metadata refresh.

\n

Create A Project Agent

\n
    \n
  1. Stay on the Projects screen and select the project with j/k.
  2. \n
  3. Press n to open the Create Agent form for that project.
  4. \n
  5. Use left/right arrows to choose the prompt template and harness.
  6. \n
  7. Fill in the agent name and prompt. Use Shift+Enter, Alt+Enter, or ctrl+j\nfor new lines inside the prompt.
  8. \n
  9. Choose Create Agent to save the agent without starting it, or choose\nCreate and Run Agent to start it immediately.
  10. \n
\n

After creation, Tycho switches to the Agents screen, selects the new agent, and\nopens its chat panel.

\n

Converse With An Agent

\n
    \n
  1. Press 1 to switch to the Agents screen.
  2. \n
  3. Select an agent with j/k.
  4. \n
  5. Press c or Enter to open the agent chat panel.
  6. \n
  7. Type your message. Use Shift+Enter, Alt+Enter, or ctrl+j for multiline\nprompts.
  8. \n
  9. Press Enter or ctrl+s to send. If the agent is idle, Tycho starts it\nautomatically.
  10. \n
\n

While in chat, use Tab/Shift+Tab to move between the prompt, conversation, and\nsummary areas. L opens the selected agent's raw log from the Agents screen,\nand ctrl+t opens an interactive terminal session for the selected agent.

\n

Remote UI Security

\n

tycho serve is local-first. If TYCHO_REMOTE_TOKEN is unset, API requests are\naccepted without authentication. This is intended only for localhost.

\n

Set a token before binding to Tailscale or any non-loopback address:

\n
TYCHO_REMOTE_TOKEN=\"$(ruby -rsecurerandom -e 'puts SecureRandom.hex(24)')\" tycho serve\n
\n

When Tailscale HTTPS Serve is available, Tycho can print an HTTPS MagicDNS\nRemote UI URL and QR code. Public screenshots should redact MagicDNS URLs,\nTailscale IPs, and QR codes.

\n

For multiple Remote servers, the browser still talks only to the Tycho server\nthat served the UI. That local server brokers requests to the selected peer,\nusing token_env values from local config or per-browser peer tokens entered\nin Settings. Browser-entered peer tokens are not written to hq.yml.

\n

Custom Claude Harnesses

\n

Tycho has built-in codex, claude, and opencode harnesses. To run Claude\nthrough a wrapper, define a custom harness in ~/.tycho/config/hq.yml and use\nits key as a project or template agent:

\n
custom_harnesses:\n  - key: claude-wrapper\n    adapter: claude\n    execution_command: /Users/you/bin/claude-wrapper\n\nprojects:\n  - key: my-workspace\n    name: My Workspace\n    group: Personal\n    path: /Users/you/Code/my-workspace\n    agent: claude-wrapper\n
\n

execution_command may be a shell string or an argv list. The command must be\nClaude-compatible because Tycho appends Claude CLI flags for stream-json output,\nstructured result schemas, and native session resume.

\n

Use TYCHO_CODEX_BIN, TYCHO_CLAUDE_BIN, or another documented environment\noverride when a harness executable is not on PATH.

\n

Tests

\n

Run the main test suite:

\n
bin/test\n
\n

Run an individual test:

\n
bundle exec ruby test/rendering_test.rb\n
\n

Known Limitations

\n\n

Documentation

\n\n

Contributing

\n

See CONTRIBUTING.md and CODE_OF_CONDUCT.md.

\n

Security

\n

See SECURITY.md.

\n

License

\n

Tycho is released under the MIT License. See LICENSE.

\n" @@ -1214,7 +1214,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-04-09T16:08:42Z", - "openIssues": 0, + "openIssues": 1, "openPullRequests": 0, "subscribers": 2, "communityHealth": 42, @@ -1633,8 +1633,8 @@ "windows-app", "windows-desktop" ], - "updatedAt": "2026-07-20T14:10:16Z", - "pushedAt": "2026-07-20T14:11:33Z", + "updatedAt": "2026-07-21T05:40:00Z", + "pushedAt": "2026-07-21T05:44:30Z", "latestRelease": { "name": "v0.3.2", "tagName": "v0.3.2", From 64c18e02ee9ae11756c2d62f2fefcabe613f50d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:47:23 +0000 Subject: [PATCH 02/25] Sync content data --- src/data/projects.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index e299e44..a1dbd05 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -9,7 +9,7 @@ "url": "https://github.com/faisalman/ua-parser-js", "homepage": "https://uaparser.dev/", "language": "JavaScript", - "stars": 10166, + "stars": 10167, "forks": 1220, "topics": [ "analytics", @@ -21,7 +21,7 @@ "user-agent", "user-agent-parser" ], - "updatedAt": "2026-07-20T20:25:02Z", + "updatedAt": "2026-07-21T11:48:35Z", "pushedAt": "2026-07-20T18:03:11Z", "latestRelease": { "name": "v2.0.10", @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 352, + "openIssues": 353, "openPullRequests": 6, "subscribers": 110, "communityHealth": 50, @@ -253,7 +253,7 @@ "url": "https://github.com/Drenzzz/ADBKit", "homepage": "", "language": "TypeScript", - "stars": 326, + "stars": 327, "forks": 38, "topics": [ "adb", @@ -264,7 +264,7 @@ "wails", "wails-app" ], - "updatedAt": "2026-07-15T07:04:27Z", + "updatedAt": "2026-07-21T11:20:49Z", "pushedAt": "2026-07-15T07:04:13Z", "latestRelease": { "name": "v1.3", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T10:05:21Z", - "pushedAt": "2026-07-21T10:21:32Z", + "updatedAt": "2026-07-21T10:37:52Z", + "pushedAt": "2026-07-21T10:37:02Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,7 +324,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 10, + "openIssues": 9, "openPullRequests": 0, "subscribers": 4, "communityHealth": 71, @@ -352,13 +352,13 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-20T09:52:59Z", - "pushedAt": "2026-07-21T10:29:22Z", + "updatedAt": "2026-07-21T12:20:47Z", + "pushedAt": "2026-07-21T12:21:09Z", "latestRelease": { - "name": "v3.1.3", - "tagName": "v3.1.3", - "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.1.3", - "publishedAt": "2026-07-10T01:05:20Z" + "name": "v3.1.4", + "tagName": "v3.1.4", + "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.1.4", + "publishedAt": "2026-07-21T12:21:09Z" }, "archived": false, "licenseSpdx": "", @@ -841,7 +841,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-06-11T13:28:54Z", "openIssues": 3, - "openPullRequests": 3, + "openPullRequests": 2, "subscribers": 0, "communityHealth": 100, "readmeHtml": "

bansos.dev

\n

\"npm\n\"License:\n\"Built\n\"Deploy:\n\"Discord\"\n\"Telegram\"\n\"WhatsApp\"

\n

\"Bansos

\n

๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia (Default) ยท ๐ŸŒ English

\n
\n

๐ŸŒ Bahasa Indonesia (Default)

\n

Bantuan sosial untuk developer jelata

\n

bansos.dev adalah open-source katalog info bagi-bagi berkah, promo gratisan, dan diskonan tools coding paling legit khusus untuk developer jelata di Indonesia. Dibuat biar portofolio kita-kita tetep menyala walau dompet lagi sekarat. Nyari domain gratis, hosting free-tier, cloud credits, API credits, database gratisan, atau startup credits? Di sini tempat ngumpulnya! 100% Gratisan, No Clickbait, No Ribet. fr fr ๐Ÿš€

\n

Situs ini dibangun sebagai static SvelteKit site yang super SEO-friendly, data-driven, aman di mode terang/gelap, dan gampang banget buat dikontribusikan lewat email atau merge request.

\n

Keyword cepat

\n

bansos developer, promo developer Indonesia, domain gratis, cloud credits gratis, API credits, hosting free tier, startup credits, developer tools gratis, open source Indonesia, SvelteKit static site.

\n

Fitur utama

\n\n

Deploy dan Hosting

\n

Situs ini di-deploy dan di-hosting menggunakan Cloudflare Pages dengan adapter @sveltejs/adapter-cloudflare. Setiap kali ada merge request atau push ke branch main, Cloudflare secara otomatis memicu build dan mendistribusikan situs statis super cepat beserta seluruh dynamic OG image yang sudah di-prerender.

\n

Menjalankan proyek

\n
npm install\nnpm run dev\nnpm run build\n
\n

Validasi lokal:

\n
npm run check\nnpm run lint\n
\n

Struktur penting

\n
src/lib/data/bansos.json       # data utama listing bansos\nsrc/lib/data/bansos.ts         # helper selector, sorting, dan contributor stats\nsrc/lib/components/            # komponen UI reusable\nsrc/routes/list/               # halaman list dan detail bansos\nsrc/routes/contribute/         # panduan kontribusi publik\nscripts/add-bansos.mjs         # script lokal tambah data\npackages/bansosdev-cli/        # CLI bansosdev (disabled untuk submit publik)\n
\n

Cara Menambah Bansos

\n

Untuk saat ini, submit publik yang aktif adalah via email dan Git clone. Jalur form, npx CLI, dan bot dinonaktifkan sementara karena spam.

\n
\n

[!TIP]\nSoon: Submisi via Discord & Telegram Bot!\nKami sedang membangun integrasi bot agar kamu bisa mengirimkan bansos baru secara otomatis langsung dari server Discord atau channel Telegram.\nSembari menunggu, yuk gabung ke komunitas kami:

\n\n
\n

1. Opsi 1: Lewat Email

\n

Opsi ini sangat cocok buat kamu yang ingin berbagi info dengan cepat tanpa perlu menyentuh terminal.

\n
    \n
  1. Buka halaman kontribusi di browser: bansos.dev/contribute.
  2. \n
  3. Pilih tab Email.
  4. \n
  5. Kirim usulan ke submit@bansos.dev memakai template yang tersedia.
  6. \n
  7. Pastikan semua field penting terisi: judul, provider, benefit, syarat klaim, link resmi, status, sumber, dan kontributor.
  8. \n
\n
\n

2. Opsi 2: Lewat Command Line (npx CLI) - Dinonaktifkan

\n

Submit publik via npx bansosdev add sedang dinonaktifkan sementara karena spam. Dokumentasi CLI tetap disimpan untuk maintainer dan pengujian lokal, tetapi jangan dipakai untuk submit publik saat ini.

\n
npx bansosdev add\n
\n

CLI akan menuntunmu mengisi field demi field untuk menyiapkan data lokal.

\n

Kamu juga bisa mengirimkan data langsung menggunakan argumen CLI:

\n
npx bansosdev add \\\n  --id contoh-bansos \\\n  --title \"Contoh Bansos Developer\" \\\n  --provider \"Example Provider\" \\\n  --description \"Deskripsi singkat bansos.\" \\\n  --benefits \"Benefit satu|Benefit dua\" \\\n  --validity-type fixed \\\n  --validity-date 2026-06-30 \\\n  --validity-desc \"Berlaku khusus pelajar\" \\\n  --published-at 2026-06-13 \\\n  --requirements \"Buat akun|Klaim program\" \\\n  --cta-link \"https://example.com\" \\\n  --contributor-name \"Nama Kamu\" \\\n  --contributor-url \"https://example.com\" \\\n  --tags \"Cloud,Gratisan\"\n
\n

Parameter validity

\n\n
\n

Catatan Otomatisasi:

\n\n
\n

Cek payload JSON

\n
npx bansosdev add ... --mode json\n
\n
\n

3. Opsi 3: Lewat Git Clone (Manual Merge Request)

\n

Opsi ini bagi kamu yang ingin menguji kode secara lokal atau memodifikasi file secara langsung.

\n
    \n
  1. Clone repositori ini ke komputermu:

    \n
    git clone https://gitlab.com/wauputr4/bansos.git\ncd bansos\nnpm install\n
    \n
  2. \n
  3. Tambahkan data secara lokal menggunakan helper script:

    \n
    npm run add:bansos -- \\\n  --id contoh-bansos \\\n  --title \"Contoh Bansos Developer\" \\\n  --provider \"Example Provider\" \\\n  --description \"Deskripsi singkat bansos.\" \\\n  --benefits \"Benefit satu|Benefit dua\" \\\n  --validity-type fixed \\\n  --validity-date 2026-06-30 \\\n  --requirements \"Buat akun|Klaim program\" \\\n  --cta-link \"https://example.com\" \\\n  --contributor-name \"Nama Kamu\" \\\n  --contributor-url \"https://example.com\" \\\n  --tags \"Cloud,Gratisan\"\n
    \n

    Script ini akan memvalidasi data dan menyimpannya di file data terstruktur src/lib/data/bansos.json.

    \n

    Argumen --benefits dan --requirements dipisahkan dengan |.\nArgumen --tags dipisahkan dengan koma.

    \n
  4. \n
  5. Buat branch baru, tambahkan commit, push ke fork, dan kirim merge request ke repositori utama.

    \n
  6. \n
\n
\n

Maintainer mode (Khusus Admin / Maintainer)

\n

Mode direct untuk submit otomatis sedang dinonaktifkan. Untuk perubahan maintainer, gunakan Git clone, commit manual, dan merge request ke main.

\n
npx bansosdev add ... --mode json\n
\n

Perintah di atas hanya untuk mengecek payload JSON secara lokal.

\n

Detail lengkap CLI lihat docs/bansosdev-cli.md.

\n

Panduan kualitas listing

\n

Listing yang baik sebaiknya menyertakan:

\n\n

Kontribusi

\n\n

Kode etik komunitas

\n

Ikuti Code of Conduct.

\n

Sponsor & Dukungan

\n

Proyek bansos.dev dibangun secara gratis oleh komunitas. Jika proyek ini membantumu menghemat budget developer-mu, silakan kirim dukungan via email ke me@wau.my.id.

\n
\n

[!NOTE]\nSoon: Kami berencana menghadirkan fitur di mana donatur/pengunjung bisa mengirimkan dukungan (donasi) langsung ke masing-masing kontributor yang mendaftarkan/menulis listing bansos tersebut.

\n
\n

Lisensi

\n

MIT. Lihat LICENSE.

\n

Disclaimer

\n

bansos.dev adalah platform komunitas open-source yang bertujuan membantu sesama developer Indonesia menemukan program bantuan sosial yang sah dan legal dari provider resmi. Kami tidak terafiliasi dengan provider mana pun.

\n

Kami dengan tegas melarang:

\n\n

Semua informasi yang ditampilkan bersifat referensi. Selalu verifikasi langsung ke situs resmi provider sebelum melakukan klaim. Kami tidak bertanggung jawab atas perubahan kebijakan sepihak dari provider, interpretasi manfaat yang keliru, ataupun penyalahgunaan informasi oleh pihak tidak bertanggung jawab.

\n

Dengan menggunakan bansos.dev, Anda menyetujui bahwa platform ini hanyalah katalog komunitas dan segala klaim, transaksi, atau interaksi dengan provider sepenuhnya merupakan tanggung jawab pribadi masing-masing pengguna.

\n" @@ -1091,7 +1091,7 @@ "forks": 4, "topics": [], "updatedAt": "2026-07-21T05:26:01Z", - "pushedAt": "2026-07-21T09:06:02Z", + "pushedAt": "2026-07-21T12:23:04Z", "latestRelease": { "name": "Tycho v0.7.4", "tagName": "v0.7.4", @@ -1399,8 +1399,8 @@ "linux", "omarchy" ], - "updatedAt": "2026-07-21T02:40:15Z", - "pushedAt": "2026-07-21T02:40:10Z", + "updatedAt": "2026-07-21T12:07:06Z", + "pushedAt": "2026-07-21T12:06:23Z", "latestRelease": { "name": "v0.2.2", "tagName": "v0.2.2", From d338acbffe88d087f170e75bec52ed2637fbbe76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 15:20:43 +0000 Subject: [PATCH 03/25] Sync content data --- src/data/projects.json | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index a1dbd05..b729ca1 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -58,18 +58,18 @@ "php-library" ], "updatedAt": "2026-07-15T07:13:39Z", - "pushedAt": "2026-07-10T11:30:02Z", + "pushedAt": "2026-07-21T15:05:37Z", "latestRelease": { - "name": "6.5.0", - "tagName": "6.5.0", - "url": "https://github.com/laravolt/avatar/releases/tag/6.5.0", - "publishedAt": "2026-06-10T18:03:38Z" + "name": "6.5.1", + "tagName": "6.5.1", + "url": "https://github.com/laravolt/avatar/releases/tag/6.5.1", + "publishedAt": "2026-07-21T14:34:28Z" }, "archived": false, "licenseSpdx": "MIT", "createdAt": "2015-10-12T07:01:40Z", - "openIssues": 4, - "openPullRequests": 2, + "openIssues": 2, + "openPullRequests": 5, "subscribers": 32, "communityHealth": 37, "readmeHtml": "

laravolt/avatar

\n

\"Total\n\"Monthly\n\"Daily\n\"Run

\n

\"Preview\"

\n

Display unique avatar for any user based on their (initials) name.

\n

Preview

\n

\"Preview\"

\n

:film_strip: Video Tutorial

\n

\n

Installation

\n

This package originally built for Laravel, but can also be used in any PHP project.

\n

Read more about integration with PHP project here.

\n

Laravel >= 5.2:

\n
composer require laravolt/avatar\n
\n

Laravel 5.1:

\n
composer require laravolt/avatar ~0.3\n
\n

Service Provider & Facade

\n

Note: only for Laravel 5.4 and below, because since Laravel 5.5 we use package auto-discovery.

\n
Laravolt\\Avatar\\ServiceProvider::class,\n\n...\n\n'Avatar'    => Laravolt\\Avatar\\Facade::class,\n
\n

Publish Config (optional)

\n
php artisan vendor:publish --provider=\"Laravolt\\Avatar\\ServiceProvider\"\n
\n

This will create config file located in config/laravolt/avatar.php.

\n

Lumen Service Provider

\n
$app->register(Laravolt\\Avatar\\LumenServiceProvider);\n
\n

Usage

\n

Output as base64

\n
//this will output data-uri (base64 image data)\n//something like data:image/png;base64,iVBORw0KGg....\nAvatar::create('Joko Widodo')->toBase64();\n\n//use in view\n//this will display initials JW as an image\n<img src=\"https://raw.githubusercontent.com/laravolt/avatar/master/%7B%7B%20Avatar::create('Joko%20Widodo')->toBase64()%20%7D%7D\" />\n
\n

Save as file

\n
Avatar::create('Susilo Bambang Yudhoyono')->save('sample.png');\nAvatar::create('Susilo Bambang Yudhoyono')->save('sample.jpg', 100); // quality = 100\n
\n

Output as Gravatar

\n
Avatar::create('uyab@example.net')->toGravatar();\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee\n\nAvatar::create('uyab@example.net')->toGravatar(['d' => 'identicon', 'r' => 'pg', 's' => 100]);\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee?d=identicon&r=pg&s=100\n
\n

Gravatar parameter reference: https://docs.gravatar.com/api/avatars/images/

\n

Output as SVG

\n
Avatar::create('Susilo Bambang Yudhoyono')->toSvg();\n
\n

You may specify custom font-family for your SVG text.

\n
<head>\n    <!--Prepare custom font family, using Google Fonts-->\n    <link href=\"https://fonts.googleapis.com/css?family=Laravolt\" rel=\"stylesheet\">\n\n    <!--OR-->\n\n    <!--Setup your own style-->\n    <style>\n    @font-face {\n        font-family: Laravolt;\n        src: url({{ asset('fonts/laravolt.woff')) }});\n    }\n    </style>\n</head>\n
\n
Avatar::create('Susilo Bambang Yudhoyono')->setFontFamily('Laravolt')->toSvg();\n
\n

You may make the SVG responsive. This excludes the height and width attributes.

\n
Avatar::create('Susilo Bambang Yudhoyono')->setResponsive()->toSvg();\n
\n

Get underlying Intervention image object

\n
Avatar::create('Abdul Somad')->getImageObject();\n
\n

The method will return an instance of Intervention image object, so you can use it for further purposes.

\n

Non-ASCII Character

\n

By default, this package will try to output any initials letter as it is. If the name supplied contains any non-ASCII character (e.g. ฤ, ฤš, วฝ) then the result will depend on which font used (see config). It the font supports characters supplied, it will successfully displayed, otherwise it will not.

\n

Alternatively, we can convert all non-ascii to their closest ASCII counterparts. If no closest coutnerparts found, those characters are removed. Thanks to Stringy for providing such useful functions. What we need is just change one line in config/avatar.php:

\n
    'ascii'    => true,\n
\n

Configuration

\n
<?php\n/*\n * Set specific configuration variables here\n */\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Image Driver\n    |--------------------------------------------------------------------------\n    | Avatar use Intervention Image library to process image.\n    | Meanwhile, Intervention Image supports \"GD Library\" and \"Imagick\" to process images\n    | internally. You may choose one of them according to your PHP\n    | configuration. By default PHP's \"Imagick\" implementation is used.\n    |\n    | Supported: \"gd\", \"imagick\"\n    |\n    */\n    'driver'    => 'gd',\n\n    // Initial generator class\n    'generator' => \\Laravolt\\Avatar\\Generator\\DefaultGenerator::class,\n\n    // Whether all characters supplied must be replaced with their closest ASCII counterparts\n    'ascii'    => false,\n\n    // Image shape: circle or square\n    'shape' => 'circle',\n\n    // Image width, in pixel\n    'width'    => 100,\n\n    // Image height, in pixel\n    'height'   => 100,\n\n    // Number of characters used as initials. If name consists of single word, the first N character will be used\n    'chars'    => 2,\n\n    // font size\n    'fontSize' => 48,\n\n    // convert initial letter in uppercase\n    'uppercase' => false,\n\n    // Right to Left (RTL)\n    'rtl' => false,\n\n    // Fonts used to render text.\n    // If contains more than one fonts, randomly selected based on name supplied\n    'fonts'    => [__DIR__.'/../fonts/OpenSans-Bold.ttf', __DIR__.'/../fonts/rockwell.ttf'],\n\n    // List of foreground colors to be used, randomly selected based on name supplied\n    'foregrounds'   => [\n        '#FFFFFF',\n    ],\n\n    // List of background colors to be used, randomly selected based on name supplied\n    'backgrounds'   => [\n        '#f44336',\n        '#E91E63',\n        '#9C27B0',\n        '#673AB7',\n        '#3F51B5',\n        '#2196F3',\n        '#03A9F4',\n        '#00BCD4',\n        '#009688',\n        '#4CAF50',\n        '#8BC34A',\n        '#CDDC39',\n        '#FFC107',\n        '#FF9800',\n        '#FF5722',\n    ],\n\n    'border'    => [\n        'size'  => 1,\n\n        // border color, available value are:\n        // 'foreground' (same as foreground color)\n        // 'background' (same as background color)\n        // or any valid hex ('#aabbcc')\n        'color' => 'background',\n\n        // border radius, only works for SVG\n        'radius' => 0,\n    ],\n\n    // List of theme name to be used when rendering avatar\n    // Possible values are:\n    // 1. Theme name as string: 'colorful'\n    // 2. Or array of string name: ['grayscale-light', 'grayscale-dark']\n    // 3. Or wildcard \"*\" to use all defined themes\n    'theme' => ['*'],\n\n    // Predefined themes\n    // Available theme attributes are:\n    // shape, chars, backgrounds, foregrounds, fonts, fontSize, width, height, ascii, uppercase, and border.\n    'themes' => [\n        'grayscale-light' => [\n            'backgrounds' => ['#edf2f7', '#e2e8f0', '#cbd5e0'],\n            'foregrounds' => ['#a0aec0'],\n        ],\n        'grayscale-dark' => [\n            'backgrounds' => ['#2d3748', '#4a5568', '#718096'],\n            'foregrounds' => ['#e2e8f0'],\n        ],\n        'colorful' => [\n            'backgrounds' => [\n                '#f44336',\n                '#E91E63',\n                '#9C27B0',\n                '#673AB7',\n                '#3F51B5',\n                '#2196F3',\n                '#03A9F4',\n                '#00BCD4',\n                '#009688',\n                '#4CAF50',\n                '#8BC34A',\n                '#CDDC39',\n                '#FFC107',\n                '#FF9800',\n                '#FF5722',\n            ],\n            'foregrounds' => ['#FFFFFF'],\n        ],\n    ]\n];\n
\n

Overriding config at runtime

\n

We can overriding configuration at runtime by using following functions:

\n
Avatar::create('Soekarno')->setDimension(100);//width = height = 100 pixel\nAvatar::create('Soekarno')->setDimension(100, 200); // width = 100, height = 200\nAvatar::create('Soekarno')->setBackground('#001122');\nAvatar::create('Soekarno')->setForeground('#999999');\nAvatar::create('Soekarno')->setFontSize(72);\nAvatar::create('Soekarno')->setFont('/path/to/font.ttf');\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc'); // size = 1, color = #aabbcc\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc', 10); // size = 1, color = #aabbcc, border radius = 10 (only for SVG)\nAvatar::create('Soekarno')->setShape('square');\n\n// Available since 3.0.0\nAvatar::create('Soekarno')->setTheme('colorful'); // set exact theme\nAvatar::create('Soekarno')->setTheme(['grayscale-light', 'grayscale-dark']); // theme will be randomized from these two options\n\n// chaining\nAvatar::create('Habibie')->setDimension(50)->setFontSize(18)->toBase64();\n
\n

Integration with other PHP project

\n
// include composer autoload\nrequire 'vendor/autoload.php';\n\n// import the Avatar class\nuse Laravolt\\Avatar\\Avatar;\n\n// create your first avatar\n$avatar = new Avatar($config);\n$avatar->create('John Doe')->toBase64();\n$avatar->create('John Doe')->save('path/to/file.png', $quality = 90);\n
\n

$config is just an ordinary array with same format as explained above (See Configuration).

\n

Support Us

\n

Buy Me A Coffee

\n

\""Buy

\n

Donate Via PayPal

\n

\"paypal\"

\n

Traktir Saya

\n

\"Trakteer

\n" @@ -124,7 +124,7 @@ "homepage": "", "language": "PHP", "stars": 1213, - "forks": 1166, + "forks": 1167, "topics": [ "opensid", "sistem-informasi-desa" @@ -141,7 +141,7 @@ "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", "openIssues": 353, - "openPullRequests": 6, + "openPullRequests": 7, "subscribers": 110, "communityHealth": 50, "readmeHtml": "

Selamat datang di OpenSID! ๐Ÿ‘‹

\"readme-image\"

\n

๐Ÿค” Apa itu OpenSID?

\n

OpenSID adalah Sistem Informasi Desa (SID) yang dikembangkan secara terbuka dan kolaboratif oleh komunitas yang peduli dengan SID.

\n

SID diharapkan dapat membantu pemerintah desa dalam beberapa hal berikut:

\n\n
\n

OpenSID bertujuan agar sebanyak mungkin desa di Indonesia dapat menerapkan sistem informasi untuk memajukan desa masing-masing..

\n
\n

Strategi pengembangan OpenSID adalah untuk:

\n\n

OpenSID dikelola di GitHub untuk:

\n\n

๐Ÿ“ƒ PEDOMAN PENGGUNAAN

\n

Panduan pemasangan dan penggunaan OpenSID tersedia di Panduan OpenSID.

\n

๐Ÿ“‘ Distribusi \"VERSI PUBLIK (UMUM)\" dan \"VERSI PREMIUM\":

\n\n

๐Ÿ“‘ Hak Cipta dan Lisensi Tambahan:

\n\n

๐Ÿ“‘ HAK CIPTA, SYARAT, DAN KETENTUAN

\n

Sistem Informasi Desa (SID) pertama kali dikembangkan oleh Combine Resource Institution sejak tahun 2009. Hak cipta awal dimiliki oleh Combine Resource Institution (http://lumbungkomunitas.net/).

\n

Sistem ini dikelola berdasarkan lisensi GNU General Public License Versi 3 (http://www.gnu.org/licenses/gpl.html).

\n

Versi GitHub ini dikembangkan sejak Mei 2016, gratis dan bebas dimanfaatkan serta dikembangkan oleh semua desa. Hak Cipta OpenSID kini dipegang oleh Perkumpulan Desa Digital Terbuka (https://opendesa.id), sebuah lembaga hukum yang dibentuk khusus untuk mengelola OpenSID.

\n

๐Ÿ’ป DEMO

\n\n

๐Ÿ’ฌ FORUM

\n

Bergabunglah dengan Forum Pengguna dan Pegiat OpenSID di Facebook atau di Telegram.
Forum ini bersifat informal, sebagai wadah berbagi informasi dan saling membantu dalam menggunakan dan mengembangkan OpenSID.

\n

๐Ÿค KEMBANGKAN BERSAMA

\n

Laporkan masalah, usulan, atau permintaan pengembangan OpenSID melalui issue GitHub.
Kontribusi dari komunitas SID sangat dihargai, baik untuk dokumentasi di Wiki OpenSID maupun untuk source code di repo utama.

\n

๐Ÿ’ฐ DONASI

\n

\"Backers\n\"Sponsors

\n

๐Ÿง‘ Pendukung

\n

Peduli OpenSID dan misi membangun desa? Dukung OpenSID di sini.

\n
\n

Atau donasi langsung melalui rekening bank. Info lengkap di sini.

\n
\n

โญ๏ธ Sponsor

\n

Apakah desa, lembaga, atau perusahaan Anda mendapat manfaat dari OpenSID?
Bantu kami mengembangkan OpenSID dengan menjadi sponsor.
Logo sponsor Anda akan tampil di sini dengan tautan ke situs Anda.

\n

\n

๐Ÿ‘จโ€๐Ÿ’ป KONTRIBUTOR

\n

Berikut adalah para kontributor luar biasa yang telah membantu mengembangkan OpenSID:

\n

\"Contributors\"

\n" @@ -291,8 +291,8 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 312, - "forks": 29, + "stars": 313, + "forks": 30, "topics": [ "ai-agents", "antigravity", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T10:37:52Z", - "pushedAt": "2026-07-21T10:37:02Z", + "updatedAt": "2026-07-21T14:28:11Z", + "pushedAt": "2026-07-21T14:23:41Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,11 +324,11 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 9, - "openPullRequests": 0, + "openIssues": 14, + "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, - "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent. Stop paying Claude to read 10,000 lines of terminal noise like a headphone for AI agent\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\nUp to 85% less tokens ยท Cross-Session Memory ยท ~40% faster ยท Zero hallucination triggers

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

npm install

\n

Without OMNI: 10,000 lines of \"Downloading...\", \"Extracting...\", and warnings. AI reads everything.
With OMNI: Package conflict. Node 20 required.

\n

terraform apply

\n

Without OMNI: 4,500 lines of unchanged execution plans.
With OMNI: The 3 resources that failed IAM permissions.

\n

docker build

\n

Without OMNI: Endless cache hits, layer hashes, and download progress bars.
With OMNI: Missing dependency libpq-dev at layer 12.

\n

pytest

\n

Without OMNI: 500 passing tests and verbose setup logs.
With OMNI: Only the 2 failed assertions and their stack traces.

\n

cargo build

\n

Without OMNI: 300 lines of compiling dependencies and warnings.
With OMNI: The exact line where the borrow checker failed.

\n

kubectl logs

\n

Without OMNI: Thousands of successful health checks and normal traffic logs.
With OMNI: The crash loop and panic stack trace.

\n

git diff

\n

Without OMNI: Formatting tweaks, generated lockfiles, and whitespace changes.
With OMNI: Only the core business logic changes.

\n

go test

\n

Without OMNI: Pages of standard output from passing packages.
With OMNI: The single nil pointer dereference.

\n

mvn package

\n

Without OMNI: Megabytes of \"Downloading from maven central\".
With OMNI: Compilation error in UserService.java.

\n

pip install

\n

Without OMNI: Resolution logs and wheel building outputs.
With OMNI: Dependency conflict with numpy.

\n

webpack / vite

\n

Without OMNI: 2,000 chunk asset lists and build times.
With OMNI: Missing module resolution in App.tsx.

\n

helm install

\n

Without OMNI: Entire rendered YAML output of all templates.
With OMNI: Pod scheduling failure due to missing secret.

\n

ansible-playbook

\n

Without OMNI: \"ok\" and \"skipped\" statuses for 50 servers.
With OMNI: The single \"failed\" task on web-03.

\n

GitHub Actions (CI/CD)

\n

Without OMNI: Complete workflow logs including environment setup.
With OMNI: Only the specific step that exited with code 1.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" + "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent. Stop paying Claude to read 10,000 lines of terminal noise like a headphone for AI agent\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" }, { "fullName": "hadziqmtqn/erd-builder-pro", @@ -788,13 +788,13 @@ "tauri", "terminal" ], - "updatedAt": "2026-07-20T01:29:59Z", - "pushedAt": "2026-07-20T01:29:54Z", + "updatedAt": "2026-07-21T12:58:32Z", + "pushedAt": "2026-07-21T12:58:04Z", "latestRelease": { - "name": "TEDI v0.3.92", - "tagName": "v0.3.92", - "url": "https://github.com/IlhamriSKY/TEDI/releases/tag/v0.3.92", - "publishedAt": "2026-07-20T03:31:45Z" + "name": "TEDI v0.3.93", + "tagName": "v0.3.93", + "url": "https://github.com/IlhamriSKY/TEDI/releases/tag/v0.3.93", + "publishedAt": "2026-07-21T13:18:57Z" }, "archived": false, "licenseSpdx": "Apache-2.0", @@ -1090,19 +1090,19 @@ "stars": 39, "forks": 4, "topics": [], - "updatedAt": "2026-07-21T05:26:01Z", - "pushedAt": "2026-07-21T12:23:04Z", + "updatedAt": "2026-07-21T12:51:10Z", + "pushedAt": "2026-07-21T12:52:14Z", "latestRelease": { - "name": "Tycho v0.7.4", - "tagName": "v0.7.4", - "url": "https://github.com/firewalker06/tycho/releases/tag/v0.7.4", - "publishedAt": "2026-07-06T11:00:29Z" + "name": "Tycho v0.8.0", + "tagName": "v0.8.0", + "url": "https://github.com/firewalker06/tycho/releases/tag/v0.8.0", + "publishedAt": "2026-07-21T12:52:15Z" }, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-05-23T01:58:17Z", "openIssues": 2, - "openPullRequests": 1, + "openPullRequests": 0, "subscribers": 1, "communityHealth": 100, "readmeHtml": "

Tycho

\n

Tycho - Factorio for Agents.

\n

Tycho is a local-first control center for supervising managed coding agents\nacross many projects. It keeps project context, agent sessions, schedules,\nlogs, attachments, and follow-up questions in one operator workflow, with both\na terminal UI and an optional lightweight Remote UI for checking agent state\nfrom a browser on your local network or tailnet.

\n

Screenshots

\n

\n \"Tycho\n

TUI

\n\n\n\n\n\n\n\n\n\n\n\n
Agents dashboardNew project
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Chat composerAttachment picker
\"Tycho\"Tycho
\n

Remote UI

\n\n\n\n\n\n\n\n\n\n\n\n
Needs attentionAgents
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Chat composerAttachment preview
\"Tycho\"Tycho
\n\n\n\n\n\n\n\n\n\n\n\n
Remote connection switcherAgent switcher
\"Tycho\"Tycho
\n

Status

\n

Tycho is early open-source software. It is designed around a single-operator\nworkflow and is currently macOS-first for packaged installs. Source installs\nalso work on Linux-style environments where Ruby and the optional agent CLIs\nare available, and Tycho has been tested on Windows 11 through WSL.

\n

Features

\n\n

Requirements

\n\n

Tycho can run without every optional tool, but features backed by missing tools\nwill show as unavailable.

\n

See docs/SETUP_REQUIREMENTS.md for the\ndependency checklist and hard/soft failure policy used by bin/setup.

\n

Installation

\n

Homebrew

\n

Homebrew is the primary install path for users:

\n
brew tap firewalker06/tycho\nbrew install tycho\ntycho\n
\n

The formula installs one executable, tycho. Remote Sessions and scheduled\nagents run through subcommands:

\n
tycho serve\ntycho schedule daemon\n
\n

Optional integrations are intentionally not installed by the formula. Install\nClaude-compatible harnesses only for the features you use.

\n

Source Checkout

\n

Use a source checkout when contributing or when Homebrew is not suitable.

\n

One-line setup:

\n
curl -fsSL https://raw.githubusercontent.com/firewalker06/tycho/main/setup.sh | bash\ncd tycho\nbin/tycho\n
\n

Pass setup options after bash -s --:

\n
curl -fsSL https://raw.githubusercontent.com/firewalker06/tycho/main/setup.sh | bash -s -- --profile codex\n
\n

Set TYCHO_DIR to clone into a different directory, or TYCHO_REPO_URL to use\nanother Git remote.

\n

Manual source setup:

\n
git clone https://github.com/firewalker06/tycho.git tycho\ncd tycho\nbin/setup\nbin/tycho\n
\n

bin/setup installs gems, creates missing user config files from examples\nunder ~/.tycho, and prints hard failures plus soft feature warnings for\noptional tools. Use bin/setup --check to inspect readiness without changing\nfiles, or pass feature profiles such as bin/setup --profile codex or\nbin/setup --profile claude to make those optional tools mandatory.

\n

Run through Bundler if your shell has conflicting gem versions:

\n
bundle exec bin/tycho\n
\n

Command mapping for source users:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Homebrew commandSource checkout command
tychobin/tycho
tycho servebin/tycho serve
tycho schedule daemonbin/tycho schedule daemon
\n

Configuration

\n

Project definitions live in ~/.tycho/config/hq.yml by default.

\n
projects:\n  - key: my-workspace\n    name: My Workspace\n    group: Personal\n    path: /Users/you/Code/my-workspace\n    agent: codex\n
\n

System prompt templates live beside the project registry as\nsystem_prompts.yml.

\n

Tycho also appends a cross-harness writing policy from response_style.md to\nevery cold and resumed execution. Set response_style on a project or\nstructured prompt template to replace the global text, or set it to false to\ndisable the policy for that scope. Explicit output formats, schemas, code,\nquotations, and user-requested genres take precedence over this default.\nThe global file can be edited from Settings โ†’ Configuration in Remote UI;\nTycho saves it atomically to ~/.tycho/config/response_style.md by default.

\n

Real config files, .env, runtime logs, and generated agent artifacts are\ngitignored. Keep secrets and machine-specific paths out of committed files.\nRuntime state and logs default to ~/.tycho/logs.

\n

Where Tycho Writes Files

\n

Homebrew and source installs use the same user-scoped defaults:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PurposeDefault
Project registry~/.tycho/config/hq.yml
System prompts~/.tycho/config/system_prompts.yml
Response style policy~/.tycho/config/response_style.md
Schedules~/.tycho/config/schedules.yml
Schedule prompt files~/.tycho/schedules/
Hooks~/.tycho/config/hooks.yml
Remote server peersremote_servers in ~/.tycho/config/hq.yml
Runtime state and logs~/.tycho/logs/
Project logs~/.tycho/logs/projects/
Agent logs and artifacts~/.tycho/logs/agents/
Browser push state~/.tycho/logs/push_*.json and ~/.tycho/logs/web_push_vapid.json
\n

Tycho does not write runtime files under the Homebrew Cellar. Set the\nTYCHO_* environment variables below to move config or state for tests,\ntemporary runs, or multi-profile setups.

\n

Environment Variables

\n

Use the TYCHO_ prefix for runtime overrides.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariablePurpose
TYCHO_HOMEOverride the default ~/.tycho root.
TYCHO_CONFIG_DIROverride the default user config directory.
TYCHO_CONFIG_PATHOverride the project registry path.
TYCHO_SYSTEM_PROMPTS_PATHOverride the system prompt template path.
TYCHO_RESPONSE_STYLE_PATHOverride the global response style policy path.
TYCHO_SCHEDULES_PATHOverride scheduled-agent config path.
TYCHO_SCHEDULES_ROOTOverride schedule message file root.
TYCHO_HOOKS_PATHOverride global hooks config path.
TYCHO_LOGS_ROOTOverride runtime state and logs root.
TYCHO_SCHEDULES_STATE_PATHOverride scheduler runtime state path.
TYCHO_SCHEDULER_DAEMON_PATHOverride scheduler daemon heartbeat path.
TYCHO_CODEX_BINOverride Codex executable lookup.
TYCHO_CLAUDE_BINOverride Claude executable lookup.
TYCHO_TAILSCALE_BINOverride Tailscale executable lookup.
TYCHO_REMOTE_TOKENRequire bearer auth for non-local Remote UI/API access.
TYCHO_LOG_LEVELSet Tycho's log level, such as DEBUG or INFO.
\n

Web Push can also use TYCHO_WEB_PUSH_VAPID_PUBLIC_KEY,\nTYCHO_WEB_PUSH_VAPID_PRIVATE_KEY, and TYCHO_WEB_PUSH_VAPID_SUBJECT.

\n

Commands

\n

Homebrew users run tycho. Source checkout users can replace tycho with\nbin/tycho in the examples below.

\n

Open the TUI:

\n
tycho\n
\n

Start the Remote Sessions server:

\n
tycho serve\n
\n

Bind explicitly to localhost:

\n
tycho serve --host 127.0.0.1 --port 7373\n
\n

Manage projects without opening the TUI:

\n
# Quick creation uses the current directory and derives the display name.\ntycho project my-workspace\n\n# The explicit form accepts the same options.\ntycho project create my-workspace \\\n  --path ~/Code/my-workspace \\\n  --name \"My Workspace\" \\\n  --group Personal \\\n  --harness codex \\\n  --model gpt-5.5 \\\n  --reasoning-effort medium\n\ntycho project show my-workspace\ntycho project update my-workspace --group Work --model=\"\"\ntycho project archive my-workspace\n
\n

Create and update also accept --response-style, --pr-url, and a\n--hidden=true|false|inherit visibility override. Add --json to any project\ncommand for script-friendly output. Archive rejects projects with running\nagents; otherwise it moves the project configuration and logs to their normal\narchive locations and archives all managed agents owned by the project.

\n

Connect one Remote UI to multiple Tycho servers by adding remote_servers to\n~/.tycho/config/hq.yml:

\n
remote_servers:\n  - key: vps\n    name: VPS\n    url: http://vps-cd946cb7.tail952bf7.ts.net:7373\n    token_env: TYCHO_VPS_REMOTE_TOKEN\n
\n

The Remote UI always includes the local server and can switch to configured\npeers from Settings or the top-right menu. Agents, projects, schedules, drafts,\nattachments, and mutations are scoped to the active server; Tycho does not\nmerge state across servers.

\n

Run scheduled agents:

\n
tycho schedule list\ntycho schedule daemon --once --dry-run\ntycho schedule daemon\n
\n

Manage schedules without opening the TUI:

\n
tycho schedule validate\ntycho schedule list\ntycho schedule run <schedule-key>\ntycho schedule pause <schedule-key>\ntycho schedule resume <schedule-key>\ntycho schedule reload\n
\n

Run a non-interactive runtime smoke check:

\n
tycho doctor\n
\n

The TUI includes a Schedules screen, and the Remote UI Now view shows\nscheduler daemon freshness plus schedule state. Schedule rows use three\noperator-facing statuses: scheduled, paused, and stopped. Last outcome\ndetails such as failed runs or interactive protection are shown separately. The\nRemote UI keeps the schedule card compact by showing daemon status, PID, and\nlast tick in the header, while schedule rows show project, next run, and a\nhumanized cron cadence such as every 15 minutes.

\n

Scheduled Agents

\n

Schedules create fresh managed agents for projects. They do not run shell\ncommands directly and do not resume old agent sessions. This keeps recurring\nwork reviewable and prevents stale context from accumulating across runs.

\n

Definitions live in ~/.tycho/config/schedules.yml, which is local and gitignored.\nLong prompts should live as Markdown files under ~/.tycho/schedules/.

\n
schedules:\n  - key: pull-request-review\n    name: Pull request review\n    enabled: true\n    cron: \"*/15 * * * *\"\n    timezone: local\n    target:\n      type: agent\n      project_key: my-workspace\n      name: Pull request review\n      message_source: file\n      message_file: schedules/pull-request-review.md\n    policy:\n      overlap: skip\n      missed: run_once_on_start\n      archive_previous_agent: true\n
\n

Use message_source: inline with message: \"...\" for short prompts. Use\nmessage_source: file and message_file: schedules/<name>.md for anything\nlonger than a few lines. Tycho validates cron syntax, project references, and\nthat prompt files stay inside ~/.tycho/schedules/.

\n

Each run automatically appends Tycho's final-output attachment checklist to the\nscheduled prompt, so reports, Markdown files, PRs, reviews, images, and other\ndurable artifacts should be returned in attachments.\nno_action_needed is reserved for successful observational checks where no new\ncondition required action; completed changes, answers, commits, reviews, and\ndeliverables use success even when no next step remains.

\n

Prompt tips for reliable schedules:

\n\n

If you converse with a scheduled agent, Tycho protects that session. A later\ndue run stops the schedule with reason interactive instead of archiving the\nuser-touched agent. Resume the stopped schedule when you want Tycho to archive\nthe active scheduled session and wait for the next scheduled run with fresh\ncontext.

\n

tycho schedule daemon writes daemon heartbeat state to ~/.tycho/logs/scheduler_daemon.json.\nThe schedule UI treats a missing or stale heartbeat as daemon attention. If it\nfinds a running scheduler process without heartbeat state, it reports the\ndaemon as untracked; restart tycho schedule daemon to restore tick freshness.

\n

TUI Tutorial

\n

Start the TUI:

\n
tycho\n
\n

Create A Project

\n
    \n
  1. Press 2 to switch to the Projects screen.
  2. \n
  3. Press N to open the New Project form.
  4. \n
  5. Enter the local project path first. Tycho will offer path suggestions and can\nprefill the project key/name as you tab through the form.
  6. \n
  7. Fill in the project key, name, and group.
  8. \n
  9. Use left/right arrows on the Agent field to choose the default harness\n(codex, claude, or a configured custom harness).
  10. \n
  11. Tab to Create Project and press Enter.
  12. \n
\n

Tycho writes the project entry to ~/.tycho/config/hq.yml, selects the new\nproject, and starts a metadata refresh.

\n

Create A Project Agent

\n
    \n
  1. Stay on the Projects screen and select the project with j/k.
  2. \n
  3. Press n to open the Create Agent form for that project.
  4. \n
  5. Use left/right arrows to choose the prompt template and harness.
  6. \n
  7. Fill in the agent name and prompt. Use Shift+Enter, Alt+Enter, or ctrl+j\nfor new lines inside the prompt.
  8. \n
  9. Choose Create Agent to save the agent without starting it, or choose\nCreate and Run Agent to start it immediately.
  10. \n
\n

After creation, Tycho switches to the Agents screen, selects the new agent, and\nopens its chat panel.

\n

Converse With An Agent

\n
    \n
  1. Press 1 to switch to the Agents screen.
  2. \n
  3. Select an agent with j/k.
  4. \n
  5. Press c or Enter to open the agent chat panel.
  6. \n
  7. Type your message. Use Shift+Enter, Alt+Enter, or ctrl+j for multiline\nprompts.
  8. \n
  9. Press Enter or ctrl+s to send. If the agent is idle, Tycho starts it\nautomatically.
  10. \n
\n

While in chat, use Tab/Shift+Tab to move between the prompt, conversation, and\nsummary areas. L opens the selected agent's raw log from the Agents screen,\nand ctrl+t opens an interactive terminal session for the selected agent.

\n

Remote UI Security

\n

tycho serve is local-first. If TYCHO_REMOTE_TOKEN is unset, API requests are\naccepted without authentication. This is intended only for localhost.

\n

Set a token before binding to Tailscale or any non-loopback address:

\n
TYCHO_REMOTE_TOKEN=\"$(ruby -rsecurerandom -e 'puts SecureRandom.hex(24)')\" tycho serve\n
\n

When Tailscale HTTPS Serve is available, Tycho can print an HTTPS MagicDNS\nRemote UI URL and QR code. Public screenshots should redact MagicDNS URLs,\nTailscale IPs, and QR codes.

\n

For multiple Remote servers, the browser still talks only to the Tycho server\nthat served the UI. That local server brokers requests to the selected peer,\nusing token_env values from local config or per-browser peer tokens entered\nin Settings. Browser-entered peer tokens are not written to hq.yml.

\n

Custom Claude Harnesses

\n

Tycho has built-in codex, claude, and opencode harnesses. To run Claude\nthrough a wrapper, define a custom harness in ~/.tycho/config/hq.yml and use\nits key as a project or template agent:

\n
custom_harnesses:\n  - key: claude-wrapper\n    adapter: claude\n    execution_command: /Users/you/bin/claude-wrapper\n\nprojects:\n  - key: my-workspace\n    name: My Workspace\n    group: Personal\n    path: /Users/you/Code/my-workspace\n    agent: claude-wrapper\n
\n

execution_command may be a shell string or an argv list. The command must be\nClaude-compatible because Tycho appends Claude CLI flags for stream-json output,\nstructured result schemas, and native session resume.

\n

Use TYCHO_CODEX_BIN, TYCHO_CLAUDE_BIN, or another documented environment\noverride when a harness executable is not on PATH.

\n

Tests

\n

Run the main test suite:

\n
bin/test\n
\n

Run an individual test:

\n
bundle exec ruby test/rendering_test.rb\n
\n

Known Limitations

\n\n

Documentation

\n\n

Contributing

\n

See CONTRIBUTING.md and CODE_OF_CONDUCT.md.

\n

Security

\n

See SECURITY.md.

\n

License

\n

Tycho is released under the MIT License. See LICENSE.

\n" @@ -2070,13 +2070,13 @@ "forks": 1, "topics": [], "updatedAt": "2026-07-19T14:15:03Z", - "pushedAt": "2026-07-19T14:14:59Z", + "pushedAt": "2026-07-21T15:06:18Z", "latestRelease": null, "archived": false, "licenseSpdx": "", "createdAt": "2026-06-13T11:24:30Z", "openIssues": 0, - "openPullRequests": 5, + "openPullRequests": 12, "subscribers": 0, "communityHealth": 85, "readmeHtml": "

โš ๏ธ AI-GENERATED CODEBASE WARNING

\n
\n

This project was built almost entirely by AI (Claude, GPT, and other LLMs).\nThe code, architecture, and documentation were largely generated, reviewed, and iterated by AI agents with human oversight.\nUse at your own risk โ€” thorough review before production use is strongly recommended.

\n
\n
\n\"Artidor\"\n

The video editor that respects your machine

\n

Local-first ยท MIT-licensed ยท No uploads ยท No paywalls ยท AI-native

\n

Website ยท Quick start ยท Features ยท AI Co-Pilot ยท Issues ยท Discord

\n

\"MIT\n\"Built\n\"Bun\"\n\"Next.js\n\"React\n\"Rust\n\"wgpu\"\n\"Postgres\"

\n

Preview

\n

\n \"Artidor\n

\n

\n \"Artidor\n \"Artidor\n

\n

\n \"Artidor\n \"Artidor\n


\n

Why

\n

Most \"free\" video editors are paywalled. The rest upload your footage to a server you don't control. The ones that don't are unusable.

\n

Artidor does the obvious things:

\n\n

No manifesto. No \"rethinking the creative process.\" Just a tool that works.

\n
\n

Features

\n

Editing

\n\n

Performance

\n\n

Platform

\n\n
\n

AI Co-Pilot

\n

Artidor ships with an AI panel in the left bar (under Assets). The Co-Pilot speaks every command the editor speaks โ€” split, trim, retime, keyframe, transition, color-grade, import, export โ€” and dispatches them as tool calls against the live editor.

\n

Three things set it apart from \"AI edits your video\" toys:

\n

1. It's not a wrapper

\n

The Co-Pilot doesn't transcribe your prompt and run a script. It has 40+ typed tools โ€” set_project_fps, insert_text_element, upsert_keyframe, apply_preset, export_project โ€” each one wraps a real EditorCore method. The LLM can't hallucinate outside the editor's surface.

\n

2. It learns from you

\n

Every command you fire (via mouse, keyboard, or the AI) is logged to a 500-event telemetry store. The Co-Pilot's system prompt includes your last 20 edits โ€” cut pattern, easing, pacing โ€” so its suggestions match your style instead of generic.

\n

3. It can clone a reference video

\n

Drop a finished video into the AI panel. The style extractor runs entirely client-side:

\n\n

The Co-Pilot then imitates that pacing on your timeline.

\n

Configure

\n
# .env.local โ€” pick ONE\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nOLLAMA_BASE_URL=http://localhost:11434  # local\n
\n

If no key is set, the panel still opens โ€” it just tells you on the first send.

\n
\n

Quick start

\n

Prerequisites: Bun โ‰ฅ 1.2.18. Docker is optional (for cloud features like collab).

\n

Just the editor (offline, no DB)

\n
git clone https://github.com/Aofsnorth/Artidor.git\ncd Artidor\nbun install\nbun dev:web\n
\n

Open http://localhost:3000. Projects live in IndexedDB; nothing leaves your machine.

\n

Full stack (cloud features + auth + collab)

\n
git clone https://github.com/Aofsnorth/Artidor.git\ncd Artidor\ndocker compose up -d db redis serverless-redis-http\ncp apps/web/.env.example apps/web/.env.local\nbun install\nbun dev:web\n
\n

The default .env.example works out of the box โ€” Postgres + Redis are auto-created with dev credentials. The offline editor works without any of this.

\n

Editing the Rust core

\n
# Build the WASM module once\nbun run build:wasm\ncd rust/wasm/pkg && bun link\ncd ../../apps/web && bun link artidor-wasm\n\n# Or: rebuild on every change\nbun dev:wasm      # in a second terminal\nbun dev:web       # in the first\n
\n

Desktop

\n

apps/desktop uses GPUI. See apps/desktop/README.md for the Rust toolchain.

\n
\n

Project layout

\n
Artidor/\nโ”œโ”€ apps/\nโ”‚  โ”œโ”€ web/                       Next.js 16 + React 19 frontend\nโ”‚  โ”‚  โ”œโ”€ src/\nโ”‚  โ”‚  โ”‚  โ”œโ”€ app/                 Routes, layouts, server components\nโ”‚  โ”‚  โ”‚  โ”‚  โ”œโ”€ api/              API routes (ai, auth, drive, github, โ€ฆ)\nโ”‚  โ”‚  โ”‚  โ”‚  โ”œโ”€ editor/           /editor/[project_id] โ€” the workspace\nโ”‚  โ”‚  โ”‚  โ”‚  โ””โ”€ projects/         /projects โ€” the dashboard\nโ”‚  โ”‚  โ”‚  โ”œโ”€ components/          UI shell โ€” no domain logic\nโ”‚  โ”‚  โ”‚  โ”‚  โ””โ”€ editor/panels/    Asset / properties / timeline\nโ”‚  โ”‚  โ”‚  โ”œโ”€ core/                EditorCore facade + 14 managers\nโ”‚  โ”‚  โ”‚  โ”œโ”€ hooks/               React bindings\nโ”‚  โ”‚  โ”‚  โ”œโ”€ lib/\nโ”‚  โ”‚  โ”‚  โ”‚  โ”œโ”€ ai/               AI Co-Pilot (provider, tools, telemetry, style)\nโ”‚  โ”‚  โ”‚  โ”‚  โ”œโ”€ timeline/         Timeline types\nโ”‚  โ”‚  โ”‚  โ”‚  โ””โ”€ export/           MediaRecorder pipelines\nโ”‚  โ”‚  โ”‚  โ””โ”€ stores/              Zustand stores\nโ”‚  โ”‚  โ””โ”€ public/                 Static assets (logos, fonts, screenshots)\nโ”‚  โ””โ”€ desktop/                   GPUI shell โ€” same Rust core\nโ”‚\nโ”œโ”€ rust/\nโ”‚  โ”œโ”€ wasm/                      Compiles to artidor-wasm npm package\nโ”‚  โ””โ”€ crates/                    Workspace crates\nโ”‚     โ”œโ”€ bridge/                 #[export] proc-macro โ†’ wasm_bindgen\nโ”‚     โ”œโ”€ time/                   MediaTime, FrameRate, Easing, keyframes\nโ”‚     โ”œโ”€ gpu/                    wgpu device + pipeline cache\nโ”‚     โ”œโ”€ compositor/             Scene graph + draw ordering\nโ”‚     โ”œโ”€ effects/                Effect definitions + parameter trees\nโ”‚     โ””โ”€ masks/                  Mask shapes + compositing\nโ”‚\nโ”œโ”€ docs/                         Architecture notes\nโ””โ”€ .github/                      CI, issue templates, contributing\n
\n

Rule of thumb: if it's not a UI concern, it goes in rust/. Every line of business logic in apps/web/src/core/ is a migration in progress.

\n
\n

Environment variables

\n

The app works fully offline with no environment variables. The defaults in apps/web/.env.example cover local dev. Cloud / AI features need these:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableRequired forDefault
OPENAI_API_KEYAI Co-Pilot (GPT)โ€”
ANTHROPIC_API_KEYAI Co-Pilot (Claude)โ€”
OLLAMA_BASE_URLAI Co-Pilot (local)http://localhost:11434
GITHUB_TOKENHigher GitHub API rate (5k/hr)โ€”
DATABASE_URLPostgres (cloud features)postgresql://artidor:artidor@localhost:5432/artidor
BETTER_AUTH_SECRETAuthdev-only fallback
UPSTASH_REDIS_REST_URLRedishttp://localhost:8079
UPSTASH_REDIS_REST_TOKENRedisdev-only fallback
FREESOUND_CLIENT_IDSound searchโ€”
FREESOUND_KEYSound searchโ€”
\n
\n

Architecture highlights

\n\n
\n

Scripts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptWhat it does
bun dev:webNext.js dev server on :3000
bun dev:wasmcargo watch rebuilds the Rust โ†’ WASM package on every change
bun run build:webProduction build of the web app
bun run build:wasmOne-shot WASM build
bun run lint:webBiome lint
bun run lint:web:fixBiome lint with --write --unsafe
bun run format:webBiome format (renderer dir)
bun run testBun test runner
bun run preview:webNext.js production preview
bun run publish:wasmBuild + publish artidor-wasm to npm
bun run generate:fontsRegenerate the font sprite chunks in public/
\n
\n

Contributing

\n

Two rules:

\n
    \n
  1. Don't write what the platform already gives you. aria-* beats div. CSS transition beats an animation lib. Postgres constraints beat app code. A Rust iterator beats a JS one.
  2. \n
  3. Logic goes in rust/, UI goes in apps/. If you find yourself putting a domain rule in a React component, move it.
  4. \n
\n

Before opening a PR:

\n\n

For larger changes, open an issue first so we can agree on direction. See .github/CONTRIBUTING.md for the rest.

\n
\n

Community

\n\n
\n

License

\n

MIT. Use it, fork it, ship a competitor, whatever.

\n

Built on the foundation of OpenCut โ€” same MIT license, same DNA. All Rust core is original Artidor work.

\n

Built in public ยท The repo is the brand

\n
\n" From 28ca2c668def78637d70d3b949cc9e3ac716f06f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 17:49:39 +0000 Subject: [PATCH 04/25] Sync content data --- src/data/projects.json | 104 ++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index b729ca1..24837c4 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -57,22 +57,22 @@ "php", "php-library" ], - "updatedAt": "2026-07-15T07:13:39Z", - "pushedAt": "2026-07-21T15:05:37Z", + "updatedAt": "2026-07-21T15:58:34Z", + "pushedAt": "2026-07-21T15:58:49Z", "latestRelease": { - "name": "6.5.1", - "tagName": "6.5.1", - "url": "https://github.com/laravolt/avatar/releases/tag/6.5.1", - "publishedAt": "2026-07-21T14:34:28Z" + "name": "7.0.0", + "tagName": "7.0.0", + "url": "https://github.com/laravolt/avatar/releases/tag/7.0.0", + "publishedAt": "2026-07-21T15:51:47Z" }, "archived": false, "licenseSpdx": "MIT", "createdAt": "2015-10-12T07:01:40Z", - "openIssues": 2, - "openPullRequests": 5, + "openIssues": 0, + "openPullRequests": 0, "subscribers": 32, "communityHealth": 37, - "readmeHtml": "

laravolt/avatar

\n

\"Total\n\"Monthly\n\"Daily\n\"Run

\n

\"Preview\"

\n

Display unique avatar for any user based on their (initials) name.

\n

Preview

\n

\"Preview\"

\n

:film_strip: Video Tutorial

\n

\n

Installation

\n

This package originally built for Laravel, but can also be used in any PHP project.

\n

Read more about integration with PHP project here.

\n

Laravel >= 5.2:

\n
composer require laravolt/avatar\n
\n

Laravel 5.1:

\n
composer require laravolt/avatar ~0.3\n
\n

Service Provider & Facade

\n

Note: only for Laravel 5.4 and below, because since Laravel 5.5 we use package auto-discovery.

\n
Laravolt\\Avatar\\ServiceProvider::class,\n\n...\n\n'Avatar'    => Laravolt\\Avatar\\Facade::class,\n
\n

Publish Config (optional)

\n
php artisan vendor:publish --provider=\"Laravolt\\Avatar\\ServiceProvider\"\n
\n

This will create config file located in config/laravolt/avatar.php.

\n

Lumen Service Provider

\n
$app->register(Laravolt\\Avatar\\LumenServiceProvider);\n
\n

Usage

\n

Output as base64

\n
//this will output data-uri (base64 image data)\n//something like data:image/png;base64,iVBORw0KGg....\nAvatar::create('Joko Widodo')->toBase64();\n\n//use in view\n//this will display initials JW as an image\n<img src=\"https://raw.githubusercontent.com/laravolt/avatar/master/%7B%7B%20Avatar::create('Joko%20Widodo')->toBase64()%20%7D%7D\" />\n
\n

Save as file

\n
Avatar::create('Susilo Bambang Yudhoyono')->save('sample.png');\nAvatar::create('Susilo Bambang Yudhoyono')->save('sample.jpg', 100); // quality = 100\n
\n

Output as Gravatar

\n
Avatar::create('uyab@example.net')->toGravatar();\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee\n\nAvatar::create('uyab@example.net')->toGravatar(['d' => 'identicon', 'r' => 'pg', 's' => 100]);\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee?d=identicon&r=pg&s=100\n
\n

Gravatar parameter reference: https://docs.gravatar.com/api/avatars/images/

\n

Output as SVG

\n
Avatar::create('Susilo Bambang Yudhoyono')->toSvg();\n
\n

You may specify custom font-family for your SVG text.

\n
<head>\n    <!--Prepare custom font family, using Google Fonts-->\n    <link href=\"https://fonts.googleapis.com/css?family=Laravolt\" rel=\"stylesheet\">\n\n    <!--OR-->\n\n    <!--Setup your own style-->\n    <style>\n    @font-face {\n        font-family: Laravolt;\n        src: url({{ asset('fonts/laravolt.woff')) }});\n    }\n    </style>\n</head>\n
\n
Avatar::create('Susilo Bambang Yudhoyono')->setFontFamily('Laravolt')->toSvg();\n
\n

You may make the SVG responsive. This excludes the height and width attributes.

\n
Avatar::create('Susilo Bambang Yudhoyono')->setResponsive()->toSvg();\n
\n

Get underlying Intervention image object

\n
Avatar::create('Abdul Somad')->getImageObject();\n
\n

The method will return an instance of Intervention image object, so you can use it for further purposes.

\n

Non-ASCII Character

\n

By default, this package will try to output any initials letter as it is. If the name supplied contains any non-ASCII character (e.g. ฤ, ฤš, วฝ) then the result will depend on which font used (see config). It the font supports characters supplied, it will successfully displayed, otherwise it will not.

\n

Alternatively, we can convert all non-ascii to their closest ASCII counterparts. If no closest coutnerparts found, those characters are removed. Thanks to Stringy for providing such useful functions. What we need is just change one line in config/avatar.php:

\n
    'ascii'    => true,\n
\n

Configuration

\n
<?php\n/*\n * Set specific configuration variables here\n */\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Image Driver\n    |--------------------------------------------------------------------------\n    | Avatar use Intervention Image library to process image.\n    | Meanwhile, Intervention Image supports \"GD Library\" and \"Imagick\" to process images\n    | internally. You may choose one of them according to your PHP\n    | configuration. By default PHP's \"Imagick\" implementation is used.\n    |\n    | Supported: \"gd\", \"imagick\"\n    |\n    */\n    'driver'    => 'gd',\n\n    // Initial generator class\n    'generator' => \\Laravolt\\Avatar\\Generator\\DefaultGenerator::class,\n\n    // Whether all characters supplied must be replaced with their closest ASCII counterparts\n    'ascii'    => false,\n\n    // Image shape: circle or square\n    'shape' => 'circle',\n\n    // Image width, in pixel\n    'width'    => 100,\n\n    // Image height, in pixel\n    'height'   => 100,\n\n    // Number of characters used as initials. If name consists of single word, the first N character will be used\n    'chars'    => 2,\n\n    // font size\n    'fontSize' => 48,\n\n    // convert initial letter in uppercase\n    'uppercase' => false,\n\n    // Right to Left (RTL)\n    'rtl' => false,\n\n    // Fonts used to render text.\n    // If contains more than one fonts, randomly selected based on name supplied\n    'fonts'    => [__DIR__.'/../fonts/OpenSans-Bold.ttf', __DIR__.'/../fonts/rockwell.ttf'],\n\n    // List of foreground colors to be used, randomly selected based on name supplied\n    'foregrounds'   => [\n        '#FFFFFF',\n    ],\n\n    // List of background colors to be used, randomly selected based on name supplied\n    'backgrounds'   => [\n        '#f44336',\n        '#E91E63',\n        '#9C27B0',\n        '#673AB7',\n        '#3F51B5',\n        '#2196F3',\n        '#03A9F4',\n        '#00BCD4',\n        '#009688',\n        '#4CAF50',\n        '#8BC34A',\n        '#CDDC39',\n        '#FFC107',\n        '#FF9800',\n        '#FF5722',\n    ],\n\n    'border'    => [\n        'size'  => 1,\n\n        // border color, available value are:\n        // 'foreground' (same as foreground color)\n        // 'background' (same as background color)\n        // or any valid hex ('#aabbcc')\n        'color' => 'background',\n\n        // border radius, only works for SVG\n        'radius' => 0,\n    ],\n\n    // List of theme name to be used when rendering avatar\n    // Possible values are:\n    // 1. Theme name as string: 'colorful'\n    // 2. Or array of string name: ['grayscale-light', 'grayscale-dark']\n    // 3. Or wildcard \"*\" to use all defined themes\n    'theme' => ['*'],\n\n    // Predefined themes\n    // Available theme attributes are:\n    // shape, chars, backgrounds, foregrounds, fonts, fontSize, width, height, ascii, uppercase, and border.\n    'themes' => [\n        'grayscale-light' => [\n            'backgrounds' => ['#edf2f7', '#e2e8f0', '#cbd5e0'],\n            'foregrounds' => ['#a0aec0'],\n        ],\n        'grayscale-dark' => [\n            'backgrounds' => ['#2d3748', '#4a5568', '#718096'],\n            'foregrounds' => ['#e2e8f0'],\n        ],\n        'colorful' => [\n            'backgrounds' => [\n                '#f44336',\n                '#E91E63',\n                '#9C27B0',\n                '#673AB7',\n                '#3F51B5',\n                '#2196F3',\n                '#03A9F4',\n                '#00BCD4',\n                '#009688',\n                '#4CAF50',\n                '#8BC34A',\n                '#CDDC39',\n                '#FFC107',\n                '#FF9800',\n                '#FF5722',\n            ],\n            'foregrounds' => ['#FFFFFF'],\n        ],\n    ]\n];\n
\n

Overriding config at runtime

\n

We can overriding configuration at runtime by using following functions:

\n
Avatar::create('Soekarno')->setDimension(100);//width = height = 100 pixel\nAvatar::create('Soekarno')->setDimension(100, 200); // width = 100, height = 200\nAvatar::create('Soekarno')->setBackground('#001122');\nAvatar::create('Soekarno')->setForeground('#999999');\nAvatar::create('Soekarno')->setFontSize(72);\nAvatar::create('Soekarno')->setFont('/path/to/font.ttf');\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc'); // size = 1, color = #aabbcc\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc', 10); // size = 1, color = #aabbcc, border radius = 10 (only for SVG)\nAvatar::create('Soekarno')->setShape('square');\n\n// Available since 3.0.0\nAvatar::create('Soekarno')->setTheme('colorful'); // set exact theme\nAvatar::create('Soekarno')->setTheme(['grayscale-light', 'grayscale-dark']); // theme will be randomized from these two options\n\n// chaining\nAvatar::create('Habibie')->setDimension(50)->setFontSize(18)->toBase64();\n
\n

Integration with other PHP project

\n
// include composer autoload\nrequire 'vendor/autoload.php';\n\n// import the Avatar class\nuse Laravolt\\Avatar\\Avatar;\n\n// create your first avatar\n$avatar = new Avatar($config);\n$avatar->create('John Doe')->toBase64();\n$avatar->create('John Doe')->save('path/to/file.png', $quality = 90);\n
\n

$config is just an ordinary array with same format as explained above (See Configuration).

\n

Support Us

\n

Buy Me A Coffee

\n

\""Buy

\n

Donate Via PayPal

\n

\"paypal\"

\n

Traktir Saya

\n

\"Trakteer

\n" + "readmeHtml": "

laravolt/avatar

\n

\"Total\n\"Monthly\n\"Daily\n\"Run

\n

\"Preview\"

\n

Display unique avatar for any user based on their (initials) name.

\n

Preview

\n

\"Preview\"

\n

:film_strip: Video Tutorial

\n

\n

Requirements

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VersionPHPLaravelIntervention Image
7.x>= 8.310.x โ€“ 13.x^4.0
6.x>= 8.110.x โ€“ 12.x^3.0
5.x>= 8.09.x โ€“ 11.x^2.0
\n

Installation

\n

This package originally built for Laravel, but can also be used in any PHP project.

\n

Read more about integration with PHP project here.

\n
composer require laravolt/avatar\n
\n

The service provider and Avatar facade are registered automatically via package auto-discovery.

\n

Publish Config (optional)

\n
php artisan vendor:publish --provider=\"Laravolt\\Avatar\\ServiceProvider\"\n
\n

This will create config file located in config/laravolt/avatar.php.

\n

Lumen Service Provider

\n
$app->register(Laravolt\\Avatar\\LumenServiceProvider);\n
\n

Usage

\n

Output as base64

\n
//this will output data-uri (base64 image data)\n//something like data:image/png;base64,iVBORw0KGg....\nAvatar::create('Joko Widodo')->toBase64();\n\n//use in view\n//this will display initials JW as an image\n<img src=\"https://raw.githubusercontent.com/laravolt/avatar/master/%7B%7B%20Avatar::create('Joko%20Widodo')->toBase64()%20%7D%7D\" />\n
\n

Save as file

\n
Avatar::create('Susilo Bambang Yudhoyono')->save('sample.png');\nAvatar::create('Susilo Bambang Yudhoyono')->save('sample.jpg', 100); // quality = 100\n
\n

Output as Gravatar

\n
Avatar::create('uyab@example.net')->toGravatar();\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee\n\nAvatar::create('uyab@example.net')->toGravatar(['d' => 'identicon', 'r' => 'pg', 's' => 100]);\n// Output: http://gravatar.com/avatar/0c5cbf5a8762d91d930795a6107b2ce5814a6ab26e60c7ec6b75bc81c7dfe3ee?d=identicon&r=pg&s=100\n
\n

Gravatar parameter reference: https://docs.gravatar.com/api/avatars/images/

\n

Output as SVG

\n
Avatar::create('Susilo Bambang Yudhoyono')->toSvg();\n
\n

You may specify custom font-family for your SVG text.

\n
<head>\n    <!--Prepare custom font family, using Google Fonts-->\n    <link href=\"https://fonts.googleapis.com/css?family=Laravolt\" rel=\"stylesheet\">\n\n    <!--OR-->\n\n    <!--Setup your own style-->\n    <style>\n    @font-face {\n        font-family: Laravolt;\n        src: url({{ asset('fonts/laravolt.woff')) }});\n    }\n    </style>\n</head>\n
\n
Avatar::create('Susilo Bambang Yudhoyono')->setFontFamily('Laravolt')->toSvg();\n
\n

You may make the SVG responsive. This excludes the height and width attributes.

\n
Avatar::create('Susilo Bambang Yudhoyono')->setResponsive()->toSvg();\n
\n

Get underlying Intervention image object

\n
Avatar::create('Abdul Somad')->getImageObject();\n
\n

The method will return an instance of Intervention image object, so you can use it for further purposes.

\n

Non-ASCII Character

\n

By default, this package will try to output any initials letter as it is. If the name supplied contains any non-ASCII character (e.g. ฤ, ฤš, วฝ) then the result will depend on which font used (see config). It the font supports characters supplied, it will successfully displayed, otherwise it will not.

\n

Alternatively, we can convert all non-ascii to their closest ASCII counterparts. If no closest coutnerparts found, those characters are removed. Thanks to Stringy for providing such useful functions. What we need is just change one line in config/avatar.php:

\n
    'ascii'    => true,\n
\n

Configuration

\n
<?php\n/*\n * Set specific configuration variables here\n */\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Image Driver\n    |--------------------------------------------------------------------------\n    | Avatar use Intervention Image library to process image.\n    | Meanwhile, Intervention Image supports \"GD Library\" and \"Imagick\" to process images\n    | internally. You may choose one of them according to your PHP\n    | configuration. By default PHP's \"Imagick\" implementation is used.\n    |\n    | Supported: \"gd\", \"imagick\"\n    |\n    */\n    'driver'    => 'gd',\n\n    // Initial generator class\n    'generator' => \\Laravolt\\Avatar\\Generator\\DefaultGenerator::class,\n\n    // Whether all characters supplied must be replaced with their closest ASCII counterparts\n    'ascii'    => false,\n\n    // Image shape: circle or square\n    'shape' => 'circle',\n\n    // Image width, in pixel\n    'width'    => 100,\n\n    // Image height, in pixel\n    'height'   => 100,\n\n    // Number of characters used as initials. If name consists of single word, the first N character will be used\n    'chars'    => 2,\n\n    // font size\n    'fontSize' => 48,\n\n    // convert initial letter in uppercase\n    'uppercase' => false,\n\n    // Right to Left (RTL)\n    'rtl' => false,\n\n    // Fonts used to render text.\n    // If contains more than one fonts, randomly selected based on name supplied\n    'fonts'    => [__DIR__.'/../fonts/OpenSans-Bold.ttf', __DIR__.'/../fonts/rockwell.ttf'],\n\n    // List of foreground colors to be used, randomly selected based on name supplied\n    'foregrounds'   => [\n        '#FFFFFF',\n    ],\n\n    // List of background colors to be used, randomly selected based on name supplied\n    'backgrounds'   => [\n        '#f44336',\n        '#E91E63',\n        '#9C27B0',\n        '#673AB7',\n        '#3F51B5',\n        '#2196F3',\n        '#03A9F4',\n        '#00BCD4',\n        '#009688',\n        '#4CAF50',\n        '#8BC34A',\n        '#CDDC39',\n        '#FFC107',\n        '#FF9800',\n        '#FF5722',\n    ],\n\n    'border'    => [\n        'size'  => 1,\n\n        // border color, available value are:\n        // 'foreground' (same as foreground color)\n        // 'background' (same as background color)\n        // or any valid hex ('#aabbcc')\n        'color' => 'background',\n\n        // border radius, only works for SVG\n        'radius' => 0,\n    ],\n\n    // List of theme name to be used when rendering avatar\n    // Possible values are:\n    // 1. Theme name as string: 'colorful'\n    // 2. Or array of string name: ['grayscale-light', 'grayscale-dark']\n    // 3. Or wildcard \"*\" to use all defined themes\n    'theme' => ['*'],\n\n    // Predefined themes\n    // Available theme attributes are:\n    // shape, chars, backgrounds, foregrounds, fonts, fontSize, width, height, ascii, uppercase, and border.\n    'themes' => [\n        'grayscale-light' => [\n            'backgrounds' => ['#edf2f7', '#e2e8f0', '#cbd5e0'],\n            'foregrounds' => ['#a0aec0'],\n        ],\n        'grayscale-dark' => [\n            'backgrounds' => ['#2d3748', '#4a5568', '#718096'],\n            'foregrounds' => ['#e2e8f0'],\n        ],\n        'colorful' => [\n            'backgrounds' => [\n                '#f44336',\n                '#E91E63',\n                '#9C27B0',\n                '#673AB7',\n                '#3F51B5',\n                '#2196F3',\n                '#03A9F4',\n                '#00BCD4',\n                '#009688',\n                '#4CAF50',\n                '#8BC34A',\n                '#CDDC39',\n                '#FFC107',\n                '#FF9800',\n                '#FF5722',\n            ],\n            'foregrounds' => ['#FFFFFF'],\n        ],\n    ]\n];\n
\n

Overriding config at runtime

\n

We can overriding configuration at runtime by using following functions:

\n
Avatar::create('Soekarno')->setDimension(100);//width = height = 100 pixel\nAvatar::create('Soekarno')->setDimension(100, 200); // width = 100, height = 200\nAvatar::create('Soekarno')->setBackground('#001122');\nAvatar::create('Soekarno')->setForeground('#999999');\nAvatar::create('Soekarno')->setFontSize(72);\nAvatar::create('Soekarno')->setFont('/path/to/font.ttf');\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc'); // size = 1, color = #aabbcc\nAvatar::create('Soekarno')->setBorder(1, '#aabbcc', 10); // size = 1, color = #aabbcc, border radius = 10 (only for SVG)\nAvatar::create('Soekarno')->setShape('square');\n\n// Available since 3.0.0\nAvatar::create('Soekarno')->setTheme('colorful'); // set exact theme\nAvatar::create('Soekarno')->setTheme(['grayscale-light', 'grayscale-dark']); // theme will be randomized from these two options\n\n// chaining\nAvatar::create('Habibie')->setDimension(50)->setFontSize(18)->toBase64();\n
\n

Integration with other PHP project

\n
// include composer autoload\nrequire 'vendor/autoload.php';\n\n// import the Avatar class\nuse Laravolt\\Avatar\\Avatar;\n\n// create your first avatar\n$avatar = new Avatar($config);\n$avatar->create('John Doe')->toBase64();\n$avatar->create('John Doe')->save('path/to/file.png', $quality = 90);\n
\n

$config is just an ordinary array with same format as explained above (See Configuration).

\n

Support Us

\n

Buy Me A Coffee

\n

\""Buy

\n

Donate Via PayPal

\n

\"paypal\"

\n

Traktir Saya

\n

\"Trakteer

\n" }, { "fullName": "danpros/htmly", @@ -123,13 +123,13 @@ "url": "https://github.com/OpenSID/OpenSID", "homepage": "", "language": "PHP", - "stars": 1213, + "stars": 1212, "forks": 1167, "topics": [ "opensid", "sistem-informasi-desa" ], - "updatedAt": "2026-07-21T06:49:39Z", + "updatedAt": "2026-07-21T17:03:15Z", "pushedAt": "2026-07-18T13:09:40Z", "latestRelease": { "name": "Rilis v2607.0.0", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T14:28:11Z", - "pushedAt": "2026-07-21T14:23:41Z", + "updatedAt": "2026-07-21T16:59:14Z", + "pushedAt": "2026-07-21T17:47:41Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 14, - "openPullRequests": 1, + "openIssues": 18, + "openPullRequests": 3, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent. Stop paying Claude to read 10,000 lines of terminal noise like a headphone for AI agent\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -490,8 +490,8 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-21T09:18:59Z", - "pushedAt": "2026-07-21T03:17:27Z", + "updatedAt": "2026-07-21T16:26:31Z", + "pushedAt": "2026-07-21T16:25:00Z", "latestRelease": { "name": "Release v0.9.1", "tagName": "v0.9.1", @@ -501,7 +501,7 @@ "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", - "openIssues": 6, + "openIssues": 2, "openPullRequests": 1, "subscribers": 0, "communityHealth": 75, @@ -1310,31 +1310,6 @@ "communityHealth": 42, "readmeHtml": "

NATS โ€” Enterprise Resource Planning System (v1.0.0-alpha)

\n

NATS is a Next.js-based ERP system designed to handle various business functions ranging from accounting, inventory, sales, purchasing, POS, to payroll.

\n

๐ŸŒ Lihat Dokumentasi Online

\n

Key Features

\n\n

Screenshots

\n

\"1776302209274\"\nMain Dashboard View

\n

\"1776302243874\"\nAccounting Module

\n

\"1776302322989\"\nFinancial Report

\n

\"1776302374473\"\nPoint of Sale (POS)

\n

Installation Guide

\n

Follow the steps below to run NATS in your local environment.

\n

Prerequisites

\n

Before starting, ensure your system has the following components:

\n\n

Installation Steps

\n

1. Clone Repository

\n
git clone <repository-url>\ncd nats\n
\n

2. Install Dependencies

\n
npm install\n
\n

3. Configure Environment Variables

\n

Copy the .env.example file to .env and adjust its values:

\n
cp .env.example .env\n
\n

Ensure the DATABASE_URL variable correctly points to your PostgreSQL instance:\nDATABASE_URL=\"postgresql://user:password@localhost:5432/nats\"

\n

4. Database Preparation

\n

Create a database in PostgreSQL:

\n
psql -U postgres -c \"CREATE DATABASE nats;\"\n
\n

Perform database migration and schema creation:

\n
npx prisma generate\nnpx prisma migrate dev --name init\n
\n

5. Seed Initial Data

\n

Populate the database with initial data (roles, default users, etc.). Choose one of the following options:

\n

Option A: Complete Seeding (Recommended for Testing)\nIncludes sample products, transactions, and bulk data:

\n
npm run prisma db seed\n
\n

Option B: Minimal Seeding (Clean Start)\nIncludes only essential data: Company Profile, Chart of Accounts, and Default Roles/Users:

\n
npm run prisma:seed:minimal\n
\n

Default Credentials:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
RoleEmailName
Super Adminadmin@example.comAdmin User
Accountantaccountant@example.comJohn Accountant
Cashiercashier@example.comJane Cashier
Managermanager@example.comMike Manager
Merchantmerchant@example.comSample Merchant
Customercustomer@example.comSample Customer
\n

6. Run Application

\n

Run the development server:

\n
npm run dev\n
\n

The application can be accessed at http://localhost:3000.

\n
\n

Installation Using Docker (Optional)

\n

If you want to run the application using Docker Compose:

\n
docker-compose up -d\n
\n

After the containers are running, initialize the database:

\n
docker-compose exec app npx prisma migrate deploy\n# Run complete seed\ndocker-compose exec app npm run prisma db seed\n\n# OR run minimal seed\ndocker-compose exec app npm run prisma:seed:minimal\n
\n
\n

License

\n

This project is licensed under LICENSE.

\n" }, - { - "fullName": "rayasabari/yntk-ts", - "name": "yntk-ts", - "owner": "rayasabari", - "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/57746279?v=4", - "description": "You Need This Kit - Type-safe Starter: REST API boilerplate that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORM, and PostgreSQL", - "metaDescription": "You Need This Kit - Type-safe Starter: REST API boilerplate that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORMโ€ฆ", - "url": "https://github.com/rayasabari/yntk-ts", - "homepage": "", - "language": "TypeScript", - "stars": 20, - "forks": 0, - "topics": [], - "updatedAt": "2026-06-25T07:10:46Z", - "pushedAt": "2026-04-08T09:29:42Z", - "latestRelease": null, - "archived": false, - "licenseSpdx": "", - "createdAt": "2026-04-08T09:27:49Z", - "openIssues": 0, - "openPullRequests": 0, - "subscribers": 0, - "communityHealth": 28, - "readmeHtml": "

YNTK-TS

\n

You Need This Kit - Type-safe Starter!

\n

TypeScript/Express REST API starter kit that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORM, and PostgreSQL. The project is organized by feature with explicit service/repository layers so business logic stays separated from transport concerns.

\n

Tech Stack

\n\n

Project Structure

\n
src/\nโ”œโ”€โ”€ app.ts                # Express app bootstrap\nโ”œโ”€โ”€ server.ts             # Starts HTTP server\nโ”œโ”€โ”€ config/               # Environment loader & Prisma client wrapper\nโ”œโ”€โ”€ controllers/          # HTTP handlers grouped by module + shared helpers\nโ”œโ”€โ”€ services/             # Business logic (auth/user) & mappers\nโ”œโ”€โ”€ repositories/         # Prisma data access per module\nโ”œโ”€โ”€ middleware/           # Cross-cutting middleware (auth, validation)\nโ”œโ”€โ”€ routes/               # Express routers mounted under /auth and /users\nโ”œโ”€โ”€ validations/          # Zod schemas for request validation\nโ”œโ”€โ”€ views/                # Email templates\nโ”œโ”€โ”€ errors/               # Custom AppError type & error utilities\nโ”œโ”€โ”€ utils/                # Shared utilities (password, string, Zod helpers)\nโ””โ”€โ”€ types/                # Shared TS types & Express module augmentation\n
\n

Getting Started

\n

1. Clone & Install

\n
pnpm install\n
\n

2. Environment Variables

\n

Create .env (never commit it) with the required settings:

\n
# Server Configuration\nNODE_ENV=development\nFRONTEND_URL=http://localhost:8080\nPORT=5050\nLOG_LEVEL=info\n\n# Database\nDATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE\n\n# JWT Configuration\nJWT_SECRET=super-secret\n\n# Bcrypt Configuration\nSALT_ROUNDS=10\n\n# Email Configuration\nEMAIL_HOST=smtp.gmail.com\nEMAIL_PORT=587\nEMAIL_USER=your-email@gmail.com\nEMAIL_PASSWORD=your-app-password\nEMAIL_FROM=noreply@yourapp.com\n\n# Token Configuration\nACCESS_TOKEN_EXPIRY=\"1h\"\nENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nREFRESH_TOKEN_EXPIRY=7 * 24 * 60 * 60 * 1000 # 7 days in miliseconds\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nRESET_PASSWORD_TOKEN_EXPIRY=1 * 60 * 60 * 1000 # 1 hour in miliseconds\nEMAIL_VERIFICATION_TOKEN_EXPIRY=24 * 60 * 60 * 10000 # 24 hours in miliseconds\n\n# CORS Configuration\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\nCORS_CREDENTIALS=true\n
\n
\n

Note for Gmail: Use an App Password instead of your regular password. Enable 2FA and generate an App Password in Google Account Settings โ†’ Security โ†’ App passwords.

\n
\n

3. Database & Prisma

\n
    \n
  1. Model updates live in prisma/schema.prisma.
  2. \n
  3. Apply migrations: pnpm prisma migrate dev (for local) or pnpm prisma db push for quick sync.
  4. \n
  5. Generate the Prisma client (needed whenever the schema changes): pnpm prisma generate. Output lands in src/generated/prisma.
  6. \n
  7. Seed the database: pnpm prisma db seed
  8. \n
\n

4. Development

\n
pnpm dev\n
\n

Runs tsx in watch mode, recompiling on changes. The API listens on PORT from the env file (defaults to 5050).

\n

Available Scripts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandPurpose
pnpm devStart the API in watch mode with tsx
pnpm prisma migrate devCreate/apply migrations and regenerate Prisma client
pnpm prisma generateRegenerate Prisma client manually
pnpm prisma db pushQuick sync schema to database without migrations
pnpm prisma db seedSeed the database
pnpm buildBuild the API for production (bundles with tsup)
pnpm startStart the production server from dist/
pnpm testRun all tests in watch mode
pnpm test:unitRun unit tests only
pnpm test:integrationRun integration tests only (sequential)
\n
\n

โ— Production build: The repo currently runs via tsx; add a tsc build + start script before deploying to production environments like Vercel/Node runtime functions.

\n
\n

API Documentation

\n

The API includes interactive documentation powered by Swagger UI and OpenAPI 3.0 (swagger-jsdoc and swagger-ui-express).

\n\n

API Endpoints

\n

All endpoints respond with { status, message, data? } JSON payloads.\nFor paginated endpoints (like GET /users and GET /roles), the response also includes meta and links objects containing paging data and HATEOAS navigational URLs. They optionally accept query parameters: ?page=1&limit=10&sortBy=createdAt&sortOrder=asc&search=value.

\n

Authentication Routes (/auth)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/auth/registerRegister a new user and send verification emailPublicregisterUserSchema
POST/auth/loginVerify credentials and return JWT tokenPublic-
POST/auth/logoutLogout and revoke refresh tokenRequiredlogoutSchema
POST/auth/refresh-tokenRefresh access token using refresh tokenPublicrefreshTokenSchema
POST/auth/verify-emailVerify email address using token from emailPublicverifyEmailSchema
POST/auth/resend-verificationResend verification email (rate limited: 3/10min)PublicresendVerificationSchema
POST/auth/forgot-passwordRequest password reset email (rate limited: 3/15min)PublicforgotPasswordSchema
POST/auth/reset-passwordReset password using token from emailPublicresetPasswordSchema
\n

User Routes (/users)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/usersCreate a user (admin-style)Required (users:create)createUserSchema
GET/usersList all usersRequired (users:read)-
GET/users/:idFetch a user by IDRequired (users:read)-
PUT/users/:idUpdate user fields (username, email, displayName)Required (users:update)updateUserSchema
PUT/users/:id/rolesAssign roles to a userRequired (roles:assign)assignRolesSchema
PATCH/users/passwordUpdate current user's passwordRequired (users:update)updatePasswordSchema
DELETE/users/:idRemove a userRequired (users:delete)-
\n

Role & Permission Routes (/roles & /permissions)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
GET/rolesList all rolesRequired (roles:read)-
GET/roles/:idFetch a role by IDRequired (roles:read)-
POST/rolesCreate a new roleRequired (roles:create)createRoleSchema
PUT/roles/:idUpdate an existing roleRequired (roles:update)updateRoleSchema
DELETE/roles/:idRemove a roleRequired (roles:delete)-
GET/permissionsList all system permissionsRequired (roles:read)-
\n

Auth Required: Endpoints require Authorization: Bearer <token> header.

\n

Validation Schemas

\n

The API uses Zod for request validation with the following schemas:

\n\n

All schemas include:

\n\n

Middleware

\n\n

Adding New Modules

\n
    \n
  1. Plan the data shape (Prisma model, DTOs, response contract).
  2. \n
  3. Create Zod schemas in src/validations/<module>.validation.ts for request validation.
  4. \n
  5. Create routes under src/routes/<module>.routes.ts and mount them in src/routes/index.ts.
  6. \n
  7. Implement controllers (validation + DTO parsing) in src/controllers/<module>.controller.ts.
  8. \n
  9. Add services in src/services/<module>.service.ts and reuse AppError for controlled failures.
  10. \n
  11. Create repositories talking to Prisma in src/repositories/<module>.repository.ts.
  12. \n
  13. Add middleware/types if you need new guards or request data.
  14. \n
  15. Update docs/tests and run the dev server to smoke-test.
  16. \n
\n

Error Handling

\n

The API uses a custom AppError class for controlled error handling:

\n\n

Security Features

\n\n

Refresh Token Configuration

\n

The API implements a robust, secure Refresh Token Rotation mechanism to safely extend user sessions without compromising security.

\n

Configuration

\n

Refresh tokens are configured via environment variables in .env:

\n
ENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nREFRESH_TOKEN_EXPIRY=604800000 # 7 days in milliseconds\n
\n

Features

\n\n

CORS Configuration

\n

The API includes Cross-Origin Resource Sharing (CORS) support to allow requests from different origins (e.g., frontend applications).

\n

Configuration

\n

CORS is configured via environment variables in .env:

\n
# Comma-separated list of allowed origins\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\n\n# Allow credentials (cookies, authorization headers)\nCORS_CREDENTIALS=true\n
\n

Features

\n\n

Security Best Practices

\n
\n

[!WARNING]\nProduction Security

\n\n
\n
\n

[!IMPORTANT]\nCredentials Configuration

\n\n
\n

Environment-Specific Setup

\n

Development:

\n
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080\nCORS_CREDENTIALS=true\n
\n

Production:

\n
ALLOWED_ORIGINS=https://yourdomain.com,https://admin.yourdomain.com\nCORS_CREDENTIALS=true\n
\n

Troubleshooting

\n

CORS Error: \"No 'Access-Control-Allow-Origin' header\"

\n\n

Credentials Not Working:

\n\n

Audit Logging

\n

The API uses Pino for structured JSON logging with comprehensive audit trails:

\n

Logged Events:

\n\n

Log Format:

\n\n

Example Log:

\n
{\n  \"level\": 30,\n  \"time\": 1702890637123,\n  \"action\": \"user_login\",\n  \"userId\": \"5ba52d7e-07f9-4b15-998f-fb1bf0885e7d\",\n  \"email\": \"user@example.com\",\n  \"msg\": \"User logged in successfully\"\n}\n
\n

Deployment

\n

Production Build

\n

The project is configured to use tsup for efficient bundling.

\n
    \n
  1. Build: pnpm build\n
  2. \n
  3. Start: pnpm start\n
  4. \n
\n

Hosting Recommendations

\n\n

Database Migrations

\n

Always run migrations in production before starting the app:

\n
pnpm prisma migrate deploy\n
\n

Testing

\n

The project uses Vitest for unit and integration testing.

\n

Running Tests

\n
# Run all tests (watch mode)\npnpm test\n\n# Run unit tests only\npnpm test:unit\n\n# Run integration tests only\npnpm test:integration\n\n# Run with coverage\npnpm exec vitest run --coverage\n
\n

Test Structure

\n

Tests are organized in tests/ with separate directories for unit and integration tests:

\n
tests/\nโ”œโ”€โ”€ unit/                    # Unit tests (mocked dependencies)\nโ”‚   โ”œโ”€โ”€ controllers/\nโ”‚   โ”œโ”€โ”€ services/\nโ”‚   โ”œโ”€โ”€ middleware/\nโ”‚   โ””โ”€โ”€ utils/\nโ””โ”€โ”€ integration/             # Integration tests (real database)\n    โ”œโ”€โ”€ helpers/             # Test utilities (DB reset)\n    โ”œโ”€โ”€ repositories/        # Repository tests\n    โ””โ”€โ”€ routes/              # Route/endpoint tests\n
\n

Integration Tests

\n

Integration tests run against a real PostgreSQL database. Ensure your DATABASE_URL points to a test database that can be safely cleared between tests.

\n
\n

[!WARNING]\nIntegration tests truncate all tables before each test. Do not run against a production database.

\n
\n" - }, { "fullName": "ammar-rasyidi/mandum-rimba", "name": "mandum-rimba", @@ -1345,7 +1320,7 @@ "url": "https://github.com/ammar-rasyidi/mandum-rimba", "homepage": "https://www.mandumrimba.org", "language": "TypeScript", - "stars": 19, + "stars": 20, "forks": 5, "topics": [ "conservation", @@ -1362,7 +1337,7 @@ "pmtiles", "wildlife" ], - "updatedAt": "2026-07-20T10:31:49Z", + "updatedAt": "2026-07-21T15:22:06Z", "pushedAt": "2026-07-20T10:31:33Z", "latestRelease": { "name": "Mandum Rimba v1.0.0", @@ -1379,6 +1354,31 @@ "communityHealth": 85, "readmeHtml": "

Mandum Rimba

\n

\n \"Mandum\n

\n \"Support\n ย \n \"Support\n

If you chip in through Trakteer or PayPal, thank you. You're keeping this little project alive, and your name goes on the Rakan Rimba list if you'd like.

Prefer to scan directly? QRIS & GoPay

\n \"QRIS,\n ย ย \n \"GoPay,\n

An independent, non-profit observatory for Indonesia's forests, land, and\nprotected wildlife. A map-first public-interest web app that distills credible\nsatellite and public data, deforestation, palm oil & mining expansion, linked\ndisasters, and the wildlife losing its home, into one open map anyone can check.

\n

๐ŸŒณ Live at mandumrimba.org ยท bilingual (Indonesia / English)

\n

๐Ÿ“„ White paper, what Mandum Rimba is and why it exists:\nEnglish ยท\nBahasa Indonesia

\n
\n

Evidence over accusation. We gather and show the data as it is, and never\ndraw conclusions on anyone's behalf. We overlay official data against\nsatellite reality and let the gap speak. Every layer has a source, a date,\nand a methodology link.

\n
\n

What's on the map

\n

Live layers are checked; the rest are on the roadmap.

\n\n

Shareable cards (browser-only)

\n

Two tools turn a distant statistic into a neighbour: \"Yang Tinggal di\nDekatmu\" finds the nearest recorded threatened animal to your city (plus the\nnearest protected area) and renders a share card, and \"Kartu Penduduk Rimba\"\nissues a playful KTP-style resident card featuring that animal. Photos and\nlocation stay in the browser and are never uploaded or stored.

\n

Data & sources

\n

Every dataset is public and independently verifiable; the in-app\nmethodology and\ndata-sources pages carry per-dataset\nlicenses, coverage, and update dates, plus an honest list of the gaps where\ncredible open data does not yet exist.

\n\n

The wildlife-distribution layer is an offline build: GBIF occurrence density for\nthreatened + flagship/endemic species, weighted by ESA WorldCover natural-habitat\ncover (city points dropped) and contoured per island so a species never bleeds\nonto an island it doesn't live on. Cryptic species with no public coordinates are\nshown as documented-range markers. Pre-1990 museum specimens are excluded so the\nmap reflects present-day presence. The full build is in\nscripts/species-distribution.

\n

How it's built

\n

A pnpm + Turborepo monorepo:

\n\n

๐Ÿ“– DATA-FLOW.md explains how data moves from source to map ยท\nSETUP.md covers local setup, ingest jobs, and deployment.

\n

Local development

\n
pnpm install\n\n# each app ships an .env.example, copy and fill in source API keys + service\n# connection strings (a database and an object store), then:\ncp apps/api/.env.example apps/api/.env\ncp apps/web/.env.example apps/web/.env.local\n\npnpm dev          # web on :3000, api on :4000\n
\n

The ingest jobs run on a weekly schedule; data sources without a stable machine\nendpoint are skipped cleanly when unconfigured, so the app runs with whatever\nsubset you have keys for.

\n

Editorial principles (non-negotiable)

\n
    \n
  1. Evidence over accusation, show the data as it is; never draw conclusions\nor make claims on the user's behalf.
  2. \n
  3. Every claim is clickable, at most two clicks to the source dataset.
  4. \n
  5. Reproducible, open pipeline, public methodology and changelog.
  6. \n
  7. Never fabricate, data we cannot obtain is marked unavailable and the real\nprovider is named; we never invent coordinates, ranges, or figures.
  8. \n
  9. Bilingual, Indonesian first, English second.
  10. \n
\n

License & brand

\n

The code is open; the brand is the maintainer's. The two are licensed separately.

\n\n

Governance is a single-steward model (GOVERNANCE.md) and\ncontributions are under the Contributor License Agreement.

\n" }, + { + "fullName": "rayasabari/yntk-ts", + "name": "yntk-ts", + "owner": "rayasabari", + "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/57746279?v=4", + "description": "You Need This Kit - Type-safe Starter: REST API boilerplate that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORM, and PostgreSQL", + "metaDescription": "You Need This Kit - Type-safe Starter: REST API boilerplate that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORMโ€ฆ", + "url": "https://github.com/rayasabari/yntk-ts", + "homepage": "", + "language": "TypeScript", + "stars": 20, + "forks": 0, + "topics": [], + "updatedAt": "2026-06-25T07:10:46Z", + "pushedAt": "2026-04-08T09:29:42Z", + "latestRelease": null, + "archived": false, + "licenseSpdx": "", + "createdAt": "2026-04-08T09:27:49Z", + "openIssues": 0, + "openPullRequests": 0, + "subscribers": 0, + "communityHealth": 28, + "readmeHtml": "

YNTK-TS

\n

You Need This Kit - Type-safe Starter!

\n

TypeScript/Express REST API starter kit that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORM, and PostgreSQL. The project is organized by feature with explicit service/repository layers so business logic stays separated from transport concerns.

\n

Tech Stack

\n\n

Project Structure

\n
src/\nโ”œโ”€โ”€ app.ts                # Express app bootstrap\nโ”œโ”€โ”€ server.ts             # Starts HTTP server\nโ”œโ”€โ”€ config/               # Environment loader & Prisma client wrapper\nโ”œโ”€โ”€ controllers/          # HTTP handlers grouped by module + shared helpers\nโ”œโ”€โ”€ services/             # Business logic (auth/user) & mappers\nโ”œโ”€โ”€ repositories/         # Prisma data access per module\nโ”œโ”€โ”€ middleware/           # Cross-cutting middleware (auth, validation)\nโ”œโ”€โ”€ routes/               # Express routers mounted under /auth and /users\nโ”œโ”€โ”€ validations/          # Zod schemas for request validation\nโ”œโ”€โ”€ views/                # Email templates\nโ”œโ”€โ”€ errors/               # Custom AppError type & error utilities\nโ”œโ”€โ”€ utils/                # Shared utilities (password, string, Zod helpers)\nโ””โ”€โ”€ types/                # Shared TS types & Express module augmentation\n
\n

Getting Started

\n

1. Clone & Install

\n
pnpm install\n
\n

2. Environment Variables

\n

Create .env (never commit it) with the required settings:

\n
# Server Configuration\nNODE_ENV=development\nFRONTEND_URL=http://localhost:8080\nPORT=5050\nLOG_LEVEL=info\n\n# Database\nDATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE\n\n# JWT Configuration\nJWT_SECRET=super-secret\n\n# Bcrypt Configuration\nSALT_ROUNDS=10\n\n# Email Configuration\nEMAIL_HOST=smtp.gmail.com\nEMAIL_PORT=587\nEMAIL_USER=your-email@gmail.com\nEMAIL_PASSWORD=your-app-password\nEMAIL_FROM=noreply@yourapp.com\n\n# Token Configuration\nACCESS_TOKEN_EXPIRY=\"1h\"\nENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nREFRESH_TOKEN_EXPIRY=7 * 24 * 60 * 60 * 1000 # 7 days in miliseconds\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nRESET_PASSWORD_TOKEN_EXPIRY=1 * 60 * 60 * 1000 # 1 hour in miliseconds\nEMAIL_VERIFICATION_TOKEN_EXPIRY=24 * 60 * 60 * 10000 # 24 hours in miliseconds\n\n# CORS Configuration\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\nCORS_CREDENTIALS=true\n
\n
\n

Note for Gmail: Use an App Password instead of your regular password. Enable 2FA and generate an App Password in Google Account Settings โ†’ Security โ†’ App passwords.

\n
\n

3. Database & Prisma

\n
    \n
  1. Model updates live in prisma/schema.prisma.
  2. \n
  3. Apply migrations: pnpm prisma migrate dev (for local) or pnpm prisma db push for quick sync.
  4. \n
  5. Generate the Prisma client (needed whenever the schema changes): pnpm prisma generate. Output lands in src/generated/prisma.
  6. \n
  7. Seed the database: pnpm prisma db seed
  8. \n
\n

4. Development

\n
pnpm dev\n
\n

Runs tsx in watch mode, recompiling on changes. The API listens on PORT from the env file (defaults to 5050).

\n

Available Scripts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandPurpose
pnpm devStart the API in watch mode with tsx
pnpm prisma migrate devCreate/apply migrations and regenerate Prisma client
pnpm prisma generateRegenerate Prisma client manually
pnpm prisma db pushQuick sync schema to database without migrations
pnpm prisma db seedSeed the database
pnpm buildBuild the API for production (bundles with tsup)
pnpm startStart the production server from dist/
pnpm testRun all tests in watch mode
pnpm test:unitRun unit tests only
pnpm test:integrationRun integration tests only (sequential)
\n
\n

โ— Production build: The repo currently runs via tsx; add a tsc build + start script before deploying to production environments like Vercel/Node runtime functions.

\n
\n

API Documentation

\n

The API includes interactive documentation powered by Swagger UI and OpenAPI 3.0 (swagger-jsdoc and swagger-ui-express).

\n\n

API Endpoints

\n

All endpoints respond with { status, message, data? } JSON payloads.\nFor paginated endpoints (like GET /users and GET /roles), the response also includes meta and links objects containing paging data and HATEOAS navigational URLs. They optionally accept query parameters: ?page=1&limit=10&sortBy=createdAt&sortOrder=asc&search=value.

\n

Authentication Routes (/auth)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/auth/registerRegister a new user and send verification emailPublicregisterUserSchema
POST/auth/loginVerify credentials and return JWT tokenPublic-
POST/auth/logoutLogout and revoke refresh tokenRequiredlogoutSchema
POST/auth/refresh-tokenRefresh access token using refresh tokenPublicrefreshTokenSchema
POST/auth/verify-emailVerify email address using token from emailPublicverifyEmailSchema
POST/auth/resend-verificationResend verification email (rate limited: 3/10min)PublicresendVerificationSchema
POST/auth/forgot-passwordRequest password reset email (rate limited: 3/15min)PublicforgotPasswordSchema
POST/auth/reset-passwordReset password using token from emailPublicresetPasswordSchema
\n

User Routes (/users)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/usersCreate a user (admin-style)Required (users:create)createUserSchema
GET/usersList all usersRequired (users:read)-
GET/users/:idFetch a user by IDRequired (users:read)-
PUT/users/:idUpdate user fields (username, email, displayName)Required (users:update)updateUserSchema
PUT/users/:id/rolesAssign roles to a userRequired (roles:assign)assignRolesSchema
PATCH/users/passwordUpdate current user's passwordRequired (users:update)updatePasswordSchema
DELETE/users/:idRemove a userRequired (users:delete)-
\n

Role & Permission Routes (/roles & /permissions)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
GET/rolesList all rolesRequired (roles:read)-
GET/roles/:idFetch a role by IDRequired (roles:read)-
POST/rolesCreate a new roleRequired (roles:create)createRoleSchema
PUT/roles/:idUpdate an existing roleRequired (roles:update)updateRoleSchema
DELETE/roles/:idRemove a roleRequired (roles:delete)-
GET/permissionsList all system permissionsRequired (roles:read)-
\n

Auth Required: Endpoints require Authorization: Bearer <token> header.

\n

Validation Schemas

\n

The API uses Zod for request validation with the following schemas:

\n\n

All schemas include:

\n\n

Middleware

\n\n

Adding New Modules

\n
    \n
  1. Plan the data shape (Prisma model, DTOs, response contract).
  2. \n
  3. Create Zod schemas in src/validations/<module>.validation.ts for request validation.
  4. \n
  5. Create routes under src/routes/<module>.routes.ts and mount them in src/routes/index.ts.
  6. \n
  7. Implement controllers (validation + DTO parsing) in src/controllers/<module>.controller.ts.
  8. \n
  9. Add services in src/services/<module>.service.ts and reuse AppError for controlled failures.
  10. \n
  11. Create repositories talking to Prisma in src/repositories/<module>.repository.ts.
  12. \n
  13. Add middleware/types if you need new guards or request data.
  14. \n
  15. Update docs/tests and run the dev server to smoke-test.
  16. \n
\n

Error Handling

\n

The API uses a custom AppError class for controlled error handling:

\n\n

Security Features

\n\n

Refresh Token Configuration

\n

The API implements a robust, secure Refresh Token Rotation mechanism to safely extend user sessions without compromising security.

\n

Configuration

\n

Refresh tokens are configured via environment variables in .env:

\n
ENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nREFRESH_TOKEN_EXPIRY=604800000 # 7 days in milliseconds\n
\n

Features

\n\n

CORS Configuration

\n

The API includes Cross-Origin Resource Sharing (CORS) support to allow requests from different origins (e.g., frontend applications).

\n

Configuration

\n

CORS is configured via environment variables in .env:

\n
# Comma-separated list of allowed origins\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\n\n# Allow credentials (cookies, authorization headers)\nCORS_CREDENTIALS=true\n
\n

Features

\n\n

Security Best Practices

\n
\n

[!WARNING]\nProduction Security

\n\n
\n
\n

[!IMPORTANT]\nCredentials Configuration

\n\n
\n

Environment-Specific Setup

\n

Development:

\n
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080\nCORS_CREDENTIALS=true\n
\n

Production:

\n
ALLOWED_ORIGINS=https://yourdomain.com,https://admin.yourdomain.com\nCORS_CREDENTIALS=true\n
\n

Troubleshooting

\n

CORS Error: \"No 'Access-Control-Allow-Origin' header\"

\n\n

Credentials Not Working:

\n\n

Audit Logging

\n

The API uses Pino for structured JSON logging with comprehensive audit trails:

\n

Logged Events:

\n\n

Log Format:

\n\n

Example Log:

\n
{\n  \"level\": 30,\n  \"time\": 1702890637123,\n  \"action\": \"user_login\",\n  \"userId\": \"5ba52d7e-07f9-4b15-998f-fb1bf0885e7d\",\n  \"email\": \"user@example.com\",\n  \"msg\": \"User logged in successfully\"\n}\n
\n

Deployment

\n

Production Build

\n

The project is configured to use tsup for efficient bundling.

\n
    \n
  1. Build: pnpm build\n
  2. \n
  3. Start: pnpm start\n
  4. \n
\n

Hosting Recommendations

\n\n

Database Migrations

\n

Always run migrations in production before starting the app:

\n
pnpm prisma migrate deploy\n
\n

Testing

\n

The project uses Vitest for unit and integration testing.

\n

Running Tests

\n
# Run all tests (watch mode)\npnpm test\n\n# Run unit tests only\npnpm test:unit\n\n# Run integration tests only\npnpm test:integration\n\n# Run with coverage\npnpm exec vitest run --coverage\n
\n

Test Structure

\n

Tests are organized in tests/ with separate directories for unit and integration tests:

\n
tests/\nโ”œโ”€โ”€ unit/                    # Unit tests (mocked dependencies)\nโ”‚   โ”œโ”€โ”€ controllers/\nโ”‚   โ”œโ”€โ”€ services/\nโ”‚   โ”œโ”€โ”€ middleware/\nโ”‚   โ””โ”€โ”€ utils/\nโ””โ”€โ”€ integration/             # Integration tests (real database)\n    โ”œโ”€โ”€ helpers/             # Test utilities (DB reset)\n    โ”œโ”€โ”€ repositories/        # Repository tests\n    โ””โ”€โ”€ routes/              # Route/endpoint tests\n
\n

Integration Tests

\n

Integration tests run against a real PostgreSQL database. Ensure your DATABASE_URL points to a test database that can be safely cleared between tests.

\n
\n

[!WARNING]\nIntegration tests truncate all tables before each test. Do not run against a production database.

\n
\n" + }, { "fullName": "rizukirr/hyprsimple", "name": "hyprsimple", @@ -1634,7 +1634,7 @@ "windows-desktop" ], "updatedAt": "2026-07-21T05:40:00Z", - "pushedAt": "2026-07-21T05:44:30Z", + "pushedAt": "2026-07-21T17:29:02Z", "latestRelease": { "name": "v0.3.2", "tagName": "v0.3.2", @@ -1645,7 +1645,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-02-23T13:59:12Z", "openIssues": 1, - "openPullRequests": 0, + "openPullRequests": 1, "subscribers": 0, "communityHealth": 75, "readmeHtml": "

Muslimtify

\n

Muslimtify keeps you consistent with your daily prayers by delivering accurate prayer times and timely desktop notifications. Designed for Linux and Windows, it automatically calculates prayer schedules and reminds you 30, 15, and 5 minutes before the Adhan โ€” or at your own custom intervals โ€” and when it's time to pray. All calculations run locally, requiring no internet connection or external services.

\n

Muslimtify supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag. With persistent configuration and minimal setup, Muslimtify integrates seamlessly into your daily routine without interrupting your workflow.

\n
\n

[!Note]\nPrayer time calculations are powered by libmuslim, a portable library extracted from this project to enable a more flexible and reusable ecosystem for Muslim developers.

\n
\n\n\n\n\n\n\n\n\n\n\n\n
LinuxWindows
\"2026-07-08-202423_hyprshot\"\"Cuplikan
\n
\n

Roadmap

\n\n
\n
\n

[!Important]\nThis project is available for Linux and Windows users, but not yet for Mac users because we need a Mac device to make Muslimtify run on macOS. We are looking for brothers and sisters who have a Mac and experience in low-level C programming to contribute to the project and help bring Muslimtify to macOS. Alternatively, you can support us via GitHub Sponsors in the sponsor section.

\n
\n

Installation

\n

Prebuilt Binaries (GitHub Releases)

\n

Every release ships ready-to-run binaries for Linux and Windows on the\nReleases page.

\n

Linux (x86_64 or aarch64) โ€” the binaries are dynamically linked, so\ninstall the runtime libraries first, then extract and install:

\n
# Ubuntu/Debian\nsudo apt install libnotify4 libcurl4\n# Fedora/RHEL\nsudo dnf install libnotify libcurl\n# Arch\nsudo pacman -S libnotify curl\n\ntar xzf muslimtify-<version>-linux-<arch>.tar.gz\nsudo cp -r muslimtify-<version>-linux-<arch>/{bin,lib,share} /usr/local/\nmuslimtify daemon install\n
\n

Windows (x64 or arm64) โ€” download and run the matching installer:

\n
muslimtify-<version>-setup-x64.exe      # Intel/AMD\nmuslimtify-<version>-setup-arm64.exe    # ARM\n
\n

Verify any download against the published checksums:

\n
sha256sum -c SHA256SUMS\n
\n

Arch Linux (AUR)

\n
yay -S muslimtify\n
\n

Fedora (COPR)

\n
sudo dnf copr enable rizukirr/muslimtify\nsudo dnf install muslimtify\n
\n

Debian/Ubuntu (PPA)

\n
sudo add-apt-repository ppa:rizukirr/muslimtify\nsudo apt update\nsudo apt install muslimtify\n
\n

Linux Source Install

\n

Install dependencies:

\n
# Ubuntu/Debian\nsudo apt install git build-essential cmake pkg-config libnotify-dev libcurl4-openssl-dev\n\n# Fedora/RHEL\nsudo dnf install git gcc cmake pkgconfig libnotify-devel libcurl-devel\n\n# Arch Linux\nsudo pacman -S git base-devel cmake pkgconfig libnotify curl\n
\n

Clone, install, and enable background checks:

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\nsudo ./install.sh\nmuslimtify daemon install\n
\n

Windows (winget)

\n
winget install muslimtify\n
\n

Windows Source Install

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\n.\\install.ps1\nmuslimtify daemon install\n
\n

To remove the Windows install later, run .\\uninstall.ps1.

\n

If you prefer building manually first:

\n
cmake -S . -B build\ncmake --build build --config Release\ncmake --install build --config Release\nmuslimtify daemon install\n
\n

Post Installation

\n

Run muslimtify daemon status to check if Muslimtify is registered with systemd. If no status is found, run muslimtify daemon install to register the service and ensure it runs as expected.

\n

Muslimtify automatically selects the standard prayer time calculation method based on your country and location. Run muslimtify to verify that your configuration is correct. If the automatic selection does not meet your needs, you can set it manually using muslimtify method <key-method>. A full list of available methods is documented here.

\n

Configuration

\n

Muslimtify can be configured with CLI commands or by editing config.json\nmanually.

\n

Config paths:

\n\n

Common setup commands:

\n
muslimtify location set --auto                  # detect location from IP\nmuslimtify location set --auto --city=Mansoura  # auto-detect but use your own city label\nmuslimtify method --auto                        # select method from the detected country\nmuslimtify location set --lat=-6.175 --long=106.82  # set location manually (uses system timezone)\nmuslimtify location set --timezone=Asia/Jakarta     # override timezone\nmuslimtify location set --city=Jakarta              # add a city label\nmuslimtify location set --refresh-interval=21600    # re-check location every 6h (0=off, min 3600)\nmuslimtify method --list          # list all available calculation methods\nmuslimtify method mwl             # set calculation method\nmuslimtify madzhab hanafi         # set madzhab (shafi/hanafi)\nmuslimtify notification --reminder --all 30 15 5    # set every prayer's reminders (minutes before adhan)\nmuslimtify notification --reminder fajr 30 15 5     # set reminders for a single prayer\nmuslimtify notification           # show current notification settings\nmuslimtify location               # show current location\n
\n

Resetting the configuration is done by deleting config.json. Muslimtify falls\nback to built-in defaults when the file is missing, and rewrites it the next\ntime you change a setting. Validation runs automatically every time the config\nis loaded.

\n

Calculation Methods

\n

Muslimtify supports the following calculation methods:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by setting \"method\": \"custom\" in config.json with your own fajr_angle and isha_angle values.

\n

Manual JSON editing is useful when you want precise control over enabled\nprayers, reminder offsets, notification settings, or location data.

\n\nDefault config.json
{\n  \"location\": {\n    \"latitude\": 0.0,\n    \"longitude\": 0.0,\n    \"timezone\": \"UTC\",\n    \"timezone_offset\": 0.0,\n    \"auto_detect\": true,\n    \"city\": \"\",\n    \"country\": \"\"\n  },\n  \"prayers\": {\n    \"fajr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"sunrise\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuha\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuhr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"asr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"maghrib\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"isha\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    }\n  },\n  \"notification\": {\n    \"timeout\": 5000,\n    \"urgency\": \"critical\",\n    \"sound\": \"adhan\",\n    \"sound_alarm\": \"alarm\",\n    \"sound_reminder\": \"reminder\",\n    \"icon\": \"muslimtify\"\n  },\n  \"calculation\": {\n    \"method\": \"kemenag\",\n    \"madhab\": \"shafi\"\n  }\n}\n
\n

Troubleshooting

\n

Notifications are not appearing

\n\n

Location detection is not working

\n\n

Contributing

\n

Contributions are welcome. See CONTRIBUTING.md for workflow,\nstyle, and testing guidance.

\n

License

\n

Muslimtify is released under the MIT License. See the repository license files\nfor details.

\n

Support

\n\n" @@ -2094,13 +2094,13 @@ "stars": 6, "forks": 0, "topics": [], - "updatedAt": "2026-07-19T14:21:27Z", - "pushedAt": "2026-07-19T14:21:23Z", + "updatedAt": "2026-07-21T16:55:29Z", + "pushedAt": "2026-07-21T16:53:35Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-06-01T10:04:41Z", - "openIssues": 2, + "openIssues": 1, "openPullRequests": 0, "subscribers": 0, "communityHealth": 100, @@ -2454,8 +2454,8 @@ "stars": 1, "forks": 0, "topics": [], - "updatedAt": "2026-07-20T13:35:57Z", - "pushedAt": "2026-07-20T13:35:09Z", + "updatedAt": "2026-07-21T16:31:36Z", + "pushedAt": "2026-07-21T16:30:12Z", "latestRelease": { "name": "v1.1.0", "tagName": "v1.1.0", From cc6c40cef74b729ee4e6a36e1a783d81549574a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 19:56:52 +0000 Subject: [PATCH 05/25] Sync content data --- src/data/projects.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 24837c4..1e18f83 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -491,7 +491,7 @@ "vector-database" ], "updatedAt": "2026-07-21T16:26:31Z", - "pushedAt": "2026-07-21T16:25:00Z", + "pushedAt": "2026-07-21T18:55:04Z", "latestRelease": { "name": "Release v0.9.1", "tagName": "v0.9.1", @@ -502,7 +502,7 @@ "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", "openIssues": 2, - "openPullRequests": 1, + "openPullRequests": 6, "subscribers": 0, "communityHealth": 75, "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" @@ -658,7 +658,7 @@ "homepage": "https://keirouter.app", "language": "Go", "stars": 89, - "forks": 30, + "forks": 32, "topics": [ "ai", "ai-gateway", From cf192bc4c77107777c16958e934d3f43f279a1fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 21:36:29 +0000 Subject: [PATCH 06/25] Sync content data --- src/data/projects.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 1e18f83..db556a9 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -2094,8 +2094,8 @@ "stars": 6, "forks": 0, "topics": [], - "updatedAt": "2026-07-21T16:55:29Z", - "pushedAt": "2026-07-21T16:53:35Z", + "updatedAt": "2026-07-21T20:20:21Z", + "pushedAt": "2026-07-21T20:19:56Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", From 6cd62a91ec2b72ccef741bdbaf8122351ba0dc81 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 23:15:41 +0000 Subject: [PATCH 07/25] Sync content data --- src/data/projects.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index db556a9..6daf997 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -107,7 +107,7 @@ "archived": false, "licenseSpdx": "GPL-2.0", "createdAt": "2013-12-25T01:35:51Z", - "openIssues": 36, + "openIssues": 37, "openPullRequests": 12, "subscribers": 71, "communityHealth": 71, @@ -491,7 +491,7 @@ "vector-database" ], "updatedAt": "2026-07-21T16:26:31Z", - "pushedAt": "2026-07-21T18:55:04Z", + "pushedAt": "2026-07-21T23:08:36Z", "latestRelease": { "name": "Release v0.9.1", "tagName": "v0.9.1", @@ -502,7 +502,7 @@ "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", "openIssues": 2, - "openPullRequests": 6, + "openPullRequests": 7, "subscribers": 0, "communityHealth": 75, "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" From ce79c528b34687774b4e7238560a2d8143e33d6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 00:12:58 +0000 Subject: [PATCH 08/25] Sync content data --- src/data/projects.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 6daf997..b65d8db 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 353, + "openIssues": 352, "openPullRequests": 7, "subscribers": 110, "communityHealth": 50, @@ -490,22 +490,22 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-21T16:26:31Z", - "pushedAt": "2026-07-21T23:08:36Z", + "updatedAt": "2026-07-21T23:35:10Z", + "pushedAt": "2026-07-21T23:43:24Z", "latestRelease": { - "name": "Release v0.9.1", - "tagName": "v0.9.1", - "url": "https://github.com/codecoradev/uteke/releases/tag/v0.9.1", - "publishedAt": "2026-07-21T03:26:25Z" + "name": "Release v0.10.0", + "tagName": "v0.10.0", + "url": "https://github.com/codecoradev/uteke/releases/tag/v0.10.0", + "publishedAt": "2026-07-21T23:44:04Z" }, "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", - "openIssues": 2, - "openPullRequests": 7, + "openIssues": 1, + "openPullRequests": 6, "subscribers": 0, "communityHealth": 75, - "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" + "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" }, { "fullName": "jipraks/kasirgratisan", From 42df02a80bbf0d38c0bbd2831ac8f049848860f7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 03:52:19 +0000 Subject: [PATCH 09/25] Sync content data --- src/data/projects.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index b65d8db..0d80b10 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -9,7 +9,7 @@ "url": "https://github.com/faisalman/ua-parser-js", "homepage": "https://uaparser.dev/", "language": "JavaScript", - "stars": 10167, + "stars": 10168, "forks": 1220, "topics": [ "analytics", @@ -21,7 +21,7 @@ "user-agent", "user-agent-parser" ], - "updatedAt": "2026-07-21T11:48:35Z", + "updatedAt": "2026-07-22T01:49:00Z", "pushedAt": "2026-07-20T18:03:11Z", "latestRelease": { "name": "v2.0.10", @@ -170,7 +170,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-01-15T09:55:34Z", - "openIssues": 5, + "openIssues": 6, "openPullRequests": 0, "subscribers": 15, "communityHealth": 57, @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T16:59:14Z", - "pushedAt": "2026-07-21T17:47:41Z", + "updatedAt": "2026-07-22T01:05:48Z", + "pushedAt": "2026-07-22T01:05:43Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 18, - "openPullRequests": 3, + "openIssues": 15, + "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent. Stop paying Claude to read 10,000 lines of terminal noise like a headphone for AI agent\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -352,13 +352,13 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-21T12:20:47Z", - "pushedAt": "2026-07-21T12:21:09Z", + "updatedAt": "2026-07-22T00:42:07Z", + "pushedAt": "2026-07-22T02:15:46Z", "latestRelease": { - "name": "v3.1.4", - "tagName": "v3.1.4", - "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.1.4", - "publishedAt": "2026-07-21T12:21:09Z" + "name": "v3.1.5", + "tagName": "v3.1.5", + "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.1.5", + "publishedAt": "2026-07-22T00:42:49Z" }, "archived": false, "licenseSpdx": "", @@ -380,7 +380,7 @@ "homepage": "https://termul.dev", "language": "TypeScript", "stars": 164, - "forks": 33, + "forks": 34, "topics": [ "cross-platform", "desktop-app", @@ -408,7 +408,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-01-13T04:36:02Z", "openIssues": 39, - "openPullRequests": 11, + "openPullRequests": 12, "subscribers": 0, "communityHealth": 71, "readmeHtml": "

๐Ÿ–ฅ๏ธ Termul Manager

\n

A modern, project-aware terminal manager built with Tauri

\n

Termul treats workspaces as first-class citizens, allowing you to organize terminals by project with persistent sessions, snapshots, and a clean tabbed interface.

\n

\"GitHub\n\"GitHub\n\"License\"\n\"Latest

\n

\"Platform\"\n\"Tauri\"\n\"React\"\n\"TypeScript\"

\n

Getting Started ยท Features ยท Documentation ยท Contributing ยท Report Bug ยท Request Feature

\n

\n

โœจ Features

\n

๐ŸชŸ Workspace & Terminal Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Project-Based WorkspacesOrganize terminals by project with dedicated workspace directories, separate state, and per-project configuration
Pane-Based Split LayoutSplit your workspace into resizable panes and arrange terminals, editors, and browser tabs side by side
Tabbed InterfaceWindows Terminal-style tab bar with drag-and-drop reordering, rename, and context menu
Multiple Shell SupportAuto-detects PowerShell, CMD, Git Bash, WSL, fish, zsh, and more; switch shells per tab
\n

๐Ÿ“ Editor & File Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Code EditorBuilt-in code editor with syntax highlighting, file buffers, dirty-state tracking, and save/reload
Markdown EditorRich markdown editing powered by BlockNote with live preview, table of contents, and heading navigation
Mermaid DiagramsRender Mermaid diagrams inline within your markdown documents
File ExplorerFull file tree with create, rename, delete, clipboard operations, drag-and-drop, and context menus
File WatchingLive file watching for real-time updates as files change on disk
\n

๐ŸŒ Browser & Annotation

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Embedded Browser TabsBrowse the web directly inside your workspace using child webview tabs โ€” no app switching
Annotation WorkflowCapture browser states, annotate with severity and intent labels, review, and export
Annotation ExportPackage annotations with metadata into structured export formats
\n

โšก Power User Tools

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Command PaletteGlobal command launcher (Ctrl+K / Ctrl+Shift+P) for project switching, workspace actions, and more
Command HistoryPer-project and aggregate command history viewer with search
Keyboard ShortcutsFully customizable shortcut bindings for every action
Git IntegrationStatus bar shows current branch, working directory, git status, and exit code
Custom Title BarDesktop-native title bar with window controls, sidebar toggles, and settings navigation
\n

๐Ÿ”ง System & Reliability

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Auto-UpdaterBuilt-in update infrastructure with signed artifacts โ€” get notified and update without leaving the app
State ManagementZustand-powered reactive stores for projects, terminals, workspace layout, editor buffers, browser sessions, and settings
Configurable SettingsTerminal and UI preferences, color picker, theme customization, and shell configuration
Cross-PlatformWorks on Windows, macOS, and Linux with native platform packaging
Error BoundariesGraceful error handling with runtime error boundaries and user-friendly fallback UI
\n\n๐Ÿ—บ๏ธ Feature Map โ€” Component Overview\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DomainKey ComponentsZustand Store
WorkspaceWorkspaceLayout, PaneRenderer, PaneContent, WorkspaceTabBarworkspace-store
TerminalConnectedTerminal, XTerminal, TerminalSearchBar, ActivityIndicatorterminal-store
EditorEditorPanel, CodeEditor, MarkdownEditor, EditorToolbar, MermaidBlockeditor-store
BrowserBrowserPanel, BrowserControls, AnnotationPanel, AnnotationExportModalbrowser-session-store, annotation-store
File ExplorerFileExplorer, FileTreeNode, FileTreeContextMenuโ€”
SnapshotsCreateSnapshotModal, RestoreSnapshotModal, DeleteSnapshotModalsnapshot-store
ProjectsProjectSidebar, NewProjectModalproject-store
SettingsShortcutRecorder, ColorPickerPopover, ContextBarSettingsPopoverapp-settings-store, context-bar-settings-store
UpdatesUpdateAvailableToast, UpdateReadyModalupdater-store
SharedCommandPalette, ContextMenu, ConfirmDialog, ShellSelector, ErrorBoundaryโ€”
\n

๐Ÿ“ธ Screenshots

\n

\"Termul

\n

๐Ÿ“ฆ Install

\n

Homebrew (macOS)

\n
brew tap gnoviawan/termul\nbrew install --cask termul\n
\n

curl (macOS/Linux)

\n
curl -fsSL https://raw.githubusercontent.com/gnoviawan/termul/main/scripts/install.sh | bash\n
\n

Windows users should install the .exe or .msi from GitHub Releases. Manual DMG downloads in a browser may still hit Gatekeeper, so macOS users should prefer Homebrew or curl.

\n

๐Ÿš€ Getting Started

\n

Prerequisites

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DependencyVersionNotes
Bun1.3+JavaScript runtime and package manager
RustLatest stableRequired for Tauri builds
\n

Platform-Specific Requirements

\n\nWindows\n\nmacOS
xcode-select --install\n
\n\nLinux (Debian/Ubuntu)
sudo apt update\nsudo apt install libwebkit2gtk-4.1-dev \\\n    build-essential curl wget file \\\n    libxdo-dev libssl-dev \\\n    libayatana-appindicator3-dev \\\n    librsvg2-dev patchelf\n
\n\nLinux (Fedora)
sudo dnf install webkit2gtk4.1-devel \\\n    gcc gcc-c++ libopenssl-devel \\\n    appindicator-devel librsvg2-devel \\\n    patchelf\n
\n

Install Rust Toolchain

\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nrustc --version && cargo --version\n
\n

Quick Start

\n
# Clone the repository\ngit clone https://github.com/gnoviawan/termul.git\ncd termul\n\n# Install dependencies\nbun install\n\n# Launch in development mode\nbun run dev\n
\n

Landing Page

\n

This repository also includes a standalone Vite landing page under landing/.

\n
# Install landing page dependencies (from landing/)\ncd landing && bun install\n\n# Start the landing page dev server\nbun run landing:dev\n\n# Lint the landing page\nbun run landing:lint\n\n# Build the landing page for production\nbun run landing:build\n
\n

Building for Production

\n
# Build for your current platform\nbun run build\n\n# Platform-specific builds\nbun run build:tauri:win        # Windows (x64)\nbun run build:tauri:mac-arm    # macOS (Apple Silicon)\nbun run build:tauri:mac-x64    # macOS (Intel)\nbun run build:tauri:linux      # Linux (x64)\n\n# Debug build (faster compilation, larger binary)\nbun run build:tauri:debug\n
\n

Build output: src-tauri/target/release/bundle/

\n

๐Ÿ“– Documentation

\n

Usage

\n

Creating a Project

\n
    \n
  1. Click the + button in the sidebar to create a new project
  2. \n
  3. Select a workspace directory
  4. \n
  5. Configure your default shell (optional)
  6. \n
\n

Terminal Tabs

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionHow
New terminalClick + next to tabs
Select specific shellClick the dropdown arrow
Reorder tabsDrag and drop
Rename tabDouble-click the tab
Context menuRight-click (rename, close, kill process)
\n

Keyboard Shortcuts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionDefault Shortcut
New TerminalCtrl+T
Next TabCtrl+PageDown
Previous TabCtrl+PageUp
Command PaletteCtrl+K / Ctrl+Shift+P
\n
\n

Shortcuts are customizable in Settings. On Tauri/WebView2, browser-reserved shortcuts such as Ctrl+Tab are not used as defaults because they are not reliably interceptable.

\n
\n

Architecture

\n

Tech Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerTechnology
Desktop RuntimeTauri 2.0
BackendRust
UI FrameworkReact 18
Type SystemTypeScript
Build ToolVite
StylingTailwind CSS + shadcn/ui
State ManagementZustand
Terminal Emulationtauri-pty + xterm.js
AnimationsFramer Motion
\n

Tauri Plugins

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PluginPurpose
@tauri-apps/plugin-fsFilesystem access
@tauri-apps/plugin-storeConfiguration persistence
@tauri-apps/plugin-osOS information
@tauri-apps/plugin-dialogNative dialogs
@tauri-apps/plugin-clipboard-managerClipboard operations
@tauri-apps/plugin-updaterAutomatic updates
@tauri-apps/plugin-processProcess management
\n

Project Structure

\n
src/\nโ”œโ”€โ”€ renderer/           # React frontend\nโ”‚   โ”œโ”€โ”€ components/     # UI components\nโ”‚   โ”œโ”€โ”€ hooks/          # Custom React hooks\nโ”‚   โ”œโ”€โ”€ lib/            # Runtime adapters & desktop integration\nโ”‚   โ”œโ”€โ”€ pages/          # Page components\nโ”‚   โ””โ”€โ”€ stores/         # Zustand stores\nโ”œโ”€โ”€ shared/             # Shared types (main/renderer)\nsrc-tauri/              # Rust backend, config & bundling\ndocs/electron-old/      # Archived Electron docs & migration history\n
\n

Platform Adapters

\n

The renderer uses an adapter/service layer to keep desktop integrations isolated from UI code:

\n
src/renderer/lib/\nโ”œโ”€โ”€ tauri-*.ts        # Tauri-native integrations\nโ”œโ”€โ”€ *.ts              # Runtime-safe facades & helpers\nโ””โ”€โ”€ __tests__/        # Regression & parity coverage\n
\n

๐Ÿ› ๏ธ Development

\n
bun run dev              # Development mode with hot reload\nbun run test             # Run tests\nbun run test:watch       # Tests in watch mode\nbun run typecheck        # Type checking\nbun run lint             # Linting\nbun run tauri <command>  # Direct Tauri CLI access\n
\n

SSH Development Notes

\n\n

โญ Star History

\n

\"Star

\n

๐Ÿค Contributing

\n

Contributions are welcome! Please read the Contributing Guide for details on our code of conduct and the process for submitting pull requests.

\n

๐Ÿ“„ License

\n

This project is licensed under the MIT License โ€” see the LICENSE file for details.

\n

๐Ÿ™ Acknowledgments

\n\n
\n

Built with โค๏ธ by gnoviawan

\n
\n" @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 123, + "stars": 124, "forks": 15, "topics": [ "ai", @@ -490,7 +490,7 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-21T23:35:10Z", + "updatedAt": "2026-07-22T02:35:50Z", "pushedAt": "2026-07-21T23:43:24Z", "latestRelease": { "name": "Release v0.10.0", @@ -501,7 +501,7 @@ "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", - "openIssues": 1, + "openIssues": 2, "openPullRequests": 6, "subscribers": 0, "communityHealth": 75, @@ -2454,8 +2454,8 @@ "stars": 1, "forks": 0, "topics": [], - "updatedAt": "2026-07-21T16:31:36Z", - "pushedAt": "2026-07-21T16:30:12Z", + "updatedAt": "2026-07-22T02:39:52Z", + "pushedAt": "2026-07-22T02:39:48Z", "latestRelease": { "name": "v1.1.0", "tagName": "v1.1.0", From 397c5c3e39f15d5ed6970c399c5ed0a7ec902c76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 04:59:48 +0000 Subject: [PATCH 10/25] Sync content data --- src/data/blog-posts.json | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/data/blog-posts.json b/src/data/blog-posts.json index 49c9ae0..524ce12 100644 --- a/src/data/blog-posts.json +++ b/src/data/blog-posts.json @@ -1,4 +1,42 @@ [ + { + "slug": "onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia", + "path": "content/2026/07/onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia.md", + "year": "2026", + "month": "07", + "title": "Onno W. Purbo: Bapak Open Source dan Sang Pembebas Internet Indonesia", + "description": "Artikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.", + "date": "2026-07-22", + "tags": [ + "open-source", + "tokoh", + "internet", + "pendidikan" + ], + "status": "draft", + "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/onno-w-purbo.png", + "content": "Jika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](./assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", + "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia.md", + "releasedAt": "2026-07-22", + "lastModifiedAt": "2026-07-22T04:58:51Z", + "latestCommitSha": "92208f873f5c0ba8321b73d5ee0bd48a0c18ee2a", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/92208f873f5c0ba8321b73d5ee0bd48a0c18ee2a", + "author": { + "name": "wauputr4", + "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", + "url": "https://github.com/wauputr4", + "committedAt": "2026-07-22T04:58:51Z" + }, + "authors": [ + { + "name": "wauputr4", + "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", + "url": "https://github.com/wauputr4", + "committedAt": "2026-07-22T04:58:51Z" + } + ], + "authorFromFrontmatter": false + }, { "slug": "it-camp-2026-open-source-ai-lokal", "path": "content/2026/07/it-camp-2026-open-source-ai-lokal.md", From 2dfdfb40137c8e353296f800fd58af3e3a7c1c42 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 05:01:58 +0000 Subject: [PATCH 11/25] Sync content data --- src/data/blog-posts.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/blog-posts.json b/src/data/blog-posts.json index 524ce12..cd89d7a 100644 --- a/src/data/blog-posts.json +++ b/src/data/blog-posts.json @@ -15,12 +15,12 @@ ], "status": "draft", "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/onno-w-purbo.png", - "content": "Jika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](./assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", + "content": "Jika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia.md", "releasedAt": "2026-07-22", - "lastModifiedAt": "2026-07-22T04:58:51Z", - "latestCommitSha": "92208f873f5c0ba8321b73d5ee0bd48a0c18ee2a", - "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/92208f873f5c0ba8321b73d5ee0bd48a0c18ee2a", + "lastModifiedAt": "2026-07-22T05:01:25Z", + "latestCommitSha": "0951b54cc8fa042436cea76288f2122d27182090", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/0951b54cc8fa042436cea76288f2122d27182090", "author": { "name": "wauputr4", "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", From fc721b930f076c2de46f54e62680abe3b64685b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 05:12:32 +0000 Subject: [PATCH 12/25] Sync content data --- src/data/blog-posts.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/blog-posts.json b/src/data/blog-posts.json index cd89d7a..d968d52 100644 --- a/src/data/blog-posts.json +++ b/src/data/blog-posts.json @@ -15,12 +15,12 @@ ], "status": "draft", "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/onno-w-purbo.png", - "content": "Jika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", + "content": "*Thumbnail artikel ini telah disesuaikan ukurannya dengan bantuan AI.*\n\nJika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia.md", "releasedAt": "2026-07-22", - "lastModifiedAt": "2026-07-22T05:01:25Z", - "latestCommitSha": "0951b54cc8fa042436cea76288f2122d27182090", - "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/0951b54cc8fa042436cea76288f2122d27182090", + "lastModifiedAt": "2026-07-22T05:11:57Z", + "latestCommitSha": "e04f7a783874ae590f5ef40fc643f099a8fd5242", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/e04f7a783874ae590f5ef40fc643f099a8fd5242", "author": { "name": "wauputr4", "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", From a983d4a795dad2d376b4dedd9358079bde3db06d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 05:16:59 +0000 Subject: [PATCH 13/25] Sync content data --- src/data/blog-posts.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/blog-posts.json b/src/data/blog-posts.json index d968d52..b940063 100644 --- a/src/data/blog-posts.json +++ b/src/data/blog-posts.json @@ -15,12 +15,12 @@ ], "status": "draft", "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/onno-w-purbo.png", - "content": "*Thumbnail artikel ini telah disesuaikan ukurannya dengan bantuan AI.*\n\nJika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", + "content": "Thumbnail artikel ini telah disesuaikan ukurannya dengan bantuan AI.\n\nJika kita berbicara tentang perkembangan dunia Teknologi Informasi (TI) dan internet di Indonesia, rasanya mustahil untuk tidak menyebut nama Prof. Dr. Eng. Ir. Onno Widodo Purbo, M.Eng., Ph.D. Sosok pria kelahiran Bandung, 17 Agustus 1962 ini dikenal luas sebagai \"Bapak Internet Indonesia\" sekaligus pejuang tangguh gerakan *Open Source* di Tanah Air. Di balik penampilannya yang ceplas-ceplos dan sangat sederhana kerap hanya mengenakan kaos, celana pendek, dan hobi bepergian dengan sepeda tersimpan visi besar yang telah mendobrak batasan akses informasi bagi jutaan rakyat Indonesia.\n\nArtikel ini akan mengupas tuntas perjalanan hidup, pemikiran, kiprah, serta deretan karya Onno W. Purbo yang menjadikannya salah satu tokoh teknologi paling dihormati, tidak hanya di Indonesia, tetapi juga di mata dunia.\n\n## Titik Awal: Ketertarikan pada Lampu Kelap-Kelip dan Pesawat Terbang\n\nLahir dari pasangan Prof. Ir. Hasan Poerbo, seorang guru besar arsitektur dan lingkungan hidup di Institut Teknologi Bandung (ITB), dan Partini, Onno tumbuh di lingkungan yang kental dengan nilai-nilai intelektual dan keberpihakan pada rakyat kecil. Ketertarikannya pada dunia teknik sudah terlihat sejak ia duduk di bangku kelas 3 SMP. Saat itu, ia membuat sebuah prakarya lampu *flip-flop* (lampu yang menyala kelap-kelip secara bergantian) dan menghabiskan semalaman penuh hanya untuk menatap dan memikirkan bagaimana lampu tersebut bisa bekerja sedemikian rupa.\n\nMemasuki masa SMA, minat Onno semakin bercabang. Terinspirasi dari ayahnya yang pernah berkarier di TNI dan tren B.J. Habibie pada masa itu, Onno sempat mendalami *aeromodeling* dengan membuat pesawat layang (*glider*) sepanjang 1,5 meter hasil rancangannya sendiri. Namun, pada saat yang bersamaan, ia juga keranjingan mendengarkan siaran radio gelombang pendek (SW) dan belajar membuat pemancar radio sendiri dari tabung-tabung bekas.\n\nBerkat dorongan sang ayah yang melihat masa depan cerah di bidang elektronika, Onno akhirnya memilih masuk ke jurusan Teknik Elektro ITB pada tahun 1981. Di kampus inilah, Onno semakin aktif dalam Organisasi Amatir Radio Indonesia (ORARI) dan mulai bereksperimen menghubungkan komputer dengan pemancar radio, sebuah cikal bakal dari teknologi internet tanpa kabel yang kelak ia kembangkan. Ia lulus sebagai wisudawan terbaik pada tahun 1987.\n\n## Membangun Jaringan Internet dari Jarak Jauh\n\nSetelah lulus dari ITB, Onno mendapatkan beasiswa untuk melanjutkan studi S2 di McMaster University, Kanada, di bidang Semikonduktor Laser (lulus 1989), dan kemudian S3 di Universitas Waterloo, Kanada, di bidang Teknologi Rangkaian Terintegrasi untuk Satelit (lulus 1993).\n\nTinggal di luar negeri memunculkan satu masalah klasik: mahalnya biaya komunikasi ke Indonesia. Tidak kehabisan akal, Onno menggunakan jaringan Bitnet di kampus-kampus Amerika Utara dan mengombinasikannya dengan frekuensi radio amatir. Dengan meminta izin kepada pemerintah Kanada untuk memancar menggunakan lisensi amatir radionya, Onno berhasil mengirimkan data suara yang diubah menjadi teks (melalui *soundcard* komputer) melintasi samudra hingga diterima oleh rekan-rekannya sesama anggota ORARI di Indonesia. Ini adalah salah satu bentuk koneksi internet paling awal di Indonesia, yang membuktikan bahwa jaringan informasi tidak melulu harus bergantung pada kabel telepon yang sangat mahal.\n\n## RT/RW-Net, Wajanbolic, dan Pertempuran Melawan Regulasi\n\nKembali ke Indonesia, Onno mengajar sebagai dosen di ITB dan memelopori koneksi internet pertama di kampus tersebut. Namun, ia menyadari bahwa tarif internet *dial-up* melalui kabel telepon (seperti yang disediakan Telkom saat itu) sangatlah tidak masuk akal bagi rakyat biasa. Biaya pulsa telepon yang menyala 24 jam bisa mencapai jutaan rupiah per bulan dengan kecepatan yang sangat lambat.\n\nUntuk memecahkan masalah ini, Onno menginisiasi teknologi RT/RW-Net, yakni sebuah jaringan komputer swadaya masyarakat yang mendistribusikan koneksi internet murah di tingkat rukun tetangga. Untuk menangkap sinyal nirkabel (Wi-Fi), Onno mempopulerkan penemuan luar biasa yang sangat merakyat: **Wajanbolic**. Ini adalah antena penguat sinyal Wi-Fi frekuensi 2,4 GHz yang dirakit secara murah meriah menggunakan wajan penggorengan, pipa paralon, aluminium foil, dan USB WLAN adapter.\n\n![Onno W. Purbo memperlihatkan Wajanbolic](https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/wajanbolic-onno-w-purbo.png)\n\n*Sumber gambar: Detik.net.id.*\n\nKarya-karya ini adalah bentuk perlawanan Onno terhadap \"buta internet\". Namun, jalan yang ditempuh tidak mulus. Penggunaan frekuensi radio 2,4 GHz pada saat itu dianggap ilegal tanpa izin resmi, sehingga alat-alat jaringan kampus dan masyarakat sering kali disita oleh aparat pemerintah (Kominfo). Alih-alih melawan dengan kekerasan, Onno mengubah strateginya: ia menulis buku dan menyebarkan panduan cara merakit internet murah ke seluruh penjuru negeri. Lewat gerakan \"pemberontakan\" damai dan desakan tanpa henti, pada tahun 2005 pemerintah akhirnya membebaskan frekuensi 2,4 GHz dari Biaya Hak Penggunaan, sebuah kemenangan besar bagi demokratisasi internet di Indonesia.\n\n## Meninggalkan Menara Gading demi Filosofi \"Copyleft\"\n\nSalah satu kisah paling monumental dalam hidup Onno terjadi pada Februari 2000. Saat itu, ITB mengadakan seminar mengenai Hak Cipta dan Hak Paten yang diisi oleh para profesor. Mendengar paparan bahwa hasil penelitian harus dipatenkan demi keuntungan finansial dan prestise, nurani Onno memberontak.\n\nDalam pandangannya, ilmu pengetahuan seharusnya dibagikan secara gratis agar seluruh bangsa bisa merasakan manfaatnya. Mematenkan ilmu hanya akan memperlebar jurang kebodohan di Indonesia. Terusik oleh pemikiran tersebut, Onno tidak bisa tidur selama tiga hari dua malam. Pada hari ketiga, ia mengambil keputusan paling nekat dalam hidupnya: ia menulis surat pengunduran diri sebagai Pegawai Negeri Sipil (PNS) dan dosen ITB. Ia bahkan mengembalikan gaji terakhirnya kepada rektorat.\n\nOnno memilih jalan hidup berdasarkan prinsip **\"Copyleft\"** (sumber terbuka/ *Open Source*), kebalikan dari *Copyright*. Ia meyakini bahwa Tuhan yang memiliki segala ilmu saja tidak pernah mematenkan ilmu-Nya, lalu mengapa manusia harus membatasinya?. Ia sering mengutip pesan dari mantan dosennya di ITB, Pak Soegiardjo Soegidjoko: *\"Kalkulator yang di ATAS tidak pernah salah hitung\"*. Kepercayaan bahwa rezeki tidak akan tertukar inilah yang membuatnya tak gentar hidup tanpa gaji tetap selama belasan tahun usai keluar dari ITB.\n\n## Kiprah Bapak Open Source Indonesia dan Karya-karyanya\n\nSetelah keluar dari jalur akademis formal, kiprah Onno W. Purbo di dunia *Open Source Software* (OSS) dan teknologi informasi semakin menggila. Berikut adalah berbagai sumbangsih nyatanya:\n\n- **Membuat Distro Linux Mandiri**: Onno terlibat dalam pembuatan berbagai distribusi (distro) Linux lokal yang disesuaikan untuk kebutuhan masyarakat, seperti Distro SchoolOnffLine, SMEOnffLine, ORARINux, dan SekolahNux.\n- **Penulis Buku Produktif**: Onno telah menulis lebih dari 50 judul buku. Karyanya mencakup panduan TCP/IP, keamanan jaringan, teknik RT/RW-Net, hingga pembuatan jaringan seluler 5G sendiri. Hebatnya, ia juga merilis buku-buku pelajaran Teknologi Informasi dan Komunikasi (TIK) untuk SMA/MA yang materinya sepenuhnya berbasis *Open Source Software* (seperti Linux dan OpenOffice), yang didistribusikan secara gratis sebagai Buku Sekolah Elektronik (BSE) oleh pemerintah.\n- **VoIP Rakyat & OpenBTS**: Selain internet, Onno juga merintis \"VoIP Rakyat\", sentral telepon gratis berbasis protokol internet (SIP) agar masyarakat bisa bertelepon tanpa biaya pulsa konvensional. Ia juga giat menyebarkan teknologi OpenBTS, sebuah *Base Transceiver Station* mini berbasis *open source* yang memungkinkan masyarakat di daerah terpencil membangun jaringan seluler GSM sendiri.\n- **E-Learning dan Open Course**: Hasrat Onno untuk mencerdaskan orang banyak (bukan hanya satu atau dua kelas) diwujudkan dengan membangun *E-Learning Rakyat*. Di platform ini, puluhan ribu siswa bisa belajar gratis. Saat ini, sebagai Rektor Institut Teknologi Tangerang Selatan (ITTS), ia memelopori sistem kuliah IT gratis yang bisa diakses siapa saja melalui `opencourse.itts.ac.id`, dengan memberikan e-sertifikat bagi mereka yang mendapatkan nilai di atas 90.\n- **Advokasi Keamanan Siber**: Onno kerap menjadi narasumber penting terkait keamanan data. Ia mengedukasi masyarakat dan pemerintah mengenai mitigasi kebocoran data, audit *Data Privacy* sesuai UU PDP, dan pemanfaatan sistem keamanan berbasis *Open Source* yang efisien.\n\n## Pengakuan Dunia: Jonathan B. Postel Service Award\n\nPerjuangan Onno W. Purbo yang konsisten memberdayakan masyarakat melalui internet murah mengundang decak kagum dunia internasional. Ia sering diundang menjadi pembicara kunci dalam forum-forum global, seperti *World Summit on the Information Society* (WSIS) di Swiss dan *Internet Engineering Task Force* (IETF), karena rekam jejak Indonesia yang secara swadaya membangun lebih dari 60.000 titik RT/RW-Net yang digerakkan oleh rakyat biasa.\n\nPuncaknya, pada 11 November 2020, Internet Society (ISOC) memberikan penghargaan prestisius **Jonathan B. Postel Service Award** kepada Onno. Penghargaan yang setara dengan \"Hadiah Nobel\" di dunia internet ini diberikan khusus untuk para inovator visioner yang berdedikasi memperluas akses internet di seluruh dunia. Onno terpilih karena peran kuncinya dalam demokratisasi akses internet dan kepeloporannya memanfaatkan teknologi berbiaya rendah di pedesaan.\n\n## Penutup: Menjadi Manusia yang Bermanfaat\n\nKetika banyak orang mendesak agar dirinya diangkat menjadi Menteri Komunikasi dan Informatika, Onno selalu menjawab dengan halus dan jenaka. Baginya, jabatan menteri yang hanya berumur lima tahun bukanlah sebuah tolok ukur kesuksesan.\n\nTujuan hidup Onno W. Purbo sangatlah sederhana dan filosofis: ia ingin menjadi manusia yang bermanfaat bagi orang lain. Menurut kutipannya yang diambil dari hadist Rasulullah SAWW, *\"Sebaik-baik manusia adalah yang bermanfaat bagi manusia lainnya\"* kutipan itu yang menjadi prinsip bagi Prof Onno. Melalui buku-buku yang digratiskannya, video-video *tutorial* di YouTube, ribuan artikel, dan jaringan-jaringan komunitas *Open Source* yang ia rintis, Onno telah menunaikan tujuannya. Ia membuktikan bahwa kedaulatan digital dan kemajuan sebuah bangsa tidak harus selalu dimotori oleh pemerintah atau konglomerat, melainkan bisa dibangun dari bawahdari tangan-tangan rakyat biasa yang mau belajar dan berbagi.\n\n## Referensi\n\n### Artikel Berita dan Biografi (Web)\n\n- **Biografiku.com**: \"Biografi Onno W Purbo\" - [https://www.biografiku.com/biografi-onno-w-purbo/](https://www.biografiku.com/biografi-onno-w-purbo/).\n- **Wikipedia bahasa Indonesia**: \"Onno W. Purbo\" - [https://id.wikipedia.org/wiki/Onno_W._Purbo](https://id.wikipedia.org/wiki/Onno_W._Purbo).\n- **CNN Indonesia**: \"Onno, Wajan, dan Kisah 'Perang' Melawan Buta Internet RI\" - [https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri](https://www.cnnindonesia.com/teknologi/20221202161533-192-882019/onno-wajan-dan-kisah-perang-melawan-buta-internet-ri).\n- **Liputan6.com**: \"Onno W. Purbo, Pejuang IT Indonesia yang Hobi Bersepeda\" - [http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda](http://www.liputan6.com/tekno/read/667563/onno-w-purbo-pejuang-it-indonesia-yang-hobi-bersepeda).\n- **detikInet**: \"Bangga! Onno W Purbo Dapat Penghargaan Dunia Bidang Internet\" - [https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet](https://inet.detik.com/cyberlife/d-5260444/bangga-onno-w-purbo-dapat-penghargaan-dunia-bidang-internet).\n- **Kumparan**: \"Onno W. Purbo Raih Penghargaan Internet Dunia Jonathan B. Postel Service Award\" - [Tautan Kumparan](https://kumparan.com/kumparantech/response/onno-w-purbo-raih-penghargaan-internet-dunia-jonathan-b-postel-service-award-1uZYLtCUsPq).\n- **OnnoWiki**: \"Onno W. Purbo\" - [http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo](http://www.onnocenter.or.id/wiki/index.php/Onno_W._Purbo).\n- **eLearning Rakyat**: Portal kursus online gratis yang dibangun oleh Onno W. Purbo - [https://lms.onnocenter.or.id/moodle/](https://lms.onnocenter.or.id/moodle/).\n- Dokumen / Buku TIK berbasis *Open Source* yang ditulis Onno W. Purbo, seperti Buku Sekolah Elektronik (BSE) dan pedoman keamanan siber.\n- Video \"ONNO W PURBO dan SEJARAH INTERNET INDONESIA\" & \"Sisi Lain ONNO W PURBO: Jadi Rektor ITTS!\" di kanal **GIZMOLOGI**.\n- Video \"Bincang Bareng Onno W. Purbo Seputar Dunia IT di Indonesia\" di kanal **Indonesia Belajar**.\n- Video \"Onno W Purbo Tadinya Berpikir Ikuti Jejak BJ Habibie\" di kanal **voidotid**.", "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/onno-w-purbo-bapak-open-source-dan-sang-pembebas-internet-indonesia.md", "releasedAt": "2026-07-22", - "lastModifiedAt": "2026-07-22T05:11:57Z", - "latestCommitSha": "e04f7a783874ae590f5ef40fc643f099a8fd5242", - "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/e04f7a783874ae590f5ef40fc643f099a8fd5242", + "lastModifiedAt": "2026-07-22T05:16:27Z", + "latestCommitSha": "d24f6984362f60398eb45955c238fbf6264cd353", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/d24f6984362f60398eb45955c238fbf6264cd353", "author": { "name": "wauputr4", "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", From 458c7a97dbb75f17dbccbb7468742605e979f55f Mon Sep 17 00:00:00 2001 From: wauputr4 <103489788+wauputr4@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:19:43 +0700 Subject: [PATCH 14/25] Use commas in Indonesian copy --- src/components/SiteFooter.astro | 2 +- src/pages/events.astro | 2 +- src/pages/falsafah.astro | 4 ++-- src/pages/kode-etik.astro | 2 +- src/pages/komunitas.astro | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro index 5b14a7c..0a81ce9 100644 --- a/src/components/SiteFooter.astro +++ b/src/components/SiteFooter.astro @@ -46,7 +46,7 @@ const year = new Date().getFullYear(); IndopenSource

- Ruang kerja terbuka untuk ekosistem open source Indonesia โ€” dibikin + Ruang kerja terbuka untuk ekosistem open source Indonesia, dibikin bareng, dirawat bareng.

diff --git a/src/pages/events.astro b/src/pages/events.astro index b71ef2e..51dacc4 100644 --- a/src/pages/events.astro +++ b/src/pages/events.astro @@ -11,6 +11,6 @@ const formats = [ --- -

Halaman ini menampung format kegiatan yang ingin kami jalankan. Saat ada agenda, ia akan dicatat terbuka di sini dan di ruang diskusi.

+

Halaman ini menampung format kegiatan yang ingin kami jalankan. Saat ada agenda, ia akan dicatat terbuka di sini dan di ruang diskusi.

00
Kalender terbuka

Belum ada agenda yang diumumkan.

Saat kegiatan tersedia, detail waktu, format, dan catatan pasca-acara akan dicatat di halaman ini agar mudah diikuti ulang.

Format awal
{formats.map(([title, body]) =>

{title}

{body}

)}
Usulkan kegiatan
diff --git a/src/pages/falsafah.astro b/src/pages/falsafah.astro index 7f69b0b..80e2a9d 100644 --- a/src/pages/falsafah.astro +++ b/src/pages/falsafah.astro @@ -64,7 +64,7 @@ const references = [ // gotong royong, bukan kerja sendiri

- Teknologi tumbuh kalau dirawat bersama โ€” + Teknologi tumbuh kalau dirawat bersama, dibuka, dibaca, dipakai ulang, dan diwariskan.

โ€” IndopenSource ยท komunitas terbuka Indonesia

@@ -149,7 +149,7 @@ const references = [

- Kalau bisa dipelajari, dipakai ulang, dan dirawat bersama โ€” itu sudah + Kalau bisa dipelajari, dipakai ulang, dan dirawat bersama, itu sudah open source.

diff --git a/src/pages/kode-etik.astro b/src/pages/kode-etik.astro index 49b8483..0e8da2a 100644 --- a/src/pages/kode-etik.astro +++ b/src/pages/kode-etik.astro @@ -24,7 +24,7 @@ const unacceptable = [ -

IndopenSource berkomitmen menyediakan lingkungan yang ramah, aman, dan inklusif bagi semua orang. Kode ini berlaku untuk semua ruang komunitas โ€” GitHub, Discussions, event, dan interaksi lainnya.

+

IndopenSource berkomitmen menyediakan lingkungan yang ramah, aman, dan inklusif bagi semua orang. Kode ini berlaku untuk semua ruang komunitas, GitHub, Discussions, event, dan interaksi lainnya.

diff --git a/src/pages/komunitas.astro b/src/pages/komunitas.astro index b7fbb38..0fccc1c 100644 --- a/src/pages/komunitas.astro +++ b/src/pages/komunitas.astro @@ -30,7 +30,7 @@ const communities = communitiesData as Community[];
Segera hadir

Belum ada komunitas yang ditampilkan.

-

Kami sengaja memulai dari daftar kosong agar setiap entri punya sumber, tautan aktif, dan diajukan secara terbukaโ€”bukan hasil asumsi.

+

Kami sengaja memulai dari daftar kosong agar setiap entri punya sumber, tautan aktif, dan diajukan secara terbuka, bukan hasil asumsi.

) : (
From 2b388c7db2e35f7f8e9104be81e0b18bb4f1b313 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 06:45:56 +0000 Subject: [PATCH 15/25] Sync content data --- src/data/projects.json | 128 ++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 0d80b10..71f6703 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 352, + "openIssues": 353, "openPullRequests": 7, "subscribers": 110, "communityHealth": 50, @@ -157,7 +157,7 @@ "homepage": "", "language": "Python", "stars": 898, - "forks": 279, + "forks": 278, "topics": [], "updatedAt": "2026-07-21T07:50:22Z", "pushedAt": "2026-07-18T02:05:39Z", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T01:05:48Z", - "pushedAt": "2026-07-22T01:05:43Z", + "updatedAt": "2026-07-22T04:34:20Z", + "pushedAt": "2026-07-22T04:34:17Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,11 +324,11 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 15, + "openIssues": 13, "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, - "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent. Stop paying Claude to read 10,000 lines of terminal noise like a headphone for AI agent\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n
    \n
  • Pipeline Latency: < 10ms overhead.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" + "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n
    \n
  • Pipeline Latency: < 10ms overhead.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" }, { "fullName": "hadziqmtqn/erd-builder-pro", @@ -353,7 +353,7 @@ "tiptap-editor" ], "updatedAt": "2026-07-22T00:42:07Z", - "pushedAt": "2026-07-22T02:15:46Z", + "pushedAt": "2026-07-22T06:29:38Z", "latestRelease": { "name": "v3.1.5", "tagName": "v3.1.5", @@ -397,7 +397,7 @@ "workspace-manager" ], "updatedAt": "2026-07-20T13:04:18Z", - "pushedAt": "2026-07-20T02:15:44Z", + "pushedAt": "2026-07-22T06:15:35Z", "latestRelease": { "name": "Termul Manager v0.4.8", "tagName": "v0.4.8", @@ -408,7 +408,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-01-13T04:36:02Z", "openIssues": 39, - "openPullRequests": 12, + "openPullRequests": 13, "subscribers": 0, "communityHealth": 71, "readmeHtml": "

๐Ÿ–ฅ๏ธ Termul Manager

\n

A modern, project-aware terminal manager built with Tauri

\n

Termul treats workspaces as first-class citizens, allowing you to organize terminals by project with persistent sessions, snapshots, and a clean tabbed interface.

\n

\"GitHub\n\"GitHub\n\"License\"\n\"Latest

\n

\"Platform\"\n\"Tauri\"\n\"React\"\n\"TypeScript\"

\n

Getting Started ยท Features ยท Documentation ยท Contributing ยท Report Bug ยท Request Feature

\n

\n

โœจ Features

\n

๐ŸชŸ Workspace & Terminal Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Project-Based WorkspacesOrganize terminals by project with dedicated workspace directories, separate state, and per-project configuration
Pane-Based Split LayoutSplit your workspace into resizable panes and arrange terminals, editors, and browser tabs side by side
Tabbed InterfaceWindows Terminal-style tab bar with drag-and-drop reordering, rename, and context menu
Multiple Shell SupportAuto-detects PowerShell, CMD, Git Bash, WSL, fish, zsh, and more; switch shells per tab
\n

๐Ÿ“ Editor & File Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Code EditorBuilt-in code editor with syntax highlighting, file buffers, dirty-state tracking, and save/reload
Markdown EditorRich markdown editing powered by BlockNote with live preview, table of contents, and heading navigation
Mermaid DiagramsRender Mermaid diagrams inline within your markdown documents
File ExplorerFull file tree with create, rename, delete, clipboard operations, drag-and-drop, and context menus
File WatchingLive file watching for real-time updates as files change on disk
\n

๐ŸŒ Browser & Annotation

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Embedded Browser TabsBrowse the web directly inside your workspace using child webview tabs โ€” no app switching
Annotation WorkflowCapture browser states, annotate with severity and intent labels, review, and export
Annotation ExportPackage annotations with metadata into structured export formats
\n

โšก Power User Tools

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Command PaletteGlobal command launcher (Ctrl+K / Ctrl+Shift+P) for project switching, workspace actions, and more
Command HistoryPer-project and aggregate command history viewer with search
Keyboard ShortcutsFully customizable shortcut bindings for every action
Git IntegrationStatus bar shows current branch, working directory, git status, and exit code
Custom Title BarDesktop-native title bar with window controls, sidebar toggles, and settings navigation
\n

๐Ÿ”ง System & Reliability

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Auto-UpdaterBuilt-in update infrastructure with signed artifacts โ€” get notified and update without leaving the app
State ManagementZustand-powered reactive stores for projects, terminals, workspace layout, editor buffers, browser sessions, and settings
Configurable SettingsTerminal and UI preferences, color picker, theme customization, and shell configuration
Cross-PlatformWorks on Windows, macOS, and Linux with native platform packaging
Error BoundariesGraceful error handling with runtime error boundaries and user-friendly fallback UI
\n\n๐Ÿ—บ๏ธ Feature Map โ€” Component Overview\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DomainKey ComponentsZustand Store
WorkspaceWorkspaceLayout, PaneRenderer, PaneContent, WorkspaceTabBarworkspace-store
TerminalConnectedTerminal, XTerminal, TerminalSearchBar, ActivityIndicatorterminal-store
EditorEditorPanel, CodeEditor, MarkdownEditor, EditorToolbar, MermaidBlockeditor-store
BrowserBrowserPanel, BrowserControls, AnnotationPanel, AnnotationExportModalbrowser-session-store, annotation-store
File ExplorerFileExplorer, FileTreeNode, FileTreeContextMenuโ€”
SnapshotsCreateSnapshotModal, RestoreSnapshotModal, DeleteSnapshotModalsnapshot-store
ProjectsProjectSidebar, NewProjectModalproject-store
SettingsShortcutRecorder, ColorPickerPopover, ContextBarSettingsPopoverapp-settings-store, context-bar-settings-store
UpdatesUpdateAvailableToast, UpdateReadyModalupdater-store
SharedCommandPalette, ContextMenu, ConfirmDialog, ShellSelector, ErrorBoundaryโ€”
\n

๐Ÿ“ธ Screenshots

\n

\"Termul

\n

๐Ÿ“ฆ Install

\n

Homebrew (macOS)

\n
brew tap gnoviawan/termul\nbrew install --cask termul\n
\n

curl (macOS/Linux)

\n
curl -fsSL https://raw.githubusercontent.com/gnoviawan/termul/main/scripts/install.sh | bash\n
\n

Windows users should install the .exe or .msi from GitHub Releases. Manual DMG downloads in a browser may still hit Gatekeeper, so macOS users should prefer Homebrew or curl.

\n

๐Ÿš€ Getting Started

\n

Prerequisites

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DependencyVersionNotes
Bun1.3+JavaScript runtime and package manager
RustLatest stableRequired for Tauri builds
\n

Platform-Specific Requirements

\n\nWindows
    \n
  • Microsoft Visual C++ Build Tools (included in Visual Studio 2022)
  • \n
  • WebView2 Runtime (pre-installed on Windows 10+)
  • \n
\n\nmacOS
xcode-select --install\n
\n\nLinux (Debian/Ubuntu)
sudo apt update\nsudo apt install libwebkit2gtk-4.1-dev \\\n    build-essential curl wget file \\\n    libxdo-dev libssl-dev \\\n    libayatana-appindicator3-dev \\\n    librsvg2-dev patchelf\n
\n\nLinux (Fedora)
sudo dnf install webkit2gtk4.1-devel \\\n    gcc gcc-c++ libopenssl-devel \\\n    appindicator-devel librsvg2-devel \\\n    patchelf\n
\n

Install Rust Toolchain

\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nrustc --version && cargo --version\n
\n

Quick Start

\n
# Clone the repository\ngit clone https://github.com/gnoviawan/termul.git\ncd termul\n\n# Install dependencies\nbun install\n\n# Launch in development mode\nbun run dev\n
\n

Landing Page

\n

This repository also includes a standalone Vite landing page under landing/.

\n
# Install landing page dependencies (from landing/)\ncd landing && bun install\n\n# Start the landing page dev server\nbun run landing:dev\n\n# Lint the landing page\nbun run landing:lint\n\n# Build the landing page for production\nbun run landing:build\n
\n

Building for Production

\n
# Build for your current platform\nbun run build\n\n# Platform-specific builds\nbun run build:tauri:win        # Windows (x64)\nbun run build:tauri:mac-arm    # macOS (Apple Silicon)\nbun run build:tauri:mac-x64    # macOS (Intel)\nbun run build:tauri:linux      # Linux (x64)\n\n# Debug build (faster compilation, larger binary)\nbun run build:tauri:debug\n
\n

Build output: src-tauri/target/release/bundle/

\n

๐Ÿ“– Documentation

\n

Usage

\n

Creating a Project

\n
    \n
  1. Click the + button in the sidebar to create a new project
  2. \n
  3. Select a workspace directory
  4. \n
  5. Configure your default shell (optional)
  6. \n
\n

Terminal Tabs

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionHow
New terminalClick + next to tabs
Select specific shellClick the dropdown arrow
Reorder tabsDrag and drop
Rename tabDouble-click the tab
Context menuRight-click (rename, close, kill process)
\n

Keyboard Shortcuts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionDefault Shortcut
New TerminalCtrl+T
Next TabCtrl+PageDown
Previous TabCtrl+PageUp
Command PaletteCtrl+K / Ctrl+Shift+P
\n
\n

Shortcuts are customizable in Settings. On Tauri/WebView2, browser-reserved shortcuts such as Ctrl+Tab are not used as defaults because they are not reliably interceptable.

\n
\n

Architecture

\n

Tech Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerTechnology
Desktop RuntimeTauri 2.0
BackendRust
UI FrameworkReact 18
Type SystemTypeScript
Build ToolVite
StylingTailwind CSS + shadcn/ui
State ManagementZustand
Terminal Emulationtauri-pty + xterm.js
AnimationsFramer Motion
\n

Tauri Plugins

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PluginPurpose
@tauri-apps/plugin-fsFilesystem access
@tauri-apps/plugin-storeConfiguration persistence
@tauri-apps/plugin-osOS information
@tauri-apps/plugin-dialogNative dialogs
@tauri-apps/plugin-clipboard-managerClipboard operations
@tauri-apps/plugin-updaterAutomatic updates
@tauri-apps/plugin-processProcess management
\n

Project Structure

\n
src/\nโ”œโ”€โ”€ renderer/           # React frontend\nโ”‚   โ”œโ”€โ”€ components/     # UI components\nโ”‚   โ”œโ”€โ”€ hooks/          # Custom React hooks\nโ”‚   โ”œโ”€โ”€ lib/            # Runtime adapters & desktop integration\nโ”‚   โ”œโ”€โ”€ pages/          # Page components\nโ”‚   โ””โ”€โ”€ stores/         # Zustand stores\nโ”œโ”€โ”€ shared/             # Shared types (main/renderer)\nsrc-tauri/              # Rust backend, config & bundling\ndocs/electron-old/      # Archived Electron docs & migration history\n
\n

Platform Adapters

\n

The renderer uses an adapter/service layer to keep desktop integrations isolated from UI code:

\n
src/renderer/lib/\nโ”œโ”€โ”€ tauri-*.ts        # Tauri-native integrations\nโ”œโ”€โ”€ *.ts              # Runtime-safe facades & helpers\nโ””โ”€โ”€ __tests__/        # Regression & parity coverage\n
\n

๐Ÿ› ๏ธ Development

\n
bun run dev              # Development mode with hot reload\nbun run test             # Run tests\nbun run test:watch       # Tests in watch mode\nbun run typecheck        # Type checking\nbun run lint             # Linting\nbun run tauri <command>  # Direct Tauri CLI access\n
\n

SSH Development Notes

\n
    \n
  • SSH passwords and key passphrases are stored through the OS keychain, not in ssh-profiles.json.
  • \n
  • Active SSH sessions may retain the relevant secret in process memory only to support automatic reconnect; use SSH agent authentication to avoid runtime secret retention.
  • \n
  • Interactive SSH terminals use OpenSSH's default known-hosts file with StrictHostKeyChecking=accept-new; do not override UserKnownHostsFile to /dev/null/NUL because that disables persistent host-key verification.
  • \n
  • Local port forwarding uses ssh2 channel_direct_tcpip over the active SSH session; remote/reverse forwarding is not supported by the MVP command path yet.
  • \n
  • ssh2 intentionally stays on system OpenSSL for now. Enabling vendored-openssl forces a local OpenSSL source build that can fail in Windows/MSYS environments without a complete Perl module setup.
  • \n
\n

โญ Star History

\n

\"Star

\n

๐Ÿค Contributing

\n

Contributions are welcome! Please read the Contributing Guide for details on our code of conduct and the process for submitting pull requests.

\n

๐Ÿ“„ License

\n

This project is licensed under the MIT License โ€” see the LICENSE file for details.

\n

๐Ÿ™ Acknowledgments

\n\n
\n

Built with โค๏ธ by gnoviawan

\n
\n" @@ -423,10 +423,10 @@ "url": "https://github.com/mallexibra-dev/clipforge", "homepage": "", "language": "Python", - "stars": 153, + "stars": 154, "forks": 36, "topics": [], - "updatedAt": "2026-07-19T20:26:42Z", + "updatedAt": "2026-07-22T06:40:34Z", "pushedAt": "2026-06-26T05:38:51Z", "latestRelease": null, "archived": false, @@ -501,7 +501,7 @@ "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", - "openIssues": 2, + "openIssues": 3, "openPullRequests": 6, "subscribers": 0, "communityHealth": 75, @@ -816,7 +816,7 @@ "homepage": "https://bansos.dev", "language": "Svelte", "stars": 50, - "forks": 7, + "forks": 8, "topics": [ "bansos", "cli", @@ -829,8 +829,8 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-07-21T06:53:31Z", - "pushedAt": "2026-07-21T06:52:25Z", + "updatedAt": "2026-07-22T04:44:08Z", + "pushedAt": "2026-07-22T04:44:01Z", "latestRelease": { "name": "Bansos v0.0.13", "tagName": "v0.0.13", @@ -1141,42 +1141,6 @@ "communityHealth": 57, "readmeHtml": "
\n \"Diskus\n

Diskus

\n

A lightweight, self-hosted comments system built for modern web applications.

\n

\"License:\n\"Bun\"\n\"Preact\"

\n

Diskus is designed to be a fast, privacy-respecting alternative to Disqus and other bloated third-party commenting services.

\n

\"Live\n\"Documentation\"

\n

Screenshots

\n
\n \"Diskus\n

Diskus Centralized Admin Dashboard


\"Diskus\n

Diskus Lightweight Widget

\n

Features

\n
    \n
  • Ultra-lightweight Widget: The entire widget is bundled into a single lightweight script (embed.js), with a total footprint of ~28KB (gzipped), ensuring zero impact on your Core Web Vitals.
  • \n
  • 100% CSS Isolation: Runs within a native Shadow DOM, ensuring your website's CSS never conflicts with the widget's design and vice-versa, without the heavy performance overhead of traditional iframes.
  • \n
  • Multi-tenant Architecture: Manage comments across multiple domains and websites from a single centralized dashboard.
  • \n
  • Built-in Anti-Spam: Native rate-limiting and invisible honeypot traps to prevent automated bot registrations without requiring intrusive CAPTCHAs.
  • \n
  • Social Login: Seamless Google OAuth integration allowing commenters to sign in quickly and securely without managing additional passwords.
  • \n
  • Server-side Sanitization: Strict HTML sanitization (isomorphic-dompurify) and Markdown parsing are offloaded to the server to maintain a minimal client bundle.
  • \n
  • Data Portability: Full JSON-based import and export capabilities for threads and comments.
  • \n
  • Email Notifications: Configurable email alerts for new comments powered by standard SMTP integration.
  • \n
  • Modern Stack: Built on Bun, Hono, Preact, and Drizzle ORM for maximum performance and type safety.
  • \n
\n

Architecture

\n

Diskus operates as a monorepo containing three core packages:

\n
    \n
  1. Backend (/backend): A REST API built with Hono and running on Bun. Uses SQLite via Drizzle ORM for data persistence.
  2. \n
  3. Dashboard (/dashboard): A Preact-based Single Page Application (SPA) for administrators to manage sites, moderate comments, and view users.
  4. \n
  5. Widget (/widget): A highly optimized Preact component. The lightweight embed script (embed.js) dynamically injects the widget using a native Shadow DOM, guaranteeing 100% CSS isolation and zero style bleeding with the host website, while maintaining a featherlight ~28KB (gzipped) footprint containing full Tailwind CSS v4 logic.
  6. \n
\n

Quick Start

\n

Prerequisites

\n
    \n
  • Bun (v1.0.0 or higher)
  • \n
  • Node.js (v18+ recommended for some tooling)
  • \n
\n

Installation

\n
    \n
  1. Clone the repository:

    \n
    git clone https://github.com/fadhilbarkah/diskus.git\ncd diskus\n
    \n
  2. \n
  3. Install dependencies:

    \n
    bun install\n
    \n
  4. \n
  5. Setup environment variables:\nCopy .env.example to .env in all three workspace directories (backend, dashboard, widget).

    \n
      \n
    • Backend (/backend): Configure the required JWT_SECRET. You can also configure DASHBOARD_ORIGIN (for CORS restrictions) and DATABASE_PATH (custom SQLite path).
    • \n
    • Dashboard & Widget: Configure VITE_API_URL to point to your backend API URL.
    • \n
    \n
  6. \n
  7. Initialize the database schema and optionally seed initial data:

    \n
    cd backend\nbun run db:push\n# Optional: populate the database with test data and a default admin account\nbun run src/db/seed.ts\n
    \n
  8. \n
  9. Start the development server (runs backend, dashboard, and widget concurrently):

    \n
    # From the project root\nbun dev\n
    \n
  10. \n
\n
\n

Note: When you open the Dashboard (http://localhost:5173) for the first time, you will be automatically prompted to create your initial Admin account. No manual seeding is required!

\n
\n

๐Ÿš€ One-Click Deploy to Railway

\n

\"Deploy

\n

Click the button above to instantly deploy both the Backend API and the Dashboard Frontend. All environment variables, volumes, and start commands are pre-configured in this official template.

\n

Production Deployment (Docker)

\n

Diskus is fully containerized for easy production deployment using Docker Compose. We provide a one-click startup script that automatically handles secure secret generation.

\n
    \n
  1. Build and start the services:

    \n
    # Run the start script\n./start.sh\n
    \n
    \n

    Note: The script will automatically generate a secure .env file with a strong JWT_SECRET if one does not exist, and then run docker-compose up -d --build.

    \n
    \n
  2. \n
  3. The services will be available at:

    \n
      \n
    • Frontend (Dashboard & Widget Embed): http://localhost:5173 (or your domain)
    • \n
    • Backend API: http://localhost:3000
    • \n
    \n
  4. \n
\n
\n

Note: The database uses a Docker Volume (diskus-data), so your comments will persist even if you restart the containers.

\n
\n

Initial Setup in Production

\n

Instead of manually seeding the database, simply open your frontend domain in the browser. You will be greeted with a \"Create Admin Account\" screen. Register your account immediately to secure your deployment, as the setup screen will permanently disappear once the first admin is created.

\n

Resetting the Production Database

\n

If you ever need to completely wipe your production database (e.g., to resolve severe migration conflicts or start fresh), you must destroy the Docker Named Volume. WARNING: This will permanently delete all comments and user data.

\n
# Bring down containers and DESTROY the database volume (-v)\ndocker-compose down -v\n\n# Restart the services (a fresh database will be created)\n./start.sh\n
\n

Usage

\n

1. Register a Website

\n

Open the Dashboard (http://localhost:5173), navigate to Websites, and register a new domain. You will receive an App ID.

\n

2. Embed the Widget

\n

Paste the following HTML snippet into your target website, replacing the data attributes with your specific keys:

\n
<!-- Diskus Embed -->\n<div id=\"diskus-thread\" \n     data-app-id=\"YOUR_APP_ID\" \n     data-thread-key=\"your-unique-page-identifier\"\n     data-api-url=\"http://localhost:3000/api/v1\">\n</div>\n<script src=\"http://localhost:5173/widget/dist/embed.js\" async defer></script>\n
\n
\n

Note: The data-thread-key should be unique per page (e.g., the article slug or ID) so that comments remain tied to their specific content.

\n
\n

Security & Moderation

\n
    \n
  • Role-based Access Control (RBAC): Distinct roles for Administrators and Commenters.
  • \n
  • Honeypot Traps: The widget form includes an invisible field to catch spam bots automatically.
  • \n
  • Moderation Tools: Administrators can approve, delete, or mark comments as spam directly from the dashboard.
  • \n
\n

Admin Troubleshooting

\n

Resetting Admin Password (CLI)

\n

If you are locked out of the dashboard, you can reset your password securely via the command line. This requires direct access to your server terminal or Railway console.

\n
    \n
  1. Navigate to the backend directory (if not already there).
  2. \n
  3. Run the reset-password script with your email address:
    bun run reset-password admin@example.com\n
    \n
  4. \n
  5. Follow the on-screen prompt to confirm. The system will generate a secure temporary password and print it to the terminal. Please log in immediately and change this temporary password.
  6. \n
\n

Contributing

\n

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

\n

Please make sure to update tests as appropriate.

\n

License

\n

GPL-3.0

\n" }, - { - "fullName": "ardli-firman/sha-print", - "name": "sha-print", - "owner": "ardli-firman", - "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/48121202?v=4", - "description": "The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows", - "metaDescription": "The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows", - "url": "https://github.com/ardli-firman/sha-print", - "homepage": "", - "language": "C#", - "stars": 34, - "forks": 13, - "topics": [ - "desktop-app", - "printer", - "sharing", - "sharing-printer", - "windows" - ], - "updatedAt": "2026-07-18T03:45:52Z", - "pushedAt": "2026-07-18T03:40:27Z", - "latestRelease": { - "name": "ShaPrint v1.6.0 (Stable)", - "tagName": "v1.6.0-stable", - "url": "https://github.com/ardli-firman/sha-print/releases/tag/v1.6.0-stable", - "publishedAt": "2026-07-13T04:40:11Z" - }, - "archived": true, - "licenseSpdx": "", - "createdAt": "2026-05-23T05:37:35Z", - "openIssues": 0, - "openPullRequests": 0, - "subscribers": 0, - "communityHealth": 28, - "readmeHtml": "

๏ปฟ> This repository is frozen at v2.0.0-community (LTS).

\n
\n

No further releases will be tagged. Self-compiling this source still\nproduces a working Community binary under GPL v3.\nThe Premium edition (Web Print Premium, Email-to-Print, Driver\nAuto-Install) is distributed separately as an official signed binary.\nSee docs/RELEASE.md for the full release strategy.

\n
\n
\n \"ShaPrint\n

ShaPrint

\n

The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows

\n

\n

ShaPrint is an advanced, .NET 8-based application designed to reliably share physical printers across local networks (LAN) and cross-subnet/VLAN environments. It serves as a robust alternative when native Windows SMB Printer Sharing fails, struggles with network credential conflicts, or is obstructed by strict Windows security policies.

\n

By utilizing a Virtual Printer Port (Named Pipes) architecture and direct TCP/UDP transmission, ShaPrint guarantees that documents are printed with 100% fidelity and native quality.

\n
\n

โœจ Key Features

\n
    \n
  • ๐ŸŽญ Unified Application: One executable handles everything. Operate as a Server (hosting the physical printer) or a Client (routing the documents) from a single unified interface.
  • \n
  • ๐Ÿ’Ž Native Driver Quality: Unlike traditional workarounds that degrade quality to Generic/Text or PDF rasterization, ShaPrint leverages the official printer driver (e.g., Epson, HP, Canon) on the Client side. Margins, colors, and layouts are preserved perfectly.
  • \n
  • ๐ŸŒ Cross-VLAN Support: Use the Specific Server IP feature to bypass router boundaries, allowing Clients to connect to Servers located in entirely different subnets or VLANs.
  • \n
  • ๐Ÿ”„ IP Change Auto-Detection: Automatically detects when the server IP changes (e.g., DHCP reallocation, network migration) using a stable, unique server identity. It dynamically updates client configurations and restarts active pipe listeners without user intervention or print interruption.
  • \n
  • ๐Ÿ”’ Enterprise-Grade Security: Network communication is secured via a shared Network Channel password. All discovery payloads are verified using HMAC signatures, ensuring only authorized clients can discover or print to your server.
  • \n
  • โšก Seamless Auto-Updater: ShaPrint includes a built-in background updater. It checks for new releases on GitHub and updates itself seamlessly without interrupting active print jobs.
  • \n
  • ๐Ÿ‘ป Stealth Background Service: Minimize the app to the System Tray to handle print jobs silently. ShaPrint integrates directly with the Windows Task Scheduler to automatically start at boot with the highest privileges, entirely bypassing annoying UAC prompts.
  • \n
  • ๐Ÿ”” Real-Time Notifications: Receive native Windows Toast notifications for print job completions, printer errors, client connections/disconnections, and scan results. Works reliably even when the application is minimized to the system tray or running as a background startup service. Clicking a toast instantly restores the application window.
  • \n
  • ๐Ÿ“Š Server Monitoring Mode: Consolidated dashboard to monitor all active servers on the local network. View real-time server information, network channel, software version, uptime, exposed printer queues, scanner availability, active client connections, recent job histories, and printer/scanner error notifications.
  • \n
\n
\n

๐Ÿ“ธ Screenshots

\n
\n\n \n \n \n \n \n \n \n \n \n \n
Switch Mode
Server Mode
Client Mode
Monitoring
Settings
Update Manager
\n

๐Ÿ— System Architecture

\n
    \n
  1. Server Mode\nRunning on the computer directly connected to the physical printer via USB or LAN, the Server scans for local printers and listens for raw print spool data on TCP Port 9877. It also broadcasts its presence using UDP Port 9876 for auto-discovery.

    \n
  2. \n
  3. Client Mode\nThe application intercepts print jobs by creating a Virtual Printer Port within the Windows Spooler. Any document printed from standard applications (Word, Chrome, Acrobat) to this virtual printer is instantly intercepted and streamed directly to the Server.

    \n
  4. \n
  5. Monitoring Mode\nOperators or users can monitor all active ShaPrint servers across the network channel. It discovers active servers via UDP and queries their status on TCP Port 9878 to retrieve real-time encrypted details.

    \n
  6. \n
\n
\n

๐Ÿ’ป System Requirements

\n

Before installing ShaPrint, please ensure your system meets the following requirements:

\n
    \n
  • Operating System: Windows 10 or Windows 11 (64-bit / x64 architecture)
  • \n
  • Minimum Version/Build: Windows 10 Version 1809 (Build 10.0.17763) or newer (released November 2018)
  • \n
  • Pre-requisites: None. The installation is fully self-contained, meaning you do not need to install the .NET Runtime manually.
  • \n
\n
\n

๐Ÿ”’ Security & Safety

\n

ShaPrint implements defense-in-depth security to protect your local network, computer performance, and hardware.

\n

Encryption & Authentication

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerMechanismDescription
TCP Data (Print/Scan/Monitor)AES-256-GCMAll TCP payloads (print jobs, scan data, monitoring status) are encrypted with AES-256 in Galois/Counter Mode โ€” providing both confidentiality and tamper detection. Each encryption uses a fresh random 96-bit nonce.
UDP DiscoveryHMAC-SHA256Discovery responses are signed with HMAC-SHA256. Clients verify the signature before trusting any server response, preventing spoofing and man-in-the-middle attacks.
Key DerivationPBKDF2 (100k iterations)All cryptographic keys are derived from the Network Channel shared secret using PBKDF2 with 100,000 iterations and unique salts per purpose (AES, HMAC, local config).
Config IntegrityHMAC-wrapped JSONServer configuration files are stored with an embedded HMAC to detect tampering. Corrupted or modified configs are rejected on load.
\n

Network Protection

\n
    \n
  • Rate Limiting: Discovery server limits requests to 5 per second per IP address. Stale rate-limit entries are periodically pruned to prevent memory leaks.
  • \n
  • Payload Size Limits: Every network payload has a strict maximum size โ€” discovery responses (8 KB), monitor requests (4 KB), print jobs (100 MB). Excessively large payloads are rejected immediately.
  • \n
  • Input Sanitization: All strings received from the network (printer names, server names, driver names) are validated against a strict whitelist regex. Shell metacharacters (' \" ; $ \\ | & < > \\n \\r \\t \\0`) are explicitly blocked.
  • \n
  • Concurrency Throttling: Maximum 10 concurrent print jobs to prevent resource exhaustion.
  • \n
  • Firewall Integration: On server start, Windows Firewall rules for ports 9876/UDP, 9877/TCP, and 9878/TCP are automatically configured (with user consent via UAC prompt). Rules are persistent โ€” only needed once.
  • \n
  • Connection Timeout: Monitoring TCP queries time out after 5 seconds, preventing hung connections from accumulating.
  • \n
\n

Performance & Stability

\n
    \n
  • Lightweight Polling: Monitor mode polls servers every 15 seconds with requests staggered 1 second apart to avoid network/CPU spikes.
  • \n
  • Unicast Sweep Control: Bulk IP sweep (up to 1024 addresses) runs only on first startup and manual refresh. Routine polling uses broadcast discovery only (skipUnicastSweep=true).
  • \n
  • In-Memory Logging: Server logs are stored in memory (max 200 entries) โ€” no continuous disk I/O.
  • \n
  • Automatic Job Recovery: PrintMonitorService automatically detects and cancels stuck/error print jobs, preventing spooler congestion.
  • \n
\n

Hardware Safety

\n

ShaPrint interacts with hardware exclusively through standard Windows APIs:

\n
    \n
  • Printing: Windows Print Spooler API (AddJob / spool file injection)
  • \n
  • Scanning: Windows Image Acquisition (WIA) 2.0
  • \n
  • Result: The application cannot cause physical damage to printers, scanners, or computer components. All risks are identical to printing or scanning from any standard Windows application.
  • \n
\n

Safety Assessment Summary

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ConcernVerdictNotes
Local network security๐ŸŸข Safe (with configuration)AES-256-GCM + HMAC-SHA256 provide strong protection. Must customize Network Channel from default for multi-tenant environments.
Computer performance๐ŸŸข SafeCPU/RAM impact is negligible for monitoring. Print/scan load is temporary and on-demand.
Hardware damage๐ŸŸข SafeSoftware-only โ€” uses only standard Windows APIs (Spooler, WIA). No risk of physical damage.
\n

โš ๏ธ Critical Recommendations

\n
    \n
  1. ๐Ÿ”ด Customize Your Network Channel

    \n
      \n
    • Go to Settings โ†’ Network Channel
    • \n
    • Change from the default \"DefaultChannel\" to a unique, random string known only to your devices
    • \n
    • Share the same value with all clients on your network
    • \n
    • This regenerates ALL encryption keys โ€” without this, any ShaPrint instance on the same network can decrypt your traffic
    • \n
    \n
  2. \n
  3. Coordinate with IT

    \n
      \n
    • Inform your network administrator about these ports:
        \n
      • UDP 9876 โ€” Service discovery
      • \n
      • TCP 9877 โ€” Print/scan data transfer
      • \n
      • TCP 9878 โ€” Server monitoring status
      • \n
      \n
    • \n
    • Ask them to restrict access to these ports to your subnet/VLAN only
    • \n
    \n
  4. \n
  5. Use Only on Trusted Networks

    \n
      \n
    • ShaPrint is designed for local LAN / VPN environments
    • \n
    • Do not expose ports to the public internet or untrusted WiFi networks
    • \n
    \n
  6. \n
\n
\n

๐Ÿš€ Installation

\n

ShaPrint is packaged as a fully self-contained Standalone Setup. You do not need to install the .NET Runtime manually.

\n
    \n
  1. Download the latest ShaPrint_Setup_vX.Y.Z.exe from the GitHub Releases page.
  2. \n
  3. Run the installer and follow the prompts.
  4. \n
  5. The application will automatically place shortcuts on your Desktop and Start Menu.
  6. \n
\n
\n

๐Ÿ“– How to Use

\n
\n

[!IMPORTANT]
Native Driver Requirement: To guarantee print fidelity, you must install the official printer driver on the Client PC. For example, if the Server is hosting an Epson L3210, you must install the Epson L3210 driver on the Client PC beforehand.

\n
\n

1. On the Server PC (Hosting the Printer)

\n
    \n
  1. Open ShaPrint from your Desktop.
  2. \n
  3. Ensure you and your clients agree on a Network Channel password in the Settings.
  4. \n
  5. Select the Server tab.
  6. \n
  7. Check the boxes next to the physical printers you wish to expose to the network.
  8. \n
  9. Click Start Server.
  10. \n
  11. You may now close the window; the application will silently minimize to the System Tray.
  12. \n
\n

2. On the Client PC (Sending Print Jobs)

\n
    \n
  1. Open ShaPrint.
  2. \n
  3. Ensure your Network Channel password matches the Server's exactly.
  4. \n
  5. Select the Client tab.
  6. \n
  7. Auto-Discovery: Click Scan LAN / Connect if you are on the same local network.\nManual Discovery: Enter the Server's IP address into the \"Specific Server IP\" box and click Scan if you are on a different VLAN.
  8. \n
  9. Select your target printer from the list and click Install Selected Printer.
  10. \n
  11. Open any application, press Ctrl + P, select ShaPrint - [Printer Name], and Print!
  12. \n
\n

3. Monitoring Server Status

\n
    \n
  1. Open ShaPrint.
  2. \n
  3. Select the Monitor tab from the sidebar.
  4. \n
  5. The dashboard will automatically scan and list all active servers on your network channel, displaying their status, connected clients, recent jobs, and active printer/scanner status.
  6. \n
  7. You can filter servers by hostname/IP, filter by online/offline/warning status, or click \"Refresh\" to trigger a manual sweep.
  8. \n
\n
\n

โš™๏ธ Building from Source

\n

To compile the source code and generate the installer yourself, ensure you have the .NET 8 SDK and Inno Setup 6 installed.

\n

1. Compile the Application

\n

Open a terminal in the root directory and run the following commands to publish the binaries:

\n
# Publish the main WPF Application\ndotnet publish ShaPrint.WpfApp/ShaPrint.WpfApp.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true\n\n# Publish the Background Updater\ndotnet publish ShaPrint.Updater/ShaPrint.Updater.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true\n
\n

2. Build the Windows Installer

\n

Using PowerShell, compile the .iss script:

\n
& 'C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe' installer.iss\n
\n

Your compiled installer (ShaPrint_Setup_v1.0.x.exe) will be generated inside the Output\\ directory.

\n
\n

๐Ÿ›  Troubleshooting

\n
    \n
  • Error: \"Driver X is not installed on this computer\" (Client): You must install the official manufacturer driver for the printer on the Client PC before ShaPrint can create the virtual printer.
  • \n
  • HMAC Verification Failed: The Client and Server do not share the same Network Channel password. Update the Network Channel in Settings to match exactly.
  • \n
  • Client cannot find the Server (Empty scan list): Ensure ports 9876/UDP and 9877/TCP are open on the Server's Windows Firewall. If you are on a different subnet, auto-discovery will not workโ€”use the \"Specific Server IP\" feature.
  • \n
  • Word freezes or \"Connecting to Printer\" takes forever: This indicates Windows Bidirectional Support (BIDI) is enabled. Go to Control Panel -> Devices & Printers -> Right-click the ShaPrint Printer -> Printer Properties -> Ports tab -> Uncheck Enable bidirectional support.
  • \n
  • Printed output is gibberish/error codes: The Printer Driver selected on the Client PC does not match the actual physical printer on the Server PC. Ensure both machines utilize the same driver.
  • \n
\n
\n
\n Developed by ardli-firman
\n Open Source Print Management\n
\n" - }, { "fullName": "rizukirr/no-vibe", "name": "no-vibe", @@ -1187,7 +1151,7 @@ "url": "https://github.com/rizukirr/no-vibe", "homepage": "", "language": "Shell", - "stars": 34, + "stars": 35, "forks": 1, "topics": [ "ai-agents", @@ -1203,7 +1167,7 @@ "vibe-coding", "vibecoding" ], - "updatedAt": "2026-07-12T13:26:53Z", + "updatedAt": "2026-07-22T05:40:25Z", "pushedAt": "2026-06-12T15:10:29Z", "latestRelease": { "name": "v2.0.3", @@ -1220,6 +1184,42 @@ "communityHealth": 42, "readmeHtml": "

no-vibe

\n

Turn your AI assistant into a tutor. It plans, hints, reviews and adapts while you write every line.

\n
    \n
  • Is: a guide that works beside your real project in your editor
  • \n
  • Is not: a chat only window you ask for answers
  • \n
  • Needs: a project open and an editor where you type the code
  • \n
\n
\n

Pair with vibekit: vibekit when you want speed, no-vibe when you want to learn.

\n
\n

Why no-vibe

\n

Vibe-coding produces output without producing understanding and copy-typing what the AI shows you produces the same hollow result one keystroke at a time. The thing that actually transfers is the thought process and manual code writing: deciding what to do, predicting what will happen and naming what broke, no-vibe is built so you contribute that, not just keystrokes.

\n
    \n
  • You write every line of project code. AI refuses to. Hard-guarded by hooks across all five surfaces.
  • \n
  • You think before you type. Guided write is the default โ€” AI walks you toward the code in English with graded hints (hint / analogy / pseudo / show / less), so the code you write comes from a decision you made, not a block you transcribed.
  • \n
  • You predict before you run. Every layer ends with a one-question prediction gate: name the edge case, the failing branch, or the intermediate value before the program runs. The run becomes a self-test, not passive verification.
  • \n
  • AI is a Socratic guide, not a generator. It asks, hints, reviews, and explains when you're ready to integrate the explanation.
  • \n
  • You learn from the project you're actually building โ€” not contrived exercises. Real code, real bugs, real decisions in your repo. Bottom-up and incremental: six phases, small layers, your diff is the proof of progress.
  • \n
\n

How it works

\n
    \n
  • Top-down, one layer at a time. Minimal runnable skeleton first; each layer runs and shows output before the next.
  • \n
  • Where โ†’ code โ†’ why โ†’ run + verify. Each step says exactly which file and line, then what runs and what should print.
  • \n
  • Real code, not hallucinations. Attach --ref <url> and the AI quotes actual source with file:line citations.
  • \n
  • Adapts to you. The AI keeps a PROFILE.md (global, stable identity) and a SUMMARY.md (per-project, running journey) it writes itself โ€” observed strengths, known gaps, style notes, current focus, open questions. You can edit either, or layer explicit overrides via user/*.md.
  • \n
  • Your files stay yours. Hard write-guards on Claude Code, OpenCode, and Pi block writes (file and Bash) outside .no-vibe/**. Codex/Gemini enforce the same rule via instruction.
  • \n
\n

How adaptation works

\n

no-vibe uses a four-layer stack, split by write cadence and scope:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerOwnerWhat lives in it
Default teaching stylePlugin โ€” defined in skills/no-vibe/SKILL.mdPlain words first, concrete-before-abstract, hint-before-answer, run + verify after every layer. The floor.
~/.no-vibe/PROFILE.md (global, stable identity)AI โ€” created on first /no-vibe, rewritten rarely when cross-project identity / style shiftsIdentity & expertise, learning style, disclosure mode, observed strengths, known gaps
.no-vibe/SUMMARY.md (project, running journey)AI โ€” created at the first layer close worth recording, rewritten often (every closed layer is a candidate)Current Focus, Accomplishments, Open Questions in this project
~/.no-vibe/user/*.md and .no-vibe/user/*.mdYou โ€” AI never creates, edits, or deletes anything insideExplicit overrides: instructions you want the AI to follow without inferring them
\n

Why the split. Stable identity (the things that wouldn't change if you opened a different project tomorrow) and running journey (the things that only make sense inside this project) update on totally different cadences. Keeping them in one file forces the AI to decide on every rewrite whether this fact is stable or transient โ€” and gets it wrong. PROFILE only holds cross-project-durable facts; SUMMARY only holds project-bound state.

\n

PROFILE.md is the AI's global progression file. On your first /no-vibe activation, the AI creates it with empty section headings (Identity & expertise, Learning style, Disclosure mode, Observed strengths, Known gaps). It's rewritten only when something durable about how you learn shifts โ€” most layers produce no PROFILE update.

\n

SUMMARY.md is the AI's per-project journey file. It's not seeded on activation โ€” the AI creates it the first time a layer close produces an outcome worth recording, then keeps it tight by pruning resolved Open Questions and old Accomplishments. The most valuable section is Open Questions โ€” things you dodged with a workaround or didn't fully integrate, surfaced so the next session can revisit them.

\n

The silent-default + NO_CHANGE rule. Both files follow two disciplines: most layer-closes produce no write (silent default), and the AI never rewrites a file with content equivalent to what's already there (NO_CHANGE). A no-op write is treated as a bug. Read either file any time to see what the AI has learned; edit them yourself if something looks wrong.

\n

user/*.md is your override layer. Drop any .md file into ~/.no-vibe/user/ (global) or .no-vibe/user/ (project) and the AI loads it sorted by filename. Anything in user/ wins on conflict with PROFILE.md or the default style. The AI is forbidden from writing to user/ โ€” when it notices a pattern that belongs there, it shows you the exact line and lets you add it.

\n

Practical examples โ€” anything in this style works in user/*.md:

\n
    \n
  • \"Use Rust analogies when you explain memory or ownership.\" โ†’ global, applies everywhere
  • \n
  • \"I'm already solid on async/await โ€” skip the basics.\" โ†’ global, AI stops explaining what you know
  • \n
  • \"This project uses tabs not spaces; don't comment on it.\" โ†’ project, kills repeated nudges
  • \n
  • \"Always show the failing run before the fix.\" โ†’ global, changes how reviews happen
  • \n
\n

Per-session cycle state (current phase, layer, resume hints) lives separately in .no-vibe/data/sessions/<slug>.json โ€” you generally don't touch that.

\n

Quick start

\n

Claude Code

\n
/plugin marketplace add rizukirr/no-vibe\n/plugin install no-vibe@no-vibe\n
\n

Restart Claude Code.

\n

Codex

\n
codex plugin marketplace add rizukirr/no-vibe\ncodex plugin add no-vibe --marketplace no-vibe\n
\n

(Requires a Codex CLI build with plugin marketplace support. For older Codex builds, see INSTALL.codex.md for the manual symlink path โ€” skills only, soft block.)

\n

Pi

\n
pi install npm:no-vibe\n
\n

Or pin to git: pi install git:github.com/rizukirr/no-vibe. See INSTALL.pi.md for verification steps.

\n

Gemini CLI

\n
gemini extensions install https://github.com/rizukirr/no-vibe\n
\n

Pin a version with --ref=v2.0.3. See INSTALL.gemini.md for the legacy manual-symlink path.

\n

OpenCode

\n

Add to ~/.config/opencode/opencode.json:

\n
{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\"no-vibe\"]\n}\n
\n

OpenCode has no plugin install CLI, so commands also need to be fetched once:

\n
mkdir -p ~/.config/opencode/commands\nfor c in no-vibe no-vibe-challenge no-vibe-btw; do\n  curl -fsSL \"https://raw.githubusercontent.com/rizukirr/no-vibe/refs/heads/main/.opencode/commands/$c.md\" \\\n    -o \"$HOME/.config/opencode/commands/$c.md\"\ndone\n
\n

See INSTALL.opencode.md for verification steps and the cache-refresh tip.

\n

Your first lesson

\n
/no-vibe build a linear layer like pytorch's\n
\n

Codex uses $ instead of /.

\n

Commands

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandEffect
/no-vibe on / offpersistent mode toggle
/no-vibe <topic>one-shot lesson
/no-vibe --ref <url> <topic>attach a reference project
/no-vibe --mode concept|skill|debug <topic>set voice mode
/no-vibe-btw <task>one-shot escape hatch โ€” AI may write for this task only
/no-vibe-challenge [<focus>]get a coding challenge
\n

Flags combine: /no-vibe --ref pytorch --mode concept how does autograd work.

\n

Voice modes

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ModeBest forStyle
concept (default)\"teach me how X works\"more prose, deeper check-ins
skill\"I want to practice writing Y\"muscle-memory repetition
debug\"why does Z behave like this\"start from symptom, descend
\n

Voice modes control how AI talks. A separate axis, disclosure modes (guided write vs. showcase), controls how much AI reveals before the user writes code in a Phase 3 layer โ€” guided is the default and walks the user toward the code with English + graded hints on request; showcase shows the full code block upfront. Both default to running a one-question prediction gate before the user runs the code each layer, so the run becomes a self-test rather than passive verification. See skills/no-vibe/SKILL.md for the full disclosure-mode contract and the help verbs (hint / analogy / pseudo / show / less).

\n

Platform support

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureClaude CodeOpenCodePiCodexGemini CLI
File-write guard (hook)โœ“โœ“โœ“โœ“ *soft
Bash-write guard (hook)โœ“โœ“โœ“โœ“ *soft
Status + resume hintโœ“โœ“โœ“โœ“ *soft
Commandsโœ“โœ“โœ“โœ“โœ“
PROFILE.md + SUMMARY.md + user/ overridesโœ“โœ“โœ“โœ“โœ“
\n

* Codex hooks fire under the marketplace install (codex plugin add no-vibe --marketplace no-vibe). The legacy manual-symlink install path is soft-only.

\n

\"soft\" = instruction-enforced (no hook surface available); the rule still binds.

\n

License

\n

MIT. Issues and PRs welcome at github.com/rizukirr/no-vibe/issues.

\n" }, + { + "fullName": "ardli-firman/sha-print", + "name": "sha-print", + "owner": "ardli-firman", + "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/48121202?v=4", + "description": "The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows", + "metaDescription": "The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows", + "url": "https://github.com/ardli-firman/sha-print", + "homepage": "", + "language": "C#", + "stars": 34, + "forks": 13, + "topics": [ + "desktop-app", + "printer", + "sharing", + "sharing-printer", + "windows" + ], + "updatedAt": "2026-07-18T03:45:52Z", + "pushedAt": "2026-07-18T03:40:27Z", + "latestRelease": { + "name": "ShaPrint v1.6.0 (Stable)", + "tagName": "v1.6.0-stable", + "url": "https://github.com/ardli-firman/sha-print/releases/tag/v1.6.0-stable", + "publishedAt": "2026-07-13T04:40:11Z" + }, + "archived": true, + "licenseSpdx": "", + "createdAt": "2026-05-23T05:37:35Z", + "openIssues": 0, + "openPullRequests": 0, + "subscribers": 0, + "communityHealth": 28, + "readmeHtml": "

๏ปฟ> This repository is frozen at v2.0.0-community (LTS).

\n
\n

No further releases will be tagged. Self-compiling this source still\nproduces a working Community binary under GPL v3.\nThe Premium edition (Web Print Premium, Email-to-Print, Driver\nAuto-Install) is distributed separately as an official signed binary.\nSee docs/RELEASE.md for the full release strategy.

\n
\n
\n \"ShaPrint\n

ShaPrint

\n

The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows

\n

\n

ShaPrint is an advanced, .NET 8-based application designed to reliably share physical printers across local networks (LAN) and cross-subnet/VLAN environments. It serves as a robust alternative when native Windows SMB Printer Sharing fails, struggles with network credential conflicts, or is obstructed by strict Windows security policies.

\n

By utilizing a Virtual Printer Port (Named Pipes) architecture and direct TCP/UDP transmission, ShaPrint guarantees that documents are printed with 100% fidelity and native quality.

\n
\n

โœจ Key Features

\n
    \n
  • ๐ŸŽญ Unified Application: One executable handles everything. Operate as a Server (hosting the physical printer) or a Client (routing the documents) from a single unified interface.
  • \n
  • ๐Ÿ’Ž Native Driver Quality: Unlike traditional workarounds that degrade quality to Generic/Text or PDF rasterization, ShaPrint leverages the official printer driver (e.g., Epson, HP, Canon) on the Client side. Margins, colors, and layouts are preserved perfectly.
  • \n
  • ๐ŸŒ Cross-VLAN Support: Use the Specific Server IP feature to bypass router boundaries, allowing Clients to connect to Servers located in entirely different subnets or VLANs.
  • \n
  • ๐Ÿ”„ IP Change Auto-Detection: Automatically detects when the server IP changes (e.g., DHCP reallocation, network migration) using a stable, unique server identity. It dynamically updates client configurations and restarts active pipe listeners without user intervention or print interruption.
  • \n
  • ๐Ÿ”’ Enterprise-Grade Security: Network communication is secured via a shared Network Channel password. All discovery payloads are verified using HMAC signatures, ensuring only authorized clients can discover or print to your server.
  • \n
  • โšก Seamless Auto-Updater: ShaPrint includes a built-in background updater. It checks for new releases on GitHub and updates itself seamlessly without interrupting active print jobs.
  • \n
  • ๐Ÿ‘ป Stealth Background Service: Minimize the app to the System Tray to handle print jobs silently. ShaPrint integrates directly with the Windows Task Scheduler to automatically start at boot with the highest privileges, entirely bypassing annoying UAC prompts.
  • \n
  • ๐Ÿ”” Real-Time Notifications: Receive native Windows Toast notifications for print job completions, printer errors, client connections/disconnections, and scan results. Works reliably even when the application is minimized to the system tray or running as a background startup service. Clicking a toast instantly restores the application window.
  • \n
  • ๐Ÿ“Š Server Monitoring Mode: Consolidated dashboard to monitor all active servers on the local network. View real-time server information, network channel, software version, uptime, exposed printer queues, scanner availability, active client connections, recent job histories, and printer/scanner error notifications.
  • \n
\n
\n

๐Ÿ“ธ Screenshots

\n
\n\n \n \n \n \n \n \n \n \n \n \n
Switch Mode
Server Mode
Client Mode
Monitoring
Settings
Update Manager
\n

๐Ÿ— System Architecture

\n
    \n
  1. Server Mode\nRunning on the computer directly connected to the physical printer via USB or LAN, the Server scans for local printers and listens for raw print spool data on TCP Port 9877. It also broadcasts its presence using UDP Port 9876 for auto-discovery.

    \n
  2. \n
  3. Client Mode\nThe application intercepts print jobs by creating a Virtual Printer Port within the Windows Spooler. Any document printed from standard applications (Word, Chrome, Acrobat) to this virtual printer is instantly intercepted and streamed directly to the Server.

    \n
  4. \n
  5. Monitoring Mode\nOperators or users can monitor all active ShaPrint servers across the network channel. It discovers active servers via UDP and queries their status on TCP Port 9878 to retrieve real-time encrypted details.

    \n
  6. \n
\n
\n

๐Ÿ’ป System Requirements

\n

Before installing ShaPrint, please ensure your system meets the following requirements:

\n
    \n
  • Operating System: Windows 10 or Windows 11 (64-bit / x64 architecture)
  • \n
  • Minimum Version/Build: Windows 10 Version 1809 (Build 10.0.17763) or newer (released November 2018)
  • \n
  • Pre-requisites: None. The installation is fully self-contained, meaning you do not need to install the .NET Runtime manually.
  • \n
\n
\n

๐Ÿ”’ Security & Safety

\n

ShaPrint implements defense-in-depth security to protect your local network, computer performance, and hardware.

\n

Encryption & Authentication

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerMechanismDescription
TCP Data (Print/Scan/Monitor)AES-256-GCMAll TCP payloads (print jobs, scan data, monitoring status) are encrypted with AES-256 in Galois/Counter Mode โ€” providing both confidentiality and tamper detection. Each encryption uses a fresh random 96-bit nonce.
UDP DiscoveryHMAC-SHA256Discovery responses are signed with HMAC-SHA256. Clients verify the signature before trusting any server response, preventing spoofing and man-in-the-middle attacks.
Key DerivationPBKDF2 (100k iterations)All cryptographic keys are derived from the Network Channel shared secret using PBKDF2 with 100,000 iterations and unique salts per purpose (AES, HMAC, local config).
Config IntegrityHMAC-wrapped JSONServer configuration files are stored with an embedded HMAC to detect tampering. Corrupted or modified configs are rejected on load.
\n

Network Protection

\n
    \n
  • Rate Limiting: Discovery server limits requests to 5 per second per IP address. Stale rate-limit entries are periodically pruned to prevent memory leaks.
  • \n
  • Payload Size Limits: Every network payload has a strict maximum size โ€” discovery responses (8 KB), monitor requests (4 KB), print jobs (100 MB). Excessively large payloads are rejected immediately.
  • \n
  • Input Sanitization: All strings received from the network (printer names, server names, driver names) are validated against a strict whitelist regex. Shell metacharacters (' \" ; $ \\ | & < > \\n \\r \\t \\0`) are explicitly blocked.
  • \n
  • Concurrency Throttling: Maximum 10 concurrent print jobs to prevent resource exhaustion.
  • \n
  • Firewall Integration: On server start, Windows Firewall rules for ports 9876/UDP, 9877/TCP, and 9878/TCP are automatically configured (with user consent via UAC prompt). Rules are persistent โ€” only needed once.
  • \n
  • Connection Timeout: Monitoring TCP queries time out after 5 seconds, preventing hung connections from accumulating.
  • \n
\n

Performance & Stability

\n
    \n
  • Lightweight Polling: Monitor mode polls servers every 15 seconds with requests staggered 1 second apart to avoid network/CPU spikes.
  • \n
  • Unicast Sweep Control: Bulk IP sweep (up to 1024 addresses) runs only on first startup and manual refresh. Routine polling uses broadcast discovery only (skipUnicastSweep=true).
  • \n
  • In-Memory Logging: Server logs are stored in memory (max 200 entries) โ€” no continuous disk I/O.
  • \n
  • Automatic Job Recovery: PrintMonitorService automatically detects and cancels stuck/error print jobs, preventing spooler congestion.
  • \n
\n

Hardware Safety

\n

ShaPrint interacts with hardware exclusively through standard Windows APIs:

\n
    \n
  • Printing: Windows Print Spooler API (AddJob / spool file injection)
  • \n
  • Scanning: Windows Image Acquisition (WIA) 2.0
  • \n
  • Result: The application cannot cause physical damage to printers, scanners, or computer components. All risks are identical to printing or scanning from any standard Windows application.
  • \n
\n

Safety Assessment Summary

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ConcernVerdictNotes
Local network security๐ŸŸข Safe (with configuration)AES-256-GCM + HMAC-SHA256 provide strong protection. Must customize Network Channel from default for multi-tenant environments.
Computer performance๐ŸŸข SafeCPU/RAM impact is negligible for monitoring. Print/scan load is temporary and on-demand.
Hardware damage๐ŸŸข SafeSoftware-only โ€” uses only standard Windows APIs (Spooler, WIA). No risk of physical damage.
\n

โš ๏ธ Critical Recommendations

\n
    \n
  1. ๐Ÿ”ด Customize Your Network Channel

    \n
      \n
    • Go to Settings โ†’ Network Channel
    • \n
    • Change from the default \"DefaultChannel\" to a unique, random string known only to your devices
    • \n
    • Share the same value with all clients on your network
    • \n
    • This regenerates ALL encryption keys โ€” without this, any ShaPrint instance on the same network can decrypt your traffic
    • \n
    \n
  2. \n
  3. Coordinate with IT

    \n
      \n
    • Inform your network administrator about these ports:
        \n
      • UDP 9876 โ€” Service discovery
      • \n
      • TCP 9877 โ€” Print/scan data transfer
      • \n
      • TCP 9878 โ€” Server monitoring status
      • \n
      \n
    • \n
    • Ask them to restrict access to these ports to your subnet/VLAN only
    • \n
    \n
  4. \n
  5. Use Only on Trusted Networks

    \n
      \n
    • ShaPrint is designed for local LAN / VPN environments
    • \n
    • Do not expose ports to the public internet or untrusted WiFi networks
    • \n
    \n
  6. \n
\n
\n

๐Ÿš€ Installation

\n

ShaPrint is packaged as a fully self-contained Standalone Setup. You do not need to install the .NET Runtime manually.

\n
    \n
  1. Download the latest ShaPrint_Setup_vX.Y.Z.exe from the GitHub Releases page.
  2. \n
  3. Run the installer and follow the prompts.
  4. \n
  5. The application will automatically place shortcuts on your Desktop and Start Menu.
  6. \n
\n
\n

๐Ÿ“– How to Use

\n
\n

[!IMPORTANT]
Native Driver Requirement: To guarantee print fidelity, you must install the official printer driver on the Client PC. For example, if the Server is hosting an Epson L3210, you must install the Epson L3210 driver on the Client PC beforehand.

\n
\n

1. On the Server PC (Hosting the Printer)

\n
    \n
  1. Open ShaPrint from your Desktop.
  2. \n
  3. Ensure you and your clients agree on a Network Channel password in the Settings.
  4. \n
  5. Select the Server tab.
  6. \n
  7. Check the boxes next to the physical printers you wish to expose to the network.
  8. \n
  9. Click Start Server.
  10. \n
  11. You may now close the window; the application will silently minimize to the System Tray.
  12. \n
\n

2. On the Client PC (Sending Print Jobs)

\n
    \n
  1. Open ShaPrint.
  2. \n
  3. Ensure your Network Channel password matches the Server's exactly.
  4. \n
  5. Select the Client tab.
  6. \n
  7. Auto-Discovery: Click Scan LAN / Connect if you are on the same local network.\nManual Discovery: Enter the Server's IP address into the \"Specific Server IP\" box and click Scan if you are on a different VLAN.
  8. \n
  9. Select your target printer from the list and click Install Selected Printer.
  10. \n
  11. Open any application, press Ctrl + P, select ShaPrint - [Printer Name], and Print!
  12. \n
\n

3. Monitoring Server Status

\n
    \n
  1. Open ShaPrint.
  2. \n
  3. Select the Monitor tab from the sidebar.
  4. \n
  5. The dashboard will automatically scan and list all active servers on your network channel, displaying their status, connected clients, recent jobs, and active printer/scanner status.
  6. \n
  7. You can filter servers by hostname/IP, filter by online/offline/warning status, or click \"Refresh\" to trigger a manual sweep.
  8. \n
\n
\n

โš™๏ธ Building from Source

\n

To compile the source code and generate the installer yourself, ensure you have the .NET 8 SDK and Inno Setup 6 installed.

\n

1. Compile the Application

\n

Open a terminal in the root directory and run the following commands to publish the binaries:

\n
# Publish the main WPF Application\ndotnet publish ShaPrint.WpfApp/ShaPrint.WpfApp.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true\n\n# Publish the Background Updater\ndotnet publish ShaPrint.Updater/ShaPrint.Updater.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true\n
\n

2. Build the Windows Installer

\n

Using PowerShell, compile the .iss script:

\n
& 'C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe' installer.iss\n
\n

Your compiled installer (ShaPrint_Setup_v1.0.x.exe) will be generated inside the Output\\ directory.

\n
\n

๐Ÿ›  Troubleshooting

\n
    \n
  • Error: \"Driver X is not installed on this computer\" (Client): You must install the official manufacturer driver for the printer on the Client PC before ShaPrint can create the virtual printer.
  • \n
  • HMAC Verification Failed: The Client and Server do not share the same Network Channel password. Update the Network Channel in Settings to match exactly.
  • \n
  • Client cannot find the Server (Empty scan list): Ensure ports 9876/UDP and 9877/TCP are open on the Server's Windows Firewall. If you are on a different subnet, auto-discovery will not workโ€”use the \"Specific Server IP\" feature.
  • \n
  • Word freezes or \"Connecting to Printer\" takes forever: This indicates Windows Bidirectional Support (BIDI) is enabled. Go to Control Panel -> Devices & Printers -> Right-click the ShaPrint Printer -> Printer Properties -> Ports tab -> Uncheck Enable bidirectional support.
  • \n
  • Printed output is gibberish/error codes: The Printer Driver selected on the Client PC does not match the actual physical printer on the Server PC. Ensure both machines utilize the same driver.
  • \n
\n
\n
\n Developed by ardli-firman
\n Open Source Print Management\n
\n" + }, { "fullName": "pendig/rute-bayar", "name": "rute-bayar", @@ -1633,19 +1633,19 @@ "windows-app", "windows-desktop" ], - "updatedAt": "2026-07-21T05:40:00Z", - "pushedAt": "2026-07-21T17:29:02Z", + "updatedAt": "2026-07-22T05:11:02Z", + "pushedAt": "2026-07-22T05:10:18Z", "latestRelease": { - "name": "v0.3.2", - "tagName": "v0.3.2", - "url": "https://github.com/muslimtify-org/muslimtify/releases/tag/v0.3.2", - "publishedAt": "2026-07-17T10:40:18Z" + "name": "v0.4.0", + "tagName": "v0.4.0", + "url": "https://github.com/muslimtify-org/muslimtify/releases/tag/v0.4.0", + "publishedAt": "2026-07-22T05:08:48Z" }, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-02-23T13:59:12Z", - "openIssues": 1, - "openPullRequests": 1, + "openIssues": 0, + "openPullRequests": 0, "subscribers": 0, "communityHealth": 75, "readmeHtml": "

Muslimtify

\n

Muslimtify keeps you consistent with your daily prayers by delivering accurate prayer times and timely desktop notifications. Designed for Linux and Windows, it automatically calculates prayer schedules and reminds you 30, 15, and 5 minutes before the Adhan โ€” or at your own custom intervals โ€” and when it's time to pray. All calculations run locally, requiring no internet connection or external services.

\n

Muslimtify supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag. With persistent configuration and minimal setup, Muslimtify integrates seamlessly into your daily routine without interrupting your workflow.

\n
\n

[!Note]\nPrayer time calculations are powered by libmuslim, a portable library extracted from this project to enable a more flexible and reusable ecosystem for Muslim developers.

\n
\n\n\n\n\n\n\n\n\n\n\n\n
LinuxWindows
\"2026-07-08-202423_hyprshot\"\"Cuplikan
\n
\n

Roadmap

\n
    \n
  • Merge command location auto and method auto into (only) config auto and optimize auto detection per (249) country
  • \n
  • Refactor from timer-driven into a portable long-running loop
  • \n
  • Add custom adzan sound notifications
  • \n
  • Re-design command-line (BREAKING CHANGES)
  • \n
  • Add read lat/long from user GPS
  • \n
  • Add GUI (see branch gui to see a progress)
  • \n
  • Distribute to Flatpak
  • \n
  • MacOS support (if devices is available)
  • \n
  • Wearable Device support
  • \n
  • Embedded Device Support
  • \n
\n
\n
\n

[!Important]\nThis project is available for Linux and Windows users, but not yet for Mac users because we need a Mac device to make Muslimtify run on macOS. We are looking for brothers and sisters who have a Mac and experience in low-level C programming to contribute to the project and help bring Muslimtify to macOS. Alternatively, you can support us via GitHub Sponsors in the sponsor section.

\n
\n

Installation

\n

Prebuilt Binaries (GitHub Releases)

\n

Every release ships ready-to-run binaries for Linux and Windows on the\nReleases page.

\n

Linux (x86_64 or aarch64) โ€” the binaries are dynamically linked, so\ninstall the runtime libraries first, then extract and install:

\n
# Ubuntu/Debian\nsudo apt install libnotify4 libcurl4\n# Fedora/RHEL\nsudo dnf install libnotify libcurl\n# Arch\nsudo pacman -S libnotify curl\n\ntar xzf muslimtify-<version>-linux-<arch>.tar.gz\nsudo cp -r muslimtify-<version>-linux-<arch>/{bin,lib,share} /usr/local/\nmuslimtify daemon install\n
\n

Windows (x64 or arm64) โ€” download and run the matching installer:

\n
muslimtify-<version>-setup-x64.exe      # Intel/AMD\nmuslimtify-<version>-setup-arm64.exe    # ARM\n
\n

Verify any download against the published checksums:

\n
sha256sum -c SHA256SUMS\n
\n

Arch Linux (AUR)

\n
yay -S muslimtify\n
\n

Fedora (COPR)

\n
sudo dnf copr enable rizukirr/muslimtify\nsudo dnf install muslimtify\n
\n

Debian/Ubuntu (PPA)

\n
sudo add-apt-repository ppa:rizukirr/muslimtify\nsudo apt update\nsudo apt install muslimtify\n
\n

Linux Source Install

\n

Install dependencies:

\n
# Ubuntu/Debian\nsudo apt install git build-essential cmake pkg-config libnotify-dev libcurl4-openssl-dev\n\n# Fedora/RHEL\nsudo dnf install git gcc cmake pkgconfig libnotify-devel libcurl-devel\n\n# Arch Linux\nsudo pacman -S git base-devel cmake pkgconfig libnotify curl\n
\n

Clone, install, and enable background checks:

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\nsudo ./install.sh\nmuslimtify daemon install\n
\n

Windows (winget)

\n
winget install muslimtify\n
\n

Windows Source Install

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\n.\\install.ps1\nmuslimtify daemon install\n
\n

To remove the Windows install later, run .\\uninstall.ps1.

\n

If you prefer building manually first:

\n
cmake -S . -B build\ncmake --build build --config Release\ncmake --install build --config Release\nmuslimtify daemon install\n
\n

Post Installation

\n

Run muslimtify daemon status to check if Muslimtify is registered with systemd. If no status is found, run muslimtify daemon install to register the service and ensure it runs as expected.

\n

Muslimtify automatically selects the standard prayer time calculation method based on your country and location. Run muslimtify to verify that your configuration is correct. If the automatic selection does not meet your needs, you can set it manually using muslimtify method <key-method>. A full list of available methods is documented here.

\n

Configuration

\n

Muslimtify can be configured with CLI commands or by editing config.json\nmanually.

\n

Config paths:

\n
    \n
  • Linux config: ~/.config/muslimtify/config.json
  • \n
  • Linux cache: ~/.cache/muslimtify
  • \n
  • Windows config: %APPDATA%\\muslimtify\\config.json
  • \n
  • Windows cache: %LOCALAPPDATA%\\muslimtify
  • \n
\n

Common setup commands:

\n
muslimtify location set --auto                  # detect location from IP\nmuslimtify location set --auto --city=Mansoura  # auto-detect but use your own city label\nmuslimtify method --auto                        # select method from the detected country\nmuslimtify location set --lat=-6.175 --long=106.82  # set location manually (uses system timezone)\nmuslimtify location set --timezone=Asia/Jakarta     # override timezone\nmuslimtify location set --city=Jakarta              # add a city label\nmuslimtify location set --refresh-interval=21600    # re-check location every 6h (0=off, min 3600)\nmuslimtify method --list          # list all available calculation methods\nmuslimtify method mwl             # set calculation method\nmuslimtify madzhab hanafi         # set madzhab (shafi/hanafi)\nmuslimtify notification --reminder --all 30 15 5    # set every prayer's reminders (minutes before adhan)\nmuslimtify notification --reminder fajr 30 15 5     # set reminders for a single prayer\nmuslimtify notification           # show current notification settings\nmuslimtify location               # show current location\n
\n

Resetting the configuration is done by deleting config.json. Muslimtify falls\nback to built-in defaults when the file is missing, and rewrites it the next\ntime you change a setting. Validation runs automatically every time the config\nis loaded.

\n

Calculation Methods

\n

Muslimtify supports the following calculation methods:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by setting \"method\": \"custom\" in config.json with your own fajr_angle and isha_angle values.

\n

Manual JSON editing is useful when you want precise control over enabled\nprayers, reminder offsets, notification settings, or location data.

\n\nDefault config.json
{\n  \"location\": {\n    \"latitude\": 0.0,\n    \"longitude\": 0.0,\n    \"timezone\": \"UTC\",\n    \"timezone_offset\": 0.0,\n    \"auto_detect\": true,\n    \"city\": \"\",\n    \"country\": \"\"\n  },\n  \"prayers\": {\n    \"fajr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"sunrise\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuha\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuhr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"asr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"maghrib\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"isha\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    }\n  },\n  \"notification\": {\n    \"timeout\": 5000,\n    \"urgency\": \"critical\",\n    \"sound\": \"adhan\",\n    \"sound_alarm\": \"alarm\",\n    \"sound_reminder\": \"reminder\",\n    \"icon\": \"muslimtify\"\n  },\n  \"calculation\": {\n    \"method\": \"kemenag\",\n    \"madhab\": \"shafi\"\n  }\n}\n
\n

Troubleshooting

\n

Notifications are not appearing

\n
    \n
  • Run muslimtify daemon status to confirm the background service is running.
  • \n
  • On Linux, verify desktop notifications work with notify-send \"Test\" \"Hello\".
  • \n
  • On Windows, local system settings can block toast delivery. Check\nnotification settings, Focus Assist / Do Not Disturb, and whether the command\nis running in an interactive desktop session.
  • \n
\n

Location detection is not working

\n
    \n
  • Run muslimtify location set --auto again.
  • \n
  • Set coordinates manually with muslimtify location set --lat=<latitude> --long=<longitude>.\nIf the host machine is in a different region than the coordinates, override\nthe timezone with --timezone=<iana>, e.g.\nmuslimtify location set --lat=-6.21 --long=106.84 --timezone=Asia/Jakarta.
  • \n
  • Check network access to ipinfo.io if auto detection keeps failing.
  • \n
\n

Contributing

\n

Contributions are welcome. See CONTRIBUTING.md for workflow,\nstyle, and testing guidance.

\n

License

\n

Muslimtify is released under the MIT License. See the repository license files\nfor details.

\n

Support

\n\n" @@ -2429,8 +2429,8 @@ "stars": 2, "forks": 0, "topics": [], - "updatedAt": "2026-07-13T09:56:57Z", - "pushedAt": "2026-07-13T07:38:07Z", + "updatedAt": "2026-07-22T05:53:21Z", + "pushedAt": "2026-07-22T05:52:52Z", "latestRelease": null, "archived": false, "licenseSpdx": "", @@ -2439,7 +2439,7 @@ "openPullRequests": 0, "subscribers": 0, "communityHealth": 25, - "readmeHtml": "

libmuslim

\n

A lightweight C header-only library for calculating Islamic prayer times. Supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag.

\n

Features

\n
    \n
  • 21 calculation methods โ€” worldwide coverage from MWL to Moonsighting Committee
  • \n
  • Astronomical calculations using Jean Meeus algorithms
  • \n
  • Single-header library โ€” easy to integrate
  • \n
  • Cross-platform support (Linux, macOS, Windows)
  • \n
  • Shafi'i and Hanafi Asr support
  • \n
  • CLI tool for quick calculations
  • \n
\n

Supported Methods

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by passing CALC_CUSTOM with your own angles.

\n

How It Works

\n

Each method defines a set of parameters:

\n
    \n
  • Fajr angle โ€” sun depression angle for Fajr
  • \n
  • Isha angle or interval โ€” angle-based or fixed minutes after Maghrib
  • \n
  • Maghrib interval โ€” offset after sunset (0 for most methods)
  • \n
  • Asr shadow factor โ€” 1 (Shafi'i) or 2 (Hanafi)
  • \n
  • Ihtiyat โ€” precautionary margin in minutes
  • \n
\n

Calculation Steps

\n
    \n
  1. Convert Gregorian date to Julian Day
  2. \n
  3. Calculate solar position (declination and equation of time)
  4. \n
  5. Determine solar transit time (true noon)
  6. \n
  7. Compute hour angles for each prayer based on solar altitude
  8. \n
  9. Convert hour angles to local time
  10. \n
  11. Apply ihtiyat adjustments
  12. \n
  13. Format times with ceiling rounding
  14. \n
\n

For detailed mathematical formulas and worked examples, see docs/KEMENAG_METHOD.md.

\n

Building

\n

This is a single-header library, so you can simply include prayertimes.h in your project.

\n

CLI Tool

\n
# Compile the CLI tool\ngcc -O3 -o libmuslim main.c -lm\n\n# Run example (Bekasi, November 21, 2025)\n./libmuslim 2025 11 21 -6.2851291 106.9814968 7.0\n
\n

Usage

\n

C API

\n
#include \"prayertimes.h\"\n\n// Use the default method (Kemenag)\nconst MethodParams *params = method_params_get(CALC_KEMENAG);\n\nstruct PrayerTimes times = calculate_prayer_times(\n    2025,           // year\n    11,             // month\n    21,             // day\n    -6.2851291,     // latitude (negative = South)\n    106.9814968,    // longitude (positive = East)\n    7.0,            // timezone offset (WIB = UTC+7)\n    params          // calculation method\n);\n\nchar buffer[16];\nformat_time_hm(times.fajr, buffer, sizeof(buffer));\nprintf(\"Fajr: %s\\n\", buffer);\n
\n

Using a Different Method

\n
// Use MWL method\nconst MethodParams *mwl = method_params_get(CALC_MWL);\nstruct PrayerTimes times = calculate_prayer_times(2025, 11, 21, 51.5074, -0.1278, 0.0, mwl);\n\n// Look up method by string key\nCalcMethod method = method_from_string(\"isna\");\nconst MethodParams *params = method_params_get(method);\n
\n

Timezones & DST

\n
\n

NOTE: prayertimes.h does not handle Daylight Saving Time. The\ntimezone argument is a fixed numeric UTC offset in hours, and the library\nuses it exactly as given โ€” it has no notion of dates, zones, or DST rules.\nThis is deliberate: DST is a political rule, not an astronomical one, and\nkeeping it out leaves prayertimes.h a pure, dependency-free (only <math.h>)\nsingle header. For a DST-active date you must pass the DST-adjusted offset\n(e.g. 1.0 for London in summer, 0.0 in winter).

\n
\n

If you want libmuslim to compute the correct offset for you, use the optional\ncompanion header timezone.h. It resolves an IANA zone name and\ndate to a UTC offset with DST applied, using the host operating system's\ntimezone database:

\n
#define MUSLIM_TIMEZONE_IMPLEMENTATION   // in exactly ONE translation unit\n#include \"timezone.h\"\n#include \"prayertimes.h\"\n\nchar zone[64];\nget_system_timezone(zone, sizeof(zone));            // e.g. \"Europe/London\"\ndouble tz = parse_timezone_offset(zone, time(NULL)); // DST already applied\n\nconst MethodParams *mwl = method_params_get(CALC_MWL);\nstruct PrayerTimes times = calculate_prayer_times(2026, 7, 15, 51.5074, -0.1278, tz, mwl);\n
\n

Unlike prayertimes.h, timezone.h touches the OS (POSIX tzset/tm_gmtoff\nor the Win32 timezone APIs), so it is optional โ€” include it only if you\nwant this resolution done for you. On a platform without a timezone database,\nkeep supplying the offset yourself.

\n

CLI Tool

\n
./libmuslim <year> <month> <day> <latitude> <longitude> <timezone>\n
\n

Example output:

\n
Fajr    = 04:05\nSunrise = 05:22\nDhuha   = 05:50\nDhuhr   = 11:41\nAsr     = 15:04\nMaghrib = 17:54\nIsha    = 19:07\n
\n

Verification

\n

The calculations have been verified against official data sources and match within ยฑ1-2 minute accuracy depending on the method. See the worked examples in docs/KEMENAG_METHOD.md for detailed verification.

\n

License

\n
Copyright 2025 Rizki Rakasiwi.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n
\n

Documentation

\n\n

Contributing

\n

Contributions are welcome! Please ensure any changes to calculation methods are verified against official data sources.

\n" + "readmeHtml": "

libmuslim

\n

A lightweight C header-only library for calculating Islamic prayer times. Supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag.

\n

Features

\n
    \n
  • 21 calculation methods โ€” worldwide coverage from MWL to Moonsighting Committee
  • \n
  • Astronomical calculations using Jean Meeus algorithms
  • \n
  • Single-header library โ€” easy to integrate
  • \n
  • Cross-platform support (Linux, macOS, Windows)
  • \n
  • Shafi'i and Hanafi Asr support
  • \n
  • CLI tool for quick calculations
  • \n
\n

Supported Methods

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by passing CALC_CUSTOM with your own angles.

\n

How It Works

\n

Each method defines a set of parameters:

\n
    \n
  • Fajr angle โ€” sun depression angle for Fajr
  • \n
  • Isha angle or interval โ€” angle-based or fixed minutes after Maghrib
  • \n
  • Maghrib interval โ€” offset after sunset (0 for most methods)
  • \n
  • Asr shadow factor โ€” 1 (Shafi'i) or 2 (Hanafi)
  • \n
  • Ihtiyat โ€” precautionary margin in minutes
  • \n
\n

Calculation Steps

\n
    \n
  1. Convert Gregorian date to Julian Day
  2. \n
  3. Calculate solar position (declination and equation of time)
  4. \n
  5. Determine solar transit time (true noon)
  6. \n
  7. Compute hour angles for each prayer based on solar altitude
  8. \n
  9. Convert hour angles to local time
  10. \n
  11. Apply ihtiyat adjustments
  12. \n
  13. Format times with ceiling rounding
  14. \n
\n

For detailed mathematical formulas and worked examples, see docs/KEMENAG_METHOD.md.

\n

Building

\n

This is a single-header library, so you can simply include prayertimes.h in your project.

\n

CLI Tool

\n
# Compile the CLI tool\ngcc -O3 -o libmuslim main.c -lm\n\n# Run example (Bekasi, November 21, 2025)\n./libmuslim 2025 11 21 -6.2851291 106.9814968 7.0\n
\n

Usage

\n

C API

\n
#include \"prayertimes.h\"\n\n// Use the default method (Kemenag)\nconst MethodParams *params = method_params_get(CALC_KEMENAG);\n\nstruct PrayerTimes times = calculate_prayer_times(\n    2025,           // year\n    11,             // month\n    21,             // day\n    -6.2851291,     // latitude (negative = South)\n    106.9814968,    // longitude (positive = East)\n    7.0,            // timezone offset (WIB = UTC+7)\n    params          // calculation method\n);\n\nchar buffer[16];\nformat_time_hm(times.fajr, buffer, sizeof(buffer));\nprintf(\"Fajr: %s\\n\", buffer);\n
\n

Using a Different Method

\n
// Use MWL method\nconst MethodParams *mwl = method_params_get(CALC_MWL);\nstruct PrayerTimes times = calculate_prayer_times(2025, 11, 21, 51.5074, -0.1278, 0.0, mwl);\n\n// Look up method by string key\nCalcMethod method = method_from_string(\"isna\");\nconst MethodParams *params = method_params_get(method);\n
\n

Iterating a Date Range

\n

mt_days_from_civil converts a civil (proleptic Gregorian) date to a day number counted from 1970-01-01, and mt_civil_from_days converts it back. They let you walk a range of dates without touching struct tm or mktime, so there are no DST or local-time hazards in the loop itself.

\n
// Print Fajr for every day in July 2026\nlong start = mt_days_from_civil(2026, 7, 1);\nlong end   = mt_days_from_civil(2026, 7, 31);\n\nfor (long serial = start; serial <= end; serial++) {\n    int y, m, d;\n    mt_civil_from_days(serial, &y, &m, &d);\n\n    struct PrayerTimes t = calculate_prayer_times(y, m, d, -6.2851291, 106.9814968, 7.0, params);\n\n    char buffer[16];\n    format_time_hm(t.fajr, buffer, sizeof(buffer));\n    printf(\"%04d-%02d-%02d  Fajr: %s\\n\", y, m, d, buffer);\n}\n
\n

Both are static inline, so they carry no link-time cost and need no PRAYERTIMES_IMPLEMENTATION definition. Day numbers are signed, and dates before 1970 are negative.

\n

Timezones & DST

\n
\n

NOTE: prayertimes.h does not handle Daylight Saving Time. The\ntimezone argument is a fixed numeric UTC offset in hours, and the library\nuses it exactly as given โ€” it has no notion of dates, zones, or DST rules.\nThis is deliberate: DST is a political rule, not an astronomical one, and\nkeeping it out leaves prayertimes.h a pure, dependency-free (only <math.h>)\nsingle header. For a DST-active date you must pass the DST-adjusted offset\n(e.g. 1.0 for London in summer, 0.0 in winter).

\n
\n

If you want libmuslim to compute the correct offset for you, use the optional\ncompanion header timezone.h. It resolves an IANA zone name and\ndate to a UTC offset with DST applied, using the host operating system's\ntimezone database:

\n
#define MUSLIM_TIMEZONE_IMPLEMENTATION   // in exactly ONE translation unit\n#include \"timezone.h\"\n#include \"prayertimes.h\"\n\nchar zone[64];\nget_system_timezone(zone, sizeof(zone));            // e.g. \"Europe/London\"\ndouble tz = parse_timezone_offset(zone, time(NULL)); // DST already applied\n\nconst MethodParams *mwl = method_params_get(CALC_MWL);\nstruct PrayerTimes times = calculate_prayer_times(2026, 7, 15, 51.5074, -0.1278, tz, mwl);\n
\n

Unlike prayertimes.h, timezone.h touches the OS (POSIX tzset/tm_gmtoff\nor the Win32 timezone APIs), so it is optional โ€” include it only if you\nwant this resolution done for you. On a platform without a timezone database,\nkeep supplying the offset yourself.

\n

CLI Tool

\n
./libmuslim <year> <month> <day> <latitude> <longitude> <timezone>\n
\n

Example output:

\n
Fajr    = 04:05\nSunrise = 05:22\nDhuha   = 05:50\nDhuhr   = 11:41\nAsr     = 15:04\nMaghrib = 17:54\nIsha    = 19:07\n
\n

Verification

\n

The calculations have been verified against official data sources and match within ยฑ1-2 minute accuracy depending on the method. See the worked examples in docs/KEMENAG_METHOD.md for detailed verification.

\n

License

\n
Copyright 2025 Rizki Rakasiwi.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n
\n

Documentation

\n\n

Contributing

\n

Contributions are welcome! Please ensure any changes to calculation methods are verified against official data sources.

\n" }, { "fullName": "AdityaZxxx/sheltermark", From a692be868c80559f30f96b7a003487d0d9d9d179 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 09:43:12 +0000 Subject: [PATCH 16/25] Sync content data --- src/data/projects.json | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 71f6703..16c3c12 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -129,7 +129,7 @@ "opensid", "sistem-informasi-desa" ], - "updatedAt": "2026-07-21T17:03:15Z", + "updatedAt": "2026-07-22T07:59:43Z", "pushedAt": "2026-07-18T13:09:40Z", "latestRelease": { "name": "Rilis v2607.0.0", @@ -142,7 +142,7 @@ "createdAt": "2016-05-21T10:55:38Z", "openIssues": 353, "openPullRequests": 7, - "subscribers": 110, + "subscribers": 111, "communityHealth": 50, "readmeHtml": "

Selamat datang di OpenSID! ๐Ÿ‘‹

\"readme-image\"

\n

๐Ÿค” Apa itu OpenSID?

\n

OpenSID adalah Sistem Informasi Desa (SID) yang dikembangkan secara terbuka dan kolaboratif oleh komunitas yang peduli dengan SID.

\n

SID diharapkan dapat membantu pemerintah desa dalam beberapa hal berikut:

\n
    \n
  • Menjadikan kantor desa lebih efisien dan efektif
  • \n
  • Mendorong transparansi dan akuntabilitas pemerintah desa
  • \n
  • Meningkatkan kualitas layanan publik
  • \n
  • Memberikan akses informasi desa yang lebih baik bagi warga
  • \n
\n
\n

OpenSID bertujuan agar sebanyak mungkin desa di Indonesia dapat menerapkan sistem informasi untuk memajukan desa masing-masing..

\n
\n

Strategi pengembangan OpenSID adalah untuk:

\n
    \n
  • Memudahkan pengguna memperoleh SID secara bebas, tanpa birokrasi
  • \n
  • Memudahkan pengguna menyerap rilis SID terbaru
  • \n
  • Memungkinkan pegiat SID berkontribusi langsung pada source code aplikasi SID
  • \n
\n

OpenSID dikelola di GitHub untuk:

\n
    \n
  • Mencatat seluruh perubahan yang dilakukan
  • \n
  • Memungkinkan pengembalian ke revisi sebelumnya jika diperlukan
  • \n
  • Mempermudah kolaborasi antar pegiat SID dan dengan desa-desa pendamping
  • \n
  • Menyediakan backup daring source code SID yang dapat diakses kapan saja
  • \n
\n

๐Ÿ“ƒ PEDOMAN PENGGUNAAN

\n

Panduan pemasangan dan penggunaan OpenSID tersedia di Panduan OpenSID.

\n

๐Ÿ“‘ Distribusi \"VERSI PUBLIK (UMUM)\" dan \"VERSI PREMIUM\":

\n
    \n
  • 'Versi Publik (UMUM)' merupakan perangkat lunak dengan akses terbatas terhadap fitur-fitur 'Versi Premium' selama 6 bulan.
  • \n
  • 'Versi Premium' terus diperbarui berdasarkan umpan balik pengguna, mencakup perbaikan bug mingguan dan rilis fitur bulanan.
  • \n
  • Setiap fitur dan peningkatan yang dirilis dalam 'Versi Premium' juga akan tersedia di 'Versi Publik (UMUM)', namun dengan penundaan selama 6 bulan.
  • \n
  • Beberapa fitur tertentu tidak akan pernah dirilis di 'Versi Publik (UMUM)' dan hanya tersedia secara eksklusif bagi pengguna 'Versi Premium', sesuai kebijakan administrator.
  • \n
\n

๐Ÿ“‘ Hak Cipta dan Lisensi Tambahan:

\n
    \n
  • Pemegang hak cipta memiliki hak eksklusif dalam menentukan dan mengatur perbedaan antara 'Versi Publik (UMUM)' dan 'Versi Premium', termasuk akses fitur dan fungsi.
  • \n
  • Pemegang hak cipta berwenang menetapkan aturan, kebijakan, dan jadwal pembaruan kedua versi tersebut sesuai dengan ketentuan GPL yang berlaku.
  • \n
  • Perbedaan yang ditentukan oleh pemegang hak cipta bersifat final dan mengikat. Fitur eksklusif 'Versi Premium' tidak akan tersedia di 'Versi Publik (UMUM)'.
  • \n
\n

๐Ÿ“‘ HAK CIPTA, SYARAT, DAN KETENTUAN

\n

Sistem Informasi Desa (SID) pertama kali dikembangkan oleh Combine Resource Institution sejak tahun 2009. Hak cipta awal dimiliki oleh Combine Resource Institution (http://lumbungkomunitas.net/).

\n

Sistem ini dikelola berdasarkan lisensi GNU General Public License Versi 3 (http://www.gnu.org/licenses/gpl.html).

\n

Versi GitHub ini dikembangkan sejak Mei 2016, gratis dan bebas dimanfaatkan serta dikembangkan oleh semua desa. Hak Cipta OpenSID kini dipegang oleh Perkumpulan Desa Digital Terbuka (https://opendesa.id), sebuah lembaga hukum yang dibentuk khusus untuk mengelola OpenSID.

\n

๐Ÿ’ป DEMO

\n\n

๐Ÿ’ฌ FORUM

\n

Bergabunglah dengan Forum Pengguna dan Pegiat OpenSID di Facebook atau di Telegram.
Forum ini bersifat informal, sebagai wadah berbagi informasi dan saling membantu dalam menggunakan dan mengembangkan OpenSID.

\n

๐Ÿค KEMBANGKAN BERSAMA

\n

Laporkan masalah, usulan, atau permintaan pengembangan OpenSID melalui issue GitHub.
Kontribusi dari komunitas SID sangat dihargai, baik untuk dokumentasi di Wiki OpenSID maupun untuk source code di repo utama.

\n

๐Ÿ’ฐ DONASI

\n

\"Backers\n\"Sponsors

\n

๐Ÿง‘ Pendukung

\n

Peduli OpenSID dan misi membangun desa? Dukung OpenSID di sini.

\n
\n

Atau donasi langsung melalui rekening bank. Info lengkap di sini.

\n
\n

โญ๏ธ Sponsor

\n

Apakah desa, lembaga, atau perusahaan Anda mendapat manfaat dari OpenSID?
Bantu kami mengembangkan OpenSID dengan menjadi sponsor.
Logo sponsor Anda akan tampil di sini dengan tautan ke situs Anda.

\n

\n

๐Ÿ‘จโ€๐Ÿ’ป KONTRIBUTOR

\n

Berikut adalah para kontributor luar biasa yang telah membantu mengembangkan OpenSID:

\n

\"Contributors\"

\n" }, @@ -352,13 +352,13 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-22T00:42:07Z", - "pushedAt": "2026-07-22T06:29:38Z", + "updatedAt": "2026-07-22T07:01:36Z", + "pushedAt": "2026-07-22T07:01:42Z", "latestRelease": { - "name": "v3.1.5", - "tagName": "v3.1.5", - "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.1.5", - "publishedAt": "2026-07-22T00:42:49Z" + "name": "v3.2.1", + "tagName": "v3.2.1", + "url": "https://github.com/hadziqmtqn/erd-builder-pro/releases/tag/v3.2.1", + "publishedAt": "2026-07-22T07:01:42Z" }, "archived": false, "licenseSpdx": "", @@ -379,7 +379,7 @@ "url": "https://github.com/gnoviawan/termul", "homepage": "https://termul.dev", "language": "TypeScript", - "stars": 164, + "stars": 165, "forks": 34, "topics": [ "cross-platform", @@ -396,8 +396,8 @@ "terminal-emulator", "workspace-manager" ], - "updatedAt": "2026-07-20T13:04:18Z", - "pushedAt": "2026-07-22T06:15:35Z", + "updatedAt": "2026-07-22T08:31:59Z", + "pushedAt": "2026-07-22T08:00:15Z", "latestRelease": { "name": "Termul Manager v0.4.8", "tagName": "v0.4.8", @@ -408,7 +408,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-01-13T04:36:02Z", "openIssues": 39, - "openPullRequests": 13, + "openPullRequests": 12, "subscribers": 0, "communityHealth": 71, "readmeHtml": "

๐Ÿ–ฅ๏ธ Termul Manager

\n

A modern, project-aware terminal manager built with Tauri

\n

Termul treats workspaces as first-class citizens, allowing you to organize terminals by project with persistent sessions, snapshots, and a clean tabbed interface.

\n

\"GitHub\n\"GitHub\n\"License\"\n\"Latest

\n

\"Platform\"\n\"Tauri\"\n\"React\"\n\"TypeScript\"

\n

Getting Started ยท Features ยท Documentation ยท Contributing ยท Report Bug ยท Request Feature

\n

\n

โœจ Features

\n

๐ŸชŸ Workspace & Terminal Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Project-Based WorkspacesOrganize terminals by project with dedicated workspace directories, separate state, and per-project configuration
Pane-Based Split LayoutSplit your workspace into resizable panes and arrange terminals, editors, and browser tabs side by side
Tabbed InterfaceWindows Terminal-style tab bar with drag-and-drop reordering, rename, and context menu
Multiple Shell SupportAuto-detects PowerShell, CMD, Git Bash, WSL, fish, zsh, and more; switch shells per tab
\n

๐Ÿ“ Editor & File Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Code EditorBuilt-in code editor with syntax highlighting, file buffers, dirty-state tracking, and save/reload
Markdown EditorRich markdown editing powered by BlockNote with live preview, table of contents, and heading navigation
Mermaid DiagramsRender Mermaid diagrams inline within your markdown documents
File ExplorerFull file tree with create, rename, delete, clipboard operations, drag-and-drop, and context menus
File WatchingLive file watching for real-time updates as files change on disk
\n

๐ŸŒ Browser & Annotation

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Embedded Browser TabsBrowse the web directly inside your workspace using child webview tabs โ€” no app switching
Annotation WorkflowCapture browser states, annotate with severity and intent labels, review, and export
Annotation ExportPackage annotations with metadata into structured export formats
\n

โšก Power User Tools

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Command PaletteGlobal command launcher (Ctrl+K / Ctrl+Shift+P) for project switching, workspace actions, and more
Command HistoryPer-project and aggregate command history viewer with search
Keyboard ShortcutsFully customizable shortcut bindings for every action
Git IntegrationStatus bar shows current branch, working directory, git status, and exit code
Custom Title BarDesktop-native title bar with window controls, sidebar toggles, and settings navigation
\n

๐Ÿ”ง System & Reliability

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureDescription
Auto-UpdaterBuilt-in update infrastructure with signed artifacts โ€” get notified and update without leaving the app
State ManagementZustand-powered reactive stores for projects, terminals, workspace layout, editor buffers, browser sessions, and settings
Configurable SettingsTerminal and UI preferences, color picker, theme customization, and shell configuration
Cross-PlatformWorks on Windows, macOS, and Linux with native platform packaging
Error BoundariesGraceful error handling with runtime error boundaries and user-friendly fallback UI
\n\n๐Ÿ—บ๏ธ Feature Map โ€” Component Overview\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DomainKey ComponentsZustand Store
WorkspaceWorkspaceLayout, PaneRenderer, PaneContent, WorkspaceTabBarworkspace-store
TerminalConnectedTerminal, XTerminal, TerminalSearchBar, ActivityIndicatorterminal-store
EditorEditorPanel, CodeEditor, MarkdownEditor, EditorToolbar, MermaidBlockeditor-store
BrowserBrowserPanel, BrowserControls, AnnotationPanel, AnnotationExportModalbrowser-session-store, annotation-store
File ExplorerFileExplorer, FileTreeNode, FileTreeContextMenuโ€”
SnapshotsCreateSnapshotModal, RestoreSnapshotModal, DeleteSnapshotModalsnapshot-store
ProjectsProjectSidebar, NewProjectModalproject-store
SettingsShortcutRecorder, ColorPickerPopover, ContextBarSettingsPopoverapp-settings-store, context-bar-settings-store
UpdatesUpdateAvailableToast, UpdateReadyModalupdater-store
SharedCommandPalette, ContextMenu, ConfirmDialog, ShellSelector, ErrorBoundaryโ€”
\n

๐Ÿ“ธ Screenshots

\n

\"Termul

\n

๐Ÿ“ฆ Install

\n

Homebrew (macOS)

\n
brew tap gnoviawan/termul\nbrew install --cask termul\n
\n

curl (macOS/Linux)

\n
curl -fsSL https://raw.githubusercontent.com/gnoviawan/termul/main/scripts/install.sh | bash\n
\n

Windows users should install the .exe or .msi from GitHub Releases. Manual DMG downloads in a browser may still hit Gatekeeper, so macOS users should prefer Homebrew or curl.

\n

๐Ÿš€ Getting Started

\n

Prerequisites

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DependencyVersionNotes
Bun1.3+JavaScript runtime and package manager
RustLatest stableRequired for Tauri builds
\n

Platform-Specific Requirements

\n\nWindows
    \n
  • Microsoft Visual C++ Build Tools (included in Visual Studio 2022)
  • \n
  • WebView2 Runtime (pre-installed on Windows 10+)
  • \n
\n\nmacOS
xcode-select --install\n
\n\nLinux (Debian/Ubuntu)
sudo apt update\nsudo apt install libwebkit2gtk-4.1-dev \\\n    build-essential curl wget file \\\n    libxdo-dev libssl-dev \\\n    libayatana-appindicator3-dev \\\n    librsvg2-dev patchelf\n
\n\nLinux (Fedora)
sudo dnf install webkit2gtk4.1-devel \\\n    gcc gcc-c++ libopenssl-devel \\\n    appindicator-devel librsvg2-devel \\\n    patchelf\n
\n

Install Rust Toolchain

\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nrustc --version && cargo --version\n
\n

Quick Start

\n
# Clone the repository\ngit clone https://github.com/gnoviawan/termul.git\ncd termul\n\n# Install dependencies\nbun install\n\n# Launch in development mode\nbun run dev\n
\n

Landing Page

\n

This repository also includes a standalone Vite landing page under landing/.

\n
# Install landing page dependencies (from landing/)\ncd landing && bun install\n\n# Start the landing page dev server\nbun run landing:dev\n\n# Lint the landing page\nbun run landing:lint\n\n# Build the landing page for production\nbun run landing:build\n
\n

Building for Production

\n
# Build for your current platform\nbun run build\n\n# Platform-specific builds\nbun run build:tauri:win        # Windows (x64)\nbun run build:tauri:mac-arm    # macOS (Apple Silicon)\nbun run build:tauri:mac-x64    # macOS (Intel)\nbun run build:tauri:linux      # Linux (x64)\n\n# Debug build (faster compilation, larger binary)\nbun run build:tauri:debug\n
\n

Build output: src-tauri/target/release/bundle/

\n

๐Ÿ“– Documentation

\n

Usage

\n

Creating a Project

\n
    \n
  1. Click the + button in the sidebar to create a new project
  2. \n
  3. Select a workspace directory
  4. \n
  5. Configure your default shell (optional)
  6. \n
\n

Terminal Tabs

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionHow
New terminalClick + next to tabs
Select specific shellClick the dropdown arrow
Reorder tabsDrag and drop
Rename tabDouble-click the tab
Context menuRight-click (rename, close, kill process)
\n

Keyboard Shortcuts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ActionDefault Shortcut
New TerminalCtrl+T
Next TabCtrl+PageDown
Previous TabCtrl+PageUp
Command PaletteCtrl+K / Ctrl+Shift+P
\n
\n

Shortcuts are customizable in Settings. On Tauri/WebView2, browser-reserved shortcuts such as Ctrl+Tab are not used as defaults because they are not reliably interceptable.

\n
\n

Architecture

\n

Tech Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerTechnology
Desktop RuntimeTauri 2.0
BackendRust
UI FrameworkReact 18
Type SystemTypeScript
Build ToolVite
StylingTailwind CSS + shadcn/ui
State ManagementZustand
Terminal Emulationtauri-pty + xterm.js
AnimationsFramer Motion
\n

Tauri Plugins

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PluginPurpose
@tauri-apps/plugin-fsFilesystem access
@tauri-apps/plugin-storeConfiguration persistence
@tauri-apps/plugin-osOS information
@tauri-apps/plugin-dialogNative dialogs
@tauri-apps/plugin-clipboard-managerClipboard operations
@tauri-apps/plugin-updaterAutomatic updates
@tauri-apps/plugin-processProcess management
\n

Project Structure

\n
src/\nโ”œโ”€โ”€ renderer/           # React frontend\nโ”‚   โ”œโ”€โ”€ components/     # UI components\nโ”‚   โ”œโ”€โ”€ hooks/          # Custom React hooks\nโ”‚   โ”œโ”€โ”€ lib/            # Runtime adapters & desktop integration\nโ”‚   โ”œโ”€โ”€ pages/          # Page components\nโ”‚   โ””โ”€โ”€ stores/         # Zustand stores\nโ”œโ”€โ”€ shared/             # Shared types (main/renderer)\nsrc-tauri/              # Rust backend, config & bundling\ndocs/electron-old/      # Archived Electron docs & migration history\n
\n

Platform Adapters

\n

The renderer uses an adapter/service layer to keep desktop integrations isolated from UI code:

\n
src/renderer/lib/\nโ”œโ”€โ”€ tauri-*.ts        # Tauri-native integrations\nโ”œโ”€โ”€ *.ts              # Runtime-safe facades & helpers\nโ””โ”€โ”€ __tests__/        # Regression & parity coverage\n
\n

๐Ÿ› ๏ธ Development

\n
bun run dev              # Development mode with hot reload\nbun run test             # Run tests\nbun run test:watch       # Tests in watch mode\nbun run typecheck        # Type checking\nbun run lint             # Linting\nbun run tauri <command>  # Direct Tauri CLI access\n
\n

SSH Development Notes

\n
    \n
  • SSH passwords and key passphrases are stored through the OS keychain, not in ssh-profiles.json.
  • \n
  • Active SSH sessions may retain the relevant secret in process memory only to support automatic reconnect; use SSH agent authentication to avoid runtime secret retention.
  • \n
  • Interactive SSH terminals use OpenSSH's default known-hosts file with StrictHostKeyChecking=accept-new; do not override UserKnownHostsFile to /dev/null/NUL because that disables persistent host-key verification.
  • \n
  • Local port forwarding uses ssh2 channel_direct_tcpip over the active SSH session; remote/reverse forwarding is not supported by the MVP command path yet.
  • \n
  • ssh2 intentionally stays on system OpenSSL for now. Enabling vendored-openssl forces a local OpenSSL source build that can fail in Windows/MSYS environments without a complete Perl module setup.
  • \n
\n

โญ Star History

\n

\"Star

\n

๐Ÿค Contributing

\n

Contributions are welcome! Please read the Contributing Guide for details on our code of conduct and the process for submitting pull requests.

\n

๐Ÿ“„ License

\n

This project is licensed under the MIT License โ€” see the LICENSE file for details.

\n

๐Ÿ™ Acknowledgments

\n\n
\n

Built with โค๏ธ by gnoviawan

\n
\n" @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 124, + "stars": 125, "forks": 15, "topics": [ "ai", @@ -490,7 +490,7 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-22T02:35:50Z", + "updatedAt": "2026-07-22T09:23:15Z", "pushedAt": "2026-07-21T23:43:24Z", "latestRelease": { "name": "Release v0.10.0", @@ -657,7 +657,7 @@ "url": "https://github.com/mydisha/keirouter", "homepage": "https://keirouter.app", "language": "Go", - "stars": 89, + "stars": 90, "forks": 32, "topics": [ "ai", @@ -679,7 +679,7 @@ "rtk", "zai" ], - "updatedAt": "2026-07-20T02:21:27Z", + "updatedAt": "2026-07-22T08:00:24Z", "pushedAt": "2026-07-16T08:27:50Z", "latestRelease": { "name": "v0.1.26", @@ -706,7 +706,7 @@ "url": "https://github.com/ddtamn/svelte-audio-ui", "homepage": "https://svelte-audio-ui.vercel.app/", "language": "Svelte", - "stars": 79, + "stars": 78, "forks": 4, "topics": [ "audio", @@ -717,7 +717,7 @@ "svelte-components", "sveltekit" ], - "updatedAt": "2026-07-20T01:33:20Z", + "updatedAt": "2026-07-22T07:23:13Z", "pushedAt": "2026-07-21T07:49:35Z", "latestRelease": { "name": "svelte-audio-ui@1.0.1", @@ -830,7 +830,7 @@ "sveltekit" ], "updatedAt": "2026-07-22T04:44:08Z", - "pushedAt": "2026-07-22T04:44:01Z", + "pushedAt": "2026-07-22T09:18:51Z", "latestRelease": { "name": "Bansos v0.0.13", "tagName": "v0.0.13", @@ -1178,7 +1178,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-04-09T16:08:42Z", - "openIssues": 1, + "openIssues": 0, "openPullRequests": 0, "subscribers": 2, "communityHealth": 42, @@ -1633,8 +1633,8 @@ "windows-app", "windows-desktop" ], - "updatedAt": "2026-07-22T05:11:02Z", - "pushedAt": "2026-07-22T05:10:18Z", + "updatedAt": "2026-07-22T08:11:34Z", + "pushedAt": "2026-07-22T08:09:40Z", "latestRelease": { "name": "v0.4.0", "tagName": "v0.4.0", @@ -1648,7 +1648,7 @@ "openPullRequests": 0, "subscribers": 0, "communityHealth": 75, - "readmeHtml": "

Muslimtify

\n

Muslimtify keeps you consistent with your daily prayers by delivering accurate prayer times and timely desktop notifications. Designed for Linux and Windows, it automatically calculates prayer schedules and reminds you 30, 15, and 5 minutes before the Adhan โ€” or at your own custom intervals โ€” and when it's time to pray. All calculations run locally, requiring no internet connection or external services.

\n

Muslimtify supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag. With persistent configuration and minimal setup, Muslimtify integrates seamlessly into your daily routine without interrupting your workflow.

\n
\n

[!Note]\nPrayer time calculations are powered by libmuslim, a portable library extracted from this project to enable a more flexible and reusable ecosystem for Muslim developers.

\n
\n\n\n\n\n\n\n\n\n\n\n\n
LinuxWindows
\"2026-07-08-202423_hyprshot\"\"Cuplikan
\n
\n

Roadmap

\n
    \n
  • Merge command location auto and method auto into (only) config auto and optimize auto detection per (249) country
  • \n
  • Refactor from timer-driven into a portable long-running loop
  • \n
  • Add custom adzan sound notifications
  • \n
  • Re-design command-line (BREAKING CHANGES)
  • \n
  • Add read lat/long from user GPS
  • \n
  • Add GUI (see branch gui to see a progress)
  • \n
  • Distribute to Flatpak
  • \n
  • MacOS support (if devices is available)
  • \n
  • Wearable Device support
  • \n
  • Embedded Device Support
  • \n
\n
\n
\n

[!Important]\nThis project is available for Linux and Windows users, but not yet for Mac users because we need a Mac device to make Muslimtify run on macOS. We are looking for brothers and sisters who have a Mac and experience in low-level C programming to contribute to the project and help bring Muslimtify to macOS. Alternatively, you can support us via GitHub Sponsors in the sponsor section.

\n
\n

Installation

\n

Prebuilt Binaries (GitHub Releases)

\n

Every release ships ready-to-run binaries for Linux and Windows on the\nReleases page.

\n

Linux (x86_64 or aarch64) โ€” the binaries are dynamically linked, so\ninstall the runtime libraries first, then extract and install:

\n
# Ubuntu/Debian\nsudo apt install libnotify4 libcurl4\n# Fedora/RHEL\nsudo dnf install libnotify libcurl\n# Arch\nsudo pacman -S libnotify curl\n\ntar xzf muslimtify-<version>-linux-<arch>.tar.gz\nsudo cp -r muslimtify-<version>-linux-<arch>/{bin,lib,share} /usr/local/\nmuslimtify daemon install\n
\n

Windows (x64 or arm64) โ€” download and run the matching installer:

\n
muslimtify-<version>-setup-x64.exe      # Intel/AMD\nmuslimtify-<version>-setup-arm64.exe    # ARM\n
\n

Verify any download against the published checksums:

\n
sha256sum -c SHA256SUMS\n
\n

Arch Linux (AUR)

\n
yay -S muslimtify\n
\n

Fedora (COPR)

\n
sudo dnf copr enable rizukirr/muslimtify\nsudo dnf install muslimtify\n
\n

Debian/Ubuntu (PPA)

\n
sudo add-apt-repository ppa:rizukirr/muslimtify\nsudo apt update\nsudo apt install muslimtify\n
\n

Linux Source Install

\n

Install dependencies:

\n
# Ubuntu/Debian\nsudo apt install git build-essential cmake pkg-config libnotify-dev libcurl4-openssl-dev\n\n# Fedora/RHEL\nsudo dnf install git gcc cmake pkgconfig libnotify-devel libcurl-devel\n\n# Arch Linux\nsudo pacman -S git base-devel cmake pkgconfig libnotify curl\n
\n

Clone, install, and enable background checks:

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\nsudo ./install.sh\nmuslimtify daemon install\n
\n

Windows (winget)

\n
winget install muslimtify\n
\n

Windows Source Install

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\n.\\install.ps1\nmuslimtify daemon install\n
\n

To remove the Windows install later, run .\\uninstall.ps1.

\n

If you prefer building manually first:

\n
cmake -S . -B build\ncmake --build build --config Release\ncmake --install build --config Release\nmuslimtify daemon install\n
\n

Post Installation

\n

Run muslimtify daemon status to check if Muslimtify is registered with systemd. If no status is found, run muslimtify daemon install to register the service and ensure it runs as expected.

\n

Muslimtify automatically selects the standard prayer time calculation method based on your country and location. Run muslimtify to verify that your configuration is correct. If the automatic selection does not meet your needs, you can set it manually using muslimtify method <key-method>. A full list of available methods is documented here.

\n

Configuration

\n

Muslimtify can be configured with CLI commands or by editing config.json\nmanually.

\n

Config paths:

\n
    \n
  • Linux config: ~/.config/muslimtify/config.json
  • \n
  • Linux cache: ~/.cache/muslimtify
  • \n
  • Windows config: %APPDATA%\\muslimtify\\config.json
  • \n
  • Windows cache: %LOCALAPPDATA%\\muslimtify
  • \n
\n

Common setup commands:

\n
muslimtify location set --auto                  # detect location from IP\nmuslimtify location set --auto --city=Mansoura  # auto-detect but use your own city label\nmuslimtify method --auto                        # select method from the detected country\nmuslimtify location set --lat=-6.175 --long=106.82  # set location manually (uses system timezone)\nmuslimtify location set --timezone=Asia/Jakarta     # override timezone\nmuslimtify location set --city=Jakarta              # add a city label\nmuslimtify location set --refresh-interval=21600    # re-check location every 6h (0=off, min 3600)\nmuslimtify method --list          # list all available calculation methods\nmuslimtify method mwl             # set calculation method\nmuslimtify madzhab hanafi         # set madzhab (shafi/hanafi)\nmuslimtify notification --reminder --all 30 15 5    # set every prayer's reminders (minutes before adhan)\nmuslimtify notification --reminder fajr 30 15 5     # set reminders for a single prayer\nmuslimtify notification           # show current notification settings\nmuslimtify location               # show current location\n
\n

Resetting the configuration is done by deleting config.json. Muslimtify falls\nback to built-in defaults when the file is missing, and rewrites it the next\ntime you change a setting. Validation runs automatically every time the config\nis loaded.

\n

Calculation Methods

\n

Muslimtify supports the following calculation methods:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by setting \"method\": \"custom\" in config.json with your own fajr_angle and isha_angle values.

\n

Manual JSON editing is useful when you want precise control over enabled\nprayers, reminder offsets, notification settings, or location data.

\n\nDefault config.json
{\n  \"location\": {\n    \"latitude\": 0.0,\n    \"longitude\": 0.0,\n    \"timezone\": \"UTC\",\n    \"timezone_offset\": 0.0,\n    \"auto_detect\": true,\n    \"city\": \"\",\n    \"country\": \"\"\n  },\n  \"prayers\": {\n    \"fajr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"sunrise\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuha\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuhr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"asr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"maghrib\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"isha\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    }\n  },\n  \"notification\": {\n    \"timeout\": 5000,\n    \"urgency\": \"critical\",\n    \"sound\": \"adhan\",\n    \"sound_alarm\": \"alarm\",\n    \"sound_reminder\": \"reminder\",\n    \"icon\": \"muslimtify\"\n  },\n  \"calculation\": {\n    \"method\": \"kemenag\",\n    \"madhab\": \"shafi\"\n  }\n}\n
\n

Troubleshooting

\n

Notifications are not appearing

\n
    \n
  • Run muslimtify daemon status to confirm the background service is running.
  • \n
  • On Linux, verify desktop notifications work with notify-send \"Test\" \"Hello\".
  • \n
  • On Windows, local system settings can block toast delivery. Check\nnotification settings, Focus Assist / Do Not Disturb, and whether the command\nis running in an interactive desktop session.
  • \n
\n

Location detection is not working

\n
    \n
  • Run muslimtify location set --auto again.
  • \n
  • Set coordinates manually with muslimtify location set --lat=<latitude> --long=<longitude>.\nIf the host machine is in a different region than the coordinates, override\nthe timezone with --timezone=<iana>, e.g.\nmuslimtify location set --lat=-6.21 --long=106.84 --timezone=Asia/Jakarta.
  • \n
  • Check network access to ipinfo.io if auto detection keeps failing.
  • \n
\n

Contributing

\n

Contributions are welcome. See CONTRIBUTING.md for workflow,\nstyle, and testing guidance.

\n

License

\n

Muslimtify is released under the MIT License. See the repository license files\nfor details.

\n

Support

\n\n" + "readmeHtml": "

Muslimtify

\n

Muslimtify keeps you consistent with your daily prayers by delivering accurate prayer times and timely desktop notifications. Designed for Linux and Windows, it automatically calculates prayer schedules and reminds you 30, 15, and 5 minutes before the Adhan, or at your own custom intervals, and when it's time to pray. Every prayer time is calculated locally on your machine, with no accounts and no tracking. The only thing that touches the network is location detection via ipinfo.io, and even that is optional: set your coordinates manually, or read them from a GPS receiver with location gps on, and Muslimtify makes no network request at all.

\n

Muslimtify supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag. With persistent configuration and minimal setup, Muslimtify integrates seamlessly into your daily routine without interrupting your workflow.

\n
\n

[!Note]\nPrayer time calculations are powered by libmuslim, a portable library extracted from this project to enable a more flexible and reusable ecosystem for Muslim developers.

\n
\n\n\n\n\n\n\n\n\n\n\n\n
LinuxWindows
\"2026-07-08-202423_hyprshot\"\"Cuplikan
\n
\n

Roadmap

\n
    \n
  • Merge command location auto and method auto into (only) config auto and optimize auto detection per (249) country
  • \n
  • Refactor from timer-driven into a portable long-running loop
  • \n
  • Add custom adzan sound notifications
  • \n
  • Re-design command-line (BREAKING CHANGES)
  • \n
  • Add read lat/long from user GPS
  • \n
  • Add GUI (see branch gui to see a progress)
  • \n
  • Distribute to Flatpak
  • \n
  • MacOS support (if devices is available)
  • \n
  • Wearable Device support
  • \n
  • Embedded Device Support
  • \n
\n
\n
\n

[!Important]\nThis project is available for Linux and Windows users, but not yet for Mac users because we need a Mac device to make Muslimtify run on macOS. We are looking for brothers and sisters who have a Mac and experience in low-level C programming to contribute to the project and help bring Muslimtify to macOS. Alternatively, you can support us via GitHub Sponsors in the sponsor section.

\n
\n

Installation

\n

Prebuilt Binaries (GitHub Releases)

\n

Every release ships ready-to-run binaries for Linux and Windows on the\nReleases page.

\n

Linux (x86_64 or aarch64): the binaries are dynamically linked, so\ninstall the runtime libraries first, then extract and install:

\n
# Ubuntu/Debian\nsudo apt install libnotify4 libcurl4\n# Fedora/RHEL\nsudo dnf install libnotify libcurl\n# Arch\nsudo pacman -S libnotify curl\n\ntar xzf muslimtify-<version>-linux-<arch>.tar.gz\nsudo cp -r muslimtify-<version>-linux-<arch>/{bin,lib,share} /usr/local/\nmuslimtify daemon install\n
\n

Windows (x64 or arm64): download and run the matching installer:

\n
muslimtify-<version>-setup-x64.exe      # Intel/AMD\nmuslimtify-<version>-setup-arm64.exe    # ARM\n
\n

Verify any download against the published checksums:

\n
sha256sum -c SHA256SUMS\n
\n

Arch Linux (AUR)

\n
yay -S muslimtify\n
\n

Fedora (COPR)

\n
sudo dnf copr enable rizukirr/muslimtify\nsudo dnf install muslimtify\n
\n

Debian/Ubuntu (PPA)

\n
sudo add-apt-repository ppa:rizukirr/muslimtify\nsudo apt update\nsudo apt install muslimtify\n
\n

Linux Source Install

\n

Install dependencies:

\n
# Ubuntu/Debian\nsudo apt install git build-essential cmake pkg-config libnotify-dev libcurl4-openssl-dev\n\n# Fedora/RHEL\nsudo dnf install git gcc cmake pkgconfig libnotify-devel libcurl-devel\n\n# Arch Linux\nsudo pacman -S git base-devel cmake pkgconfig libnotify curl\n
\n

GPS is optional and needs nothing at build time. Install gpsd only if you want\nMuslimtify to read coordinates from a local receiver:

\n
# Ubuntu/Debian\nsudo apt install gpsd\n# Fedora/RHEL\nsudo dnf install gpsd\n# Arch Linux\nsudo pacman -S gpsd\n
\n

Clone, install, and enable background checks:

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\nsudo ./install.sh\nmuslimtify daemon install\n
\n

install.sh compiles as the user who invoked sudo rather than as root, and\nrefuses to build from a source tree that is group- or world-writable, since\nanything planted there would otherwise run with root privileges. If it reports\nunsafe permissions, fix the listed paths so each is owned by root or by you and\nis not writable by others, then re-run.

\n

Windows (winget)

\n
winget install muslimtify\n
\n

Windows Source Install

\n

Building on Windows requires MSVC. The build stops with an explicit message if\nanother compiler is used.

\n
git clone https://github.com/rizukirr/muslimtify.git\ncd muslimtify\n.\\install.ps1\nmuslimtify daemon install\n
\n

To remove the Windows install later, run .\\uninstall.ps1.

\n

If you prefer building manually first:

\n
cmake -S . -B build\ncmake --build build --config Release\ncmake --install build --config Release\nmuslimtify daemon install\n
\n

Post Installation

\n

Run muslimtify daemon status to check if Muslimtify is registered with systemd. If no status is found, run muslimtify daemon install to register the service and ensure it runs as expected.

\n

Muslimtify automatically selects the standard prayer time calculation method based on your country and location. Run muslimtify to verify that your configuration is correct. If the automatic selection does not meet your needs, you can set it manually using muslimtify method <key-method>. A full list of available methods is documented here.

\n

Configuration

\n

Muslimtify can be configured with CLI commands or by editing config.json\nmanually.

\n

Config paths:

\n
    \n
  • Linux config: ~/.config/muslimtify/config.json
  • \n
  • Linux cache: ~/.cache/muslimtify
  • \n
  • Windows config: %APPDATA%\\muslimtify\\config.json
  • \n
  • Windows cache: %LOCALAPPDATA%\\muslimtify
  • \n
\n

Common setup commands:

\n
muslimtify location set --auto                  # detect location from IP\nmuslimtify location set --auto --city=Mansoura  # auto-detect but use your own city label\nmuslimtify method --auto                        # select method from the detected country\nmuslimtify location set --lat=-6.175 --long=106.82  # set location manually (uses system timezone)\nmuslimtify location set --timezone=Asia/Jakarta     # override timezone\nmuslimtify location set --city=Jakarta              # add a city label\nmuslimtify location set --refresh-interval=21600    # re-check location every 6h (0=off, min 3600)\nmuslimtify location gps on        # read coordinates from a local GPS receiver\nmuslimtify location gps off       # go back to ipinfo network geolocation\nmuslimtify location gps           # show whether GPS is enabled\nmuslimtify method --list          # list all available calculation methods\nmuslimtify method mwl             # set calculation method\nmuslimtify madzhab hanafi         # set madzhab (shafi/hanafi)\nmuslimtify notification --reminder --all 30 15 5    # set every prayer's reminders (minutes before adhan)\nmuslimtify notification --reminder fajr 30 15 5     # set reminders for a single prayer\nmuslimtify notification           # show current notification settings\nmuslimtify location               # show current location\n
\n

GPS is off by default and maps to a single use_gps key in the location block\nof config.json. On Linux the coordinates come from a running gpsd, read over\na local socket on 127.0.0.1:2947, with no libgps build dependency. On Windows\nthey come from the WinRT Geolocator, which needs location access enabled in\nSettings. location gps on probes the receiver first and refuses to enable if\nnone is reachable, so a missing daemon fails immediately rather than degrading\nsilently later. Whenever GPS has no fix, ipinfo.io is used instead. GPS\nsupplies coordinates only, so the timezone is still taken from the host system.

\n

The timezone itself is validated when you set it. A name the system cannot\nresolve is rejected outright rather than saved and silently treated as UTC, and\nthe offset used to compute prayer times is derived from the IANA name for the\ndate being calculated, so daylight saving is handled automatically.

\n

Resetting the configuration is done by deleting config.json. Muslimtify falls\nback to built-in defaults when the file is missing, and rewrites it the next\ntime you change a setting. Validation runs automatically every time the config\nis loaded.

\n

Calculation Methods

\n

Muslimtify supports the following calculation methods:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyMethodRegion
mwlMuslim World LeagueEurope, Far East
makkahUmm al-Qura, MakkahArabian Peninsula
isnaISNANorth America
egyptEgyptian General AuthorityAfrica, Middle East
karachiUniv. Islamic Sciences, KarachiPakistan, India, Bangladesh
turkeyDiyanet, TurkeyTurkey
singaporeMUIS, SingaporeSingapore
jakimJAKIM, MalaysiaMalaysia
kemenagKEMENAG, IndonesiaIndonesia (default)
franceUOIF, FranceFrance
russiaSpiritual Admin., RussiaRussia
dubaiGAIAE, DubaiUAE
qatarMin. of Awqaf, QatarQatar
kuwaitMin. of Awqaf, KuwaitKuwait
jordanMin. of Awqaf, JordanJordan
gulfGulf RegionGulf states
tunisiaMin. of Religious AffairsTunisia
algeriaMin. of Religious AffairsAlgeria
moroccoMin. of Habous, MoroccoMorocco
portugalComunidade Islamica de LisboaPortugal
moonsightingMoonsighting CommitteeWorldwide
\n

You can also use a custom method by setting \"method\": \"custom\" in config.json with your own fajr_angle and isha_angle values.

\n

Manual JSON editing is useful when you want precise control over enabled\nprayers, reminder offsets, notification settings, or location data.

\n\nDefault config.json
{\n  \"location\": {\n    \"latitude\": 0.0,\n    \"longitude\": 0.0,\n    \"timezone\": \"UTC\",\n    \"timezone_offset\": 0.0,\n    \"auto_detect\": true,\n    \"city\": \"\",\n    \"country\": \"\"\n  },\n  \"prayers\": {\n    \"fajr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"sunrise\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuha\": {\n      \"enabled\": false,\n      \"adhan\": \"\",\n      \"adhan_enabled\": false,\n      \"reminders\": [],\n      \"offset\": 0\n    },\n    \"dhuhr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"asr\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"maghrib\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    },\n    \"isha\": {\n      \"enabled\": true,\n      \"adhan\": \"\",\n      \"adhan_enabled\": true,\n      \"reminders\": [30, 15, 5],\n      \"offset\": 0\n    }\n  },\n  \"notification\": {\n    \"timeout\": 5000,\n    \"urgency\": \"critical\",\n    \"sound\": \"adhan\",\n    \"sound_alarm\": \"alarm\",\n    \"sound_reminder\": \"reminder\",\n    \"icon\": \"muslimtify\"\n  },\n  \"calculation\": {\n    \"method\": \"kemenag\",\n    \"madhab\": \"shafi\"\n  }\n}\n
\n

Troubleshooting

\n

Notifications are not appearing

\n
    \n
  • Run muslimtify daemon status to confirm the background service is running.
  • \n
  • On Linux, verify desktop notifications work with notify-send \"Test\" \"Hello\".
  • \n
  • On Windows, local system settings can block toast delivery. Check\nnotification settings, Focus Assist / Do Not Disturb, and whether the command\nis running in an interactive desktop session.
  • \n
\n

Location detection is not working

\n
    \n
  • Run muslimtify location set --auto again.
  • \n
  • Set coordinates manually with muslimtify location set --lat=<latitude> --long=<longitude>.\nIf the host machine is in a different region than the coordinates, override\nthe timezone with --timezone=<iana>, e.g.\nmuslimtify location set --lat=-6.21 --long=106.84 --timezone=Asia/Jakarta.
  • \n
  • Check network access to ipinfo.io if auto detection keeps failing.
  • \n
\n

GPS will not turn on

\n

muslimtify location gps on probes the receiver before saving, so it refuses\nrather than enabling something that cannot work. The message names the missing\npiece:

\n
    \n
  • cannot reach gpsd: install and start gpsd. Muslimtify reads it over a local\nsocket on 127.0.0.1:2947.
  • \n
  • no GPS device detected: gpsd is running but sees no hardware. Connect the\nreceiver and confirm gpsd picked it up.
  • \n
  • location access is turned off: on Windows, enable Settings > Privacy &\nsecurity > Location, then try again.
  • \n
\n

Being told GPS is enabled with no fix yet is not an error. The setting is saved\nand ipinfo.io is used until the receiver locks on. If the daemon or device\nlater disappears, Muslimtify warns once and turns GPS off so it stops retrying\non every cycle. A denied permission does not turn it off, because granting\naccess in Settings is enough for the next attempt to succeed.

\n

Muslimtify rejects my timezone

\n

The name must resolve on this system, so check the spelling against the IANA\ndatabase, for example Asia/Jakarta or Europe/London. Zones that legitimately\nsit at UTC+0, such as Africa/Abidjan, are accepted.

\n

Prayer times are off by an hour

\n

This is almost always daylight saving, which is handled automatically only when\na valid IANA zone is saved. Run muslimtify location and check the timezone\nfield. The gmt field shows the offset in effect today rather than the one\nrecorded when you last set your location. If the zone is wrong or empty, set it\nwith muslimtify location set --timezone=<iana>.

\n

A notification did not fire while the machine was asleep

\n

Triggers missed within the previous 15 minutes still fire when the daemon\ncatches up. Anything older is dropped without firing, so resuming from a long\nsuspend does not replay a stack of stale Adhans.

\n

Contributing

\n

Contributions are welcome. See CONTRIBUTING.md for workflow,\nstyle, and testing guidance.

\n

License

\n

Muslimtify is released under the MIT License. See the repository license files\nfor details.

\n

Support

\n\n" }, { "fullName": "rizukirr/numc", From b48aa9b8f97acd473870777986a37c8bfc2df67b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:08:07 +0000 Subject: [PATCH 17/25] Sync content data --- src/data/projects.json | 48 +++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 16c3c12..7a2428a 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 898, - "forks": 278, + "stars": 899, + "forks": 279, "topics": [], - "updatedAt": "2026-07-21T07:50:22Z", + "updatedAt": "2026-07-22T11:22:16Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -171,7 +171,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-01-15T09:55:34Z", "openIssues": 6, - "openPullRequests": 0, + "openPullRequests": 1, "subscribers": 15, "communityHealth": 57, "readmeHtml": "

YT-Short-Clipper

\n

\"Discord\"\n\"GitHub\n\"License\"\n\"Platform\"

\n

๐ŸŽฌ Automated YouTube to Short-Form Content Pipeline

\n

Transform long-form YouTube videos (podcasts, interviews, vlogs) into engaging short-form content for TikTok, Instagram Reels, and YouTube Shorts โ€” powered by AI.

\n
\n

๐Ÿš€ Getting Started

\n

For Users (Non-Technical)

\n

Download the desktop app for your platform:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PlatformDownloadNotes
WindowsLatest Release (.exe)Windows 10+
macOSLatest Release (.dmg)macOS Catalina+, Apple Silicon & Intel
\n

Then follow the complete setup guide:

\n\n

What you'll learn:

\n
    \n
  1. How to download and run the app
  2. \n
  3. Setup required libraries (yt-dlp, FFmpeg, Deno)
  4. \n
  5. Setup YouTube cookies for video access
  6. \n
  7. Configure AI API (multiple providers supported)
  8. \n
  9. Start processing videos
  10. \n
\n

For Developers

\n

If you want to contribute or run from source:

\n
    \n
  1. See Installation below for development setup
  2. \n
  3. See Contributing for contribution guidelines
  4. \n
  5. See Building from Source for packaging the app
  6. \n
\n

โœจ Features

\n
    \n
  • ๐ŸŽฅ Auto Download - Downloads YouTube videos with subtitles using yt-dlp
  • \n
  • ๐Ÿ” AI Highlight Detection - Uses GPT-4 to identify the most engaging segments (60-120 seconds)
  • \n
  • โœ‚๏ธ Smart Clipping - Automatically cuts video at optimal timestamps
  • \n
  • ๐Ÿ“ฑ Portrait Conversion - Converts landscape (16:9) to portrait (9:16) with intelligent speaker tracking
  • \n
  • ๐ŸŽฏ Face Detection - Two modes available:
      \n
    • OpenCV (Fast) - Crops to largest face, faster processing
    • \n
    • MediaPipe (Smart) - Tracks active speaker via lip movement detection, more accurate but 2-3x slower
    • \n
    \n
  • \n
  • ๐Ÿช Hook Generation - Creates attention-grabbing intro scenes with AI-generated text and TTS voiceover
  • \n
  • ๐Ÿ“ Auto Captions - Adds CapCut-style word-by-word highlighted captions using Whisper
  • \n
  • ๐Ÿ–ผ๏ธ Watermark Support - Add custom watermark with adjustable position, size, and opacity
  • \n
  • ๐Ÿ“Š SEO Metadata - Generates optimized titles and descriptions for each clip
  • \n
  • ๐Ÿ–ฅ๏ธ Cross-Platform - Runs on Windows and macOS (Apple Silicon + Intel)
  • \n
  • โšก GPU Acceleration - NVENC (NVIDIA), AMF (AMD), QSV (Intel), VideoToolbox (macOS)
  • \n
\n

๐Ÿ—๏ธ Architecture

\n
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”\nโ”‚                        YT-Short-Clipper                         โ”‚\nโ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\nโ”‚                                                                 โ”‚\nโ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚\nโ”‚  โ”‚ YouTube  โ”‚โ”€โ”€โ”€โ–ถโ”‚  Downloader  โ”‚โ”€โ”€โ”€โ–ถโ”‚  Subtitle   โ”‚           โ”‚\nโ”‚  โ”‚   URL    โ”‚    โ”‚   (yt-dlp)   โ”‚    โ”‚   Parser    โ”‚           โ”‚\nโ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚\nโ”‚                                              โ”‚                  โ”‚\nโ”‚                                              โ–ผ                  โ”‚\nโ”‚                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚\nโ”‚                                    โ”‚ Highlight Finder โ”‚         โ”‚\nโ”‚                                    โ”‚    (GPT-4)       โ”‚         โ”‚\nโ”‚                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚\nโ”‚                                              โ”‚                  โ”‚\nโ”‚                                              โ–ผ                  โ”‚\nโ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚\nโ”‚  โ”‚                    Video Processing                       โ”‚  โ”‚\nโ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚\nโ”‚  โ”‚  โ”‚   Clipper  โ”‚โ”€โ–ถโ”‚  Portrait  โ”‚โ”€โ–ถโ”‚  Hook Generator    โ”‚  โ”‚  โ”‚\nโ”‚  โ”‚  โ”‚  (FFmpeg)  โ”‚  โ”‚ Converter  โ”‚  โ”‚  (TTS + Overlay)   โ”‚  โ”‚  โ”‚\nโ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚ OpenCV /   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ”‚\nโ”‚  โ”‚                   โ”‚ MediaPipe  โ”‚             โ”‚            โ”‚  โ”‚\nโ”‚  โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ–ผ            โ”‚  โ”‚\nโ”‚  โ”‚                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚  โ”‚\nโ”‚  โ”‚                                    โ”‚Caption Generatorโ”‚    โ”‚  โ”‚\nโ”‚  โ”‚                                    โ”‚   (Whisper)     โ”‚    โ”‚  โ”‚\nโ”‚  โ”‚                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚  โ”‚\nโ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚\nโ”‚                                              โ”‚                  โ”‚\nโ”‚                                              โ–ผ                  โ”‚\nโ”‚                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚\nโ”‚                                    โ”‚  Output Clips   โ”‚         โ”‚\nโ”‚                                    โ”‚  + Metadata      โ”‚         โ”‚\nโ”‚                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚\nโ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\n
\n
\n

๐Ÿ“‹ Requirements (For Development)

\n

System Dependencies

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DependencyVersionPurpose
Python3.10+Runtime
FFmpeg4.4+Video processing
yt-dlpLatestYouTube downloading
Deno2.xRequired by yt-dlp for some extractors
\n

Python Dependencies

\n

See requirements.txt for the full list. Key dependencies:

\n
customtkinter>=5.2.0\nopenai>=1.0.0\nopencv-python>=4.8.0\nnumpy>=1.24.0\nPillow>=10.0.0\nmediapipe>=0.10.0\nrequests>=2.31.0\nyt-dlp>=2026.3.17\ngoogle-generativeai>=0.7.0\ngoogle-api-python-client>=2.100.0\ngoogle-auth-oauthlib>=1.1.0\n
\n
\n

Note: The app uses OpenAI Whisper API instead of local Whisper model.

\n
\n

API Keys

\n

The app supports 10+ AI providers including:

\n
    \n
  • YT Clip AI (Recommended) - https://ai.ytclip.org
  • \n
  • OpenAI - GPT-4, Whisper, TTS
  • \n
  • Google Gemini - Free tier available
  • \n
  • Groq - Fastest + free
  • \n
  • Anthropic Claude - High quality
  • \n
  • And more...
  • \n
\n

See GUIDE.md or PANDUAN.md for detailed API setup instructions.

\n
\n

๐Ÿš€ Installation (For Development)

\n
\n

Note: This section is for developers who want to run the app from source code. If you're a regular user, please follow the User Guide or Panduan Indonesia instead.

\n
\n

1. Clone the Repository

\n
git clone https://github.com/jipraks/yt-short-clipper.git\ncd yt-short-clipper\n
\n

2. Install System Dependencies

\n

Windows (using Chocolatey):

\n
choco install ffmpeg yt-dlp\n
\n

macOS (using Homebrew):

\n
brew install ffmpeg yt-dlp\n
\n

Ubuntu/Debian:

\n
sudo apt update\nsudo apt install ffmpeg\npip install yt-dlp\n
\n

3. Install Python Dependencies

\n
pip install -r requirements.txt\n
\n

4. Run the App

\n
python app.py\n
\n

The app will create a config.json file on first run where you can save your AI API keys and other settings.

\n
\n

๐Ÿ“ Project Structure

\n
yt-short-clipper/\nโ”œโ”€โ”€ app.py                      # Main GUI application (entry point)\nโ”œโ”€โ”€ clipper_core.py             # Core processing logic (download, AI, video)\nโ”œโ”€โ”€ version.py                  # Version info and update URL\nโ”œโ”€โ”€ youtube_uploader.py         # YouTube upload functionality\nโ”œโ”€โ”€ tiktok_uploader.py          # TikTok upload functionality\nโ”œโ”€โ”€ requirements.txt            # Python dependencies\nโ”œโ”€โ”€ build.spec                  # PyInstaller build config (Windows)\nโ”œโ”€โ”€ build_macos.spec            # PyInstaller build config (macOS)\nโ”œโ”€โ”€ build_web.spec              # PyInstaller build config (Web version)\nโ”œโ”€โ”€ components/                 # Reusable UI widgets\nโ”‚   โ”œโ”€โ”€ ai_provider_card.py     # AI provider configuration card\nโ”‚   โ”œโ”€โ”€ page_layout.py          # Page layout components\nโ”‚   โ””โ”€โ”€ progress_step.py        # Progress step indicator\nโ”œโ”€โ”€ config/                     # Configuration management\nโ”‚   โ”œโ”€โ”€ ai_provider_config.py   # AI provider definitions\nโ”‚   โ””โ”€โ”€ config_manager.py       # Config file read/write\nโ”œโ”€โ”€ dialogs/                    # Modal dialogs\nโ”‚   โ”œโ”€โ”€ model_selector.py       # AI model search/select dialog\nโ”‚   โ”œโ”€โ”€ repliz_upload.py        # Repliz upload dialog\nโ”‚   โ”œโ”€โ”€ terms_of_service.py     # ToS dialog\nโ”‚   โ”œโ”€โ”€ tiktok_upload.py        # TikTok upload dialog\nโ”‚   โ””โ”€โ”€ youtube_upload.py       # YouTube upload dialog\nโ”œโ”€โ”€ pages/                      # GUI pages\nโ”‚   โ”œโ”€โ”€ browse_page.py          # Browse output clips\nโ”‚   โ”œโ”€โ”€ clipping_page.py        # Clipping progress\nโ”‚   โ”œโ”€โ”€ contact_page.py         # Contact/feedback\nโ”‚   โ”œโ”€โ”€ highlight_selection_page.py  # Select highlights to process\nโ”‚   โ”œโ”€โ”€ processing_page.py      # Processing progress\nโ”‚   โ”œโ”€โ”€ results_page.py         # Results display\nโ”‚   โ”œโ”€โ”€ session_browser_page.py # Browse previous sessions\nโ”‚   โ”œโ”€โ”€ settings_page.py        # Settings hub\nโ”‚   โ”œโ”€โ”€ status_pages.py         # API & Library status pages\nโ”‚   โ””โ”€โ”€ settings/               # Settings sub-pages\nโ”‚       โ”œโ”€โ”€ ai_api_settings.py  # AI API configuration\nโ”‚       โ”œโ”€โ”€ ai_providers/       # Per-provider settings\nโ”‚       โ”œโ”€โ”€ output_settings.py  # Output directory settings\nโ”‚       โ”œโ”€โ”€ performance_settings.py  # GPU & performance\nโ”‚       โ”œโ”€โ”€ watermark_settings.py    # Watermark configuration\nโ”‚       โ””โ”€โ”€ ...\nโ”œโ”€โ”€ utils/                      # Utility modules\nโ”‚   โ”œโ”€โ”€ dependency_manager.py   # Auto-download FFmpeg, Deno\nโ”‚   โ”œโ”€โ”€ gpu_detector.py         # GPU detection & encoder selection\nโ”‚   โ”œโ”€โ”€ helpers.py              # Path helpers, platform detection\nโ”‚   โ””โ”€โ”€ logger.py               # Logging utilities\nโ”œโ”€โ”€ assets/                     # App icons and images\nโ”‚   โ”œโ”€โ”€ icon.png                # App icon (PNG)\nโ”‚   โ”œโ”€โ”€ icon.ico                # App icon (Windows)\nโ”‚   โ””โ”€โ”€ icon.icns               # App icon (macOS)\nโ””โ”€โ”€ web/                        # Web UI (experimental)\n    โ”œโ”€โ”€ index.html\n    โ”œโ”€โ”€ app.js\n    โ”œโ”€โ”€ css/\n    โ””โ”€โ”€ components/\n
\n

Output Structure

\n
output/\nโ””โ”€โ”€ 20240115-143001/            # Session folder (timestamp-based)\n    โ”œโ”€โ”€ master.mp4              # Final clip\n    โ””โ”€โ”€ data.json               # Metadata\n
\n

data.json Structure

\n

Each clip folder contains a data.json file with metadata:

\n
{\n  \"title\": \"๐Ÿ”ฅ Momen Kocak Saat Pembully Datang Minta Maaf\",\n  \"hook_text\": \"Mantan pembully TIARA datang ke rumah minta endorse salad buah\",\n  \"start_time\": \"00:15:23,000\",\n  \"end_time\": \"00:17:05,000\",\n  \"duration_seconds\": 102.0,\n  \"has_hook\": true,\n  \"has_captions\": true,\n  \"youtube_title\": \"๐Ÿ”ฅ Momen Kocak Saat Pembully Datang Minta Maaf\",\n  \"youtube_description\": \"Siapa sangka mantan pembully malah datang minta endorse! ๐Ÿ˜‚ #podcast #viral #fyp\",\n  \"youtube_tags\": [\"shorts\", \"viral\", \"podcast\"]\n}\n
\n
\n

โš™๏ธ Configuration

\n

All settings can be configured through the GUI Settings page (โš™๏ธ button in the app).

\n

For complete setup instructions with screenshots, see:

\n\n

Highlight Detection Parameters

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParameterDefaultDescription
num_clips5Number of clips to generate
min_duration60sMinimum clip duration
max_duration120sMaximum clip duration
target_duration90sIdeal clip duration
temperature1.0AI creativity (0.0-2.0)
\n

Portrait Conversion Parameters

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParameterDefaultDescription
output_resolution1080x1920Output video resolution
min_frames_before_switch210Frames before speaker switch (~7s at 30fps)
switch_threshold3.0Movement multiplier to trigger switch
\n

Caption Parameters

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParameterDefaultDescription
languageidTranscription language
chunk_size4Words per caption line
\n

Hook Generation Parameters

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ParameterDefaultDescription
tts_voicenovaOpenAI TTS voice (nova/shimmer/alloy)
tts_speed1.0Speech speed
max_words15Maximum words in hook text
tts_modeltts-1TTS model (tts-1 or tts-1-hd)
\n
\n

๐Ÿ”ง How It Works

\n

1. Video Download

\n
    \n
  • Uses yt-dlp to download video in best quality (max 1080p)
  • \n
  • Automatically fetches auto-generated subtitles
  • \n
  • Extracts video metadata (title, description, channel)
  • \n
\n

2. Highlight Detection

\n
    \n
  • Parses SRT subtitle file with timestamps
  • \n
  • Sends transcript to GPT-4 with specific criteria:
      \n
    • Punchlines and funny moments
    • \n
    • Interesting insights
    • \n
    • Emotional/dramatic moments
    • \n
    • Memorable quotes
    • \n
    • Complete story arcs
    • \n
    \n
  • \n
  • Validates duration (60-120 seconds)
  • \n
  • Generates hook text for each highlight
  • \n
\n

3. Portrait Conversion

\n
    \n
  • OpenCV mode: Uses Haar Cascade for face detection, crops to largest face
  • \n
  • MediaPipe mode: Tracks lip movement to identify active speaker
  • \n
  • Implements \"camera cut\" style switching (not smooth panning)
  • \n
  • Stabilizes crop position within each \"shot\"
  • \n
  • Maintains 9:16 aspect ratio at 1080x1920
  • \n
\n

4. Hook Generation

\n
    \n
  • Extracts first frame from clip
  • \n
  • Generates TTS audio using OpenAI's voice API
  • \n
  • Creates intro scene with:
      \n
    • Blurred/dimmed first frame background
    • \n
    • Centered hook text with yellow highlight
    • \n
    • AI voiceover reading the hook
    • \n
    \n
  • \n
  • Concatenates hook with main clip
  • \n
\n

5. Caption Generation

\n
    \n
  • Transcribes audio using OpenAI Whisper API
  • \n
  • Creates ASS subtitle file with:
      \n
    • Word-by-word timing
    • \n
    • Yellow highlight on current word
    • \n
    • Black outline and semi-transparent background
    • \n
    \n
  • \n
  • Burns captions into video using FFmpeg
  • \n
\n
\n

๐ŸŽจ Caption Styling

\n

The captions use CapCut-style formatting:

\n
Font: Arial Black (platform-dependent fallback)\nSize: 65px\nColor: White (#FFFFFF)\nHighlight: Yellow (#00FFFF)\nOutline: 4px Black\nShadow: 2px\nPosition: Lower third (400px from bottom)\n
\n
\n

๐Ÿ’ฐ API Usage & Costs

\n

Estimated OpenAI API costs per video (5 clips):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureModelEst. Cost
Highlight DetectionGPT-4.1~$0.05-0.15
TTS VoiceoverTTS-1~$0.01/clip
CaptionsWhisper API~$0.01/clip
\n

Total estimate: ~$0.10-0.25 per video (5 clips)

\n

The desktop app shows real-time token usage and cost estimation during processing.

\n
\n

๐Ÿ”จ Building from Source

\n

Windows

\n
pip install -r requirements.txt\npip install pyinstaller\n\npyinstaller build.spec\n# Output: dist/YTShortClipper.exe\n
\n

macOS

\n

Requires Python 3.10+ and create-dmg (brew install create-dmg).

\n
pip install -r requirements.txt\npip install pyinstaller\n\n# Build .app bundle\npython -m PyInstaller build_macos.spec --clean --noconfirm\n\n# Create DMG (optional)\ncreate-dmg \\\n    --volname \"YTShortClipper\" \\\n    --volicon \"assets/icon.icns\" \\\n    --window-size 600 400 \\\n    --icon \"YTShortClipper.app\" 150 185 \\\n    --app-drop-link 450 185 \\\n    \"dist/YTShortClipper.dmg\" \\\n    \"dist/YTShortClipper.app\"\n
\n

macOS notes:

\n
    \n
  • User data is stored in ~/Library/Application Support/YTShortClipper/ (persists across app updates)
  • \n
  • FFmpeg is auto-downloaded from evermeet.cx (x86_64, runs on Apple Silicon via Rosetta 2)
  • \n
  • GPU acceleration uses VideoToolbox (hardware encoding on all Macs)
  • \n
  • ffplay is not available on macOS; video preview requires system player
  • \n
\n
\n

๐Ÿค Contributing

\n

Contributions are welcome! We greatly appreciate contributions from anyone.

\n

Quick Start for Contributors

\n
# 1. Fork this repo (click the Fork button on GitHub)\n\n# 2. Clone your fork\ngit clone https://github.com/YOUR-USERNAME/yt-short-clipper.git\ncd yt-short-clipper\n\n# 3. Add upstream remote\ngit remote add upstream https://github.com/jipraks/yt-short-clipper.git\n\n# 4. Create a new branch\ngit checkout -b feature/your-new-feature\n\n# 5. Make changes, then commit\ngit add .\ngit commit -m \"feat: description of changes\"\n\n# 6. Push to your fork\ngit push origin feature/your-new-feature\n\n# 7. Create a Pull Request on GitHub\n
\n

How to Contribute

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TypeDescription
๐Ÿ› Bug ReportReport bugs in the Issues tab
๐Ÿ’ก Feature RequestRequest new features in Issues
๐Ÿ“– DocumentationImprove docs, fix typos, add examples
๐Ÿ”ง CodeFix bugs, add features, improve performance
\n

๐Ÿ“š Complete guide available in CONTRIBUTING.md - includes Git tutorial for beginners!

\n
\n

๐Ÿ“ License

\n

This project is licensed under the MIT License - see the LICENSE file for details.

\n

โš ๏ธ Disclaimer

\n
    \n
  • This tool is for personal/educational use only
  • \n
  • Respect YouTube's Terms of Service
  • \n
  • Ensure you have rights to use the content you're processing
  • \n
  • The AI-generated content should be reviewed before publishing
  • \n
\n

๐Ÿ™ Acknowledgments

\n\n
\n

๐Ÿ‘จโ€๐Ÿ’ป Credits

\n

Made with โ˜• by Aji Prakoso for content creators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
๐ŸŽ“n8n & Automation eCourse
๐Ÿ“ธ@jipraks on Instagram
๐ŸŽฌAji Prakoso on YouTube
๐ŸŒAbout Aji Prakoso
\n" @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T04:34:20Z", - "pushedAt": "2026-07-22T04:34:17Z", + "updatedAt": "2026-07-22T11:05:15Z", + "pushedAt": "2026-07-22T11:15:41Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 13, - "openPullRequests": 1, + "openIssues": 18, + "openPullRequests": 2, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n
    \n
  • Pipeline Latency: < 10ms overhead.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -340,7 +340,7 @@ "url": "https://github.com/hadziqmtqn/erd-builder-pro", "homepage": "https://www.erdbuilderpro.com", "language": "TypeScript", - "stars": 169, + "stars": 171, "forks": 31, "topics": [ "coding", @@ -352,7 +352,7 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-22T07:01:36Z", + "updatedAt": "2026-07-22T11:55:37Z", "pushedAt": "2026-07-22T07:01:42Z", "latestRelease": { "name": "v3.2.1", @@ -691,7 +691,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-05-31T09:02:50Z", "openIssues": 1, - "openPullRequests": 2, + "openPullRequests": 3, "subscribers": 0, "communityHealth": 100, "readmeHtml": "

\n \"KeiRouter\n

KeiRouter ๐Ÿš€

\n Your friendly, blazing-fast, self-hostable AI gateway.\n

\n \"CI\"\n \"Go\n \"Docker\n \"License:\n

\n \"KeiRouter\n


\n

So, what's the deal? ๐Ÿค”

\n

You use AI coding tools โ€” Claude Code, Cursor, Cline, or honestly anything that talks to OpenAI or Anthropic. And you know the headaches: a drawer full of API keys, rate limits that hit at the worst time, and a token bill that keeps creeping up.

\n

KeiRouter is the smart middleman that makes all of that someone else's problem. Point your tools at one local endpoint and let it handle the boring stuff โ€” routing each request to the right model, failing over the moment a provider taps out, caching repeat questions, and squeezing oversized prompts down before they ever cost you a token.

\n

Oh, and it's written in Go. So it sips memory (~20 MB), boots instantly, ships as a single binary, and comes with a dashboard that's actually nice to look at. โœจ

\n
\n

Heads up: KeiRouter is under active development. Peek at Architecture to see what's wired up today.

\n
\n
\n

๐Ÿ“‘ What's inside

\n\n
\n

โญ The good stuff

\n

Routing & reliability

\n
    \n
  • ๐Ÿ”€ One endpoint, every provider โ€” Your apps speak OpenAI or Anthropic; KeiRouter quietly translates to whatever you actually want to use.
  • \n
  • ๐Ÿ›ก๏ธ Never stop coding โ€” Provider down? Rate limited? Fallback chains keep you moving like nothing happened.
  • \n
  • โšก Semantic cache โ€” Ask the same thing twice and the embedding-powered cache hands it back instantly, for a glorious $0.00.
  • \n
\n

Cost control

\n
    \n
  • ๐Ÿ’ธ Five token savers โ€” Two on the way in, three on the way out, all on a live savings dashboard. Details in Token Savings.
  • \n
  • ๐Ÿ’ฐ Budget engine โ€” Per-key or per-org USD and token hard limits, with an auto-cutoff so surprise bills stay fictional.
  • \n
  • ๐Ÿšฆ Rate limiting โ€” Per-key RPM, TPM, and concurrency caps via global defaults or reusable plans.
  • \n
  • ๐Ÿ“‹ Plans & templates โ€” Set the rules once, slap them on any key.
  • \n
\n

Safety & governance

\n
    \n
  • ๐Ÿ›ก๏ธ Guardrails โ€” PII, prompt-injection, toxicity, topics, and bias detectors layered global โ†’ provider โ†’ model โ†’ chain โ†’ key, with mid-stream output scanning and a fully-offline mode.
  • \n
  • ๐Ÿ” Locked down by default โ€” AES-256-GCM envelope encryption for credentials, a password-gated dashboard, HMAC sessions, and SSRF protection on outbound calls.
  • \n
\n

Operations & UX

\n
    \n
  • ๐Ÿ“Š See everything โ€” Quota tracker, provider breakdowns, live key monitoring, TTFT metrics, and per-key summaries.
  • \n
  • ๐ŸŽจ White-label it โ€” Rebrand the dashboard and portal with your own name, logo, and palette.
  • \n
  • ๐Ÿ› ๏ธ Skills & CLI auto-config โ€” Built-in skills plus copy-paste configs for 12+ coding tools.
  • \n
  • ๐ŸŒ Usage portal โ€” A no-admin-needed view so teammates can track their own usage and savings.
  • \n
\n

\n \"Manage\n

\n \"Intelligent\n


\n

๐Ÿš€ Quick Start

\n

Prerequisites

\n

Grab whichever path matches what's already on your machine โ€” no need to install things you won't use:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodYou'll needGreat for
HomebrewmacOS or Linux with HomebrewThe fastest way to a prebuilt binary
WindowsWindows 10/11 with PowerShellPrebuilt binary, no Go/Node
From sourceGo 1.24+ and Node.js 20+Local hacking / latest main
DockerJust DockerClean, isolated runs
Docker ComposeDocker + Docker ComposeVPS / production / Coolify
\n

Pick your install

\n\nOption A โ€” Homebrew (macOS & Linux) ยท the easy button
brew tap mydisha/keirouter https://github.com/mydisha/keirouter\nbrew install keirouter\n\nkeirouter -bootstrap   # mint your first API key (printed once โ€” don't blink)\nkeirouter start        # fire up the server on :20180\n
\n\nOption B โ€” One-line from source ยท for the tinkerers

Needs Go 1.24+ and Node.js 20+. No cloning, no .env, no config wrangling:

\n
curl -fsSL https://raw.githubusercontent.com/mydisha/keirouter/main/scripts/quickstart.sh | bash\n
\n

It clones the repo to ~/keirouter, installs everything, and starts the backend on :20180 and the dashboard on :5180.

\n
\n

Already cloned it? Just make setup from the project root and you're off.

\n
\n\nOption C โ€” Docker ยท no Go/Node, no problem
curl -fsSL https://raw.githubusercontent.com/mydisha/keirouter/main/scripts/install.sh | bash -s -- --docker\n
\n\nOption D โ€” Docker Compose ยท ship it (VPS / production / Coolify)
git clone https://github.com/mydisha/keirouter.git\ncd keirouter\ncp .env.example .env       # set KEIROUTER_MASTER_KEY before going to prod\ndocker compose up -d --build\n
\n

VPS, PostgreSQL, and Coolify notes live in deploy/README.md.

\n\nOption E โ€” Windows ยท prebuilt, no Go/Node needed

Open PowerShell and run:

\n
irm https://raw.githubusercontent.com/mydisha/keirouter/main/scripts/install.ps1 | iex\n
\n

It downloads the latest prebuilt binary, drops it (plus the dashboard) into %LOCALAPPDATA%\\KeiRouter, and adds it to your PATH. Open a new terminal afterwards, then:

\n
keirouter -bootstrap   # mint your first API key (printed once)\nkeirouter start        # start the server on :20180\n
\n
\n

Pin a version or change the location with $env:KEIROUTER_VERSION / $env:KEIROUTER_DIR before running the one-liner.

\n
\n

First login

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
How you installedOpen thisPassword
From source (quickstart / make setup)http://localhost:5180keirouter
Homebrew / Docker / productionhttp://localhost:20180keirouter
\n

It'll nudge you to change that password the second you log in (please do ๐Ÿ™). Allergic to UIs? Mint a key straight from the terminal:

\n
keirouter -bootstrap   # prints a kr_ key, once\n
\n

Connect your tools

\n

In your AI tool of choice (Cursor, Claude Code, Cline, you name it), set:

\n
    \n
  • Base URL: http://localhost:20180/v1
  • \n
  • API Key: the kr_ key from the dashboard or -bootstrap
  • \n
  • Model: a provider model like openai/gpt-4o, or the name of a fallback chain you cooked up
  • \n
\n

That's it. You're routing.

\n
\n

๐Ÿ’ธ Token Savings (where the money hides)

\n

Every request runs through a deterministic token-saving pipeline before it gets translated to the provider's format โ€” so the savings work the same no matter which provider you land on. There are five savers, each independently toggleable from Settings โ†’ Token Saving, and a dashboard that shows you exactly how much you clawed back.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SaverSideThe pitch
RTK / SlimmerInputShrinks chunky tool output (diffs, greps, listings, build logs) locally before it ever leaves your machine.
HeadroomInputRoutes request messages through an external Headroom proxy for deeper compression. Fail-open โ€” if the proxy sneezes, your request sails through untouched. Also sniffs out \"phantom savings\" so only real wins get counted.
TerseOutputDrops a concise-output directive so the model skips the small talk and gives you the goods.
CavemanOutputTerse's stronger cousin (Wenyan / ๆ–‡่จ€ๆ–‡ levels included) โ€” trims output tokens by 65โ€“75%.
PonytailOutputInjects a \"lazy senior dev\" system prompt (lite / full / ultra) that nudges the model toward the smallest possible change. Stacks on top of Terse or Caveman.
\n
\n

Terse and Caveman both inject a system directive, so they're mutually exclusive โ€” pick one. Ponytail happily layers on top of either.

\n
\n

Pipeline order: normalizer โ†’ RTK โ†’ Headroom โ†’ Terse / Caveman โ†’ Ponytail โ†’ provider translation.

\n

Getting Headroom running

\n

Headroom is its own open-source compression proxy. KeiRouter just calls its /v1/compress endpoint, so you spin it up locally first. One gotcha worth shouting about: the headroom CLI lives in the Python package โ€” the npm package is a library only, so npm install -g headroom-ai will leave you staring at command not found. Don't say we didn't warn you. ๐Ÿ˜‰

\n
# The clean way: pipx isolates the CLI and sorts out your PATH (needs Python 3.10+)\npipx install \"headroom-ai[all]\"\npipx ensurepath               # puts headroom on your PATH โ€” then restart your shell\n\nheadroom proxy --port 8787    # start the proxy\nheadroom doctor               # make sure it's actually happy\n
\n

On Ubuntu and pip is fighting you (PEP 668 blocks global installs)? Go --user and make sure ~/.local/bin is on your PATH:

\n
pip install --user \"headroom-ai[all]\"\nexport PATH=\"$HOME/.local/bin:$PATH\"   # drop this in ~/.zshrc or ~/.bashrc\n
\n

Then over in Settings โ†’ Token Saving โ†’ Headroom: flip it on, set the Proxy URL to http://localhost:8787, and hit Test connection to confirm the handshake. Green check? You're golden.

\n
\n

๐Ÿง  Smart Routing (Chains)

\n

Why bet on one model when you can have a backup plan? Build a chain in the dashboard. Say you name one coding:

\n
    \n
  1. openai/gpt-4o โ€” your first pick
  2. \n
  3. deepseek/deepseek-chat โ€” steps in if the first one rate-limits or face-plants
  4. \n
\n

Then just set your app's model to chain:coding (or plain coding) and let KeiRouter sweat the failover.

\n
\n

๐Ÿ”Œ It does more than chat

\n

Chat completions are just the start. KeiRouter proxies the whole buffet:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CapabilityEndpoint
Image generation/v1/images/generations
Speech-to-text/v1/audio/transcriptions
Text-to-speech/v1/audio/speech
Embeddings/v1/embeddings
Web search/v1/search
Web fetch/v1/web/fetch
\n
\n

๐Ÿ”‘ Skip the keys: OAuth

\n

Copy-pasting API keys gets old fast. Connect providers straight from the Connections page with OAuth โ€” sign in once, and KeiRouter quietly refreshes your tokens in the background.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ProviderFlow
ClaudeAnthropic OAuth
GitHub CopilotGitHub device flow
Gemini CLIGoogle device flow
KiloCodeCustom device-auth
QoderPKCE device-token flow
CodeBuddy (Tencent)Browser-poll flow
CursorToken import flow
\n
\n

๐Ÿ“‹ Plans & Budgets

\n

Plans are reusable budget policies you can stamp onto any API key โ€” write the rules once, apply them everywhere. Each plan covers:

\n
    \n
  • Spend limit โ€” USD cap (micro-dollar precision, because pennies add up)
  • \n
  • Token limit โ€” max token usage
  • \n
  • RPM / TPM / Concurrency limits โ€” per assigned key (0 = unlimited)
  • \n
  • Reset period โ€” daily, weekly, monthly, or total
  • \n
  • Allowed models โ€” wildcard patterns like claude-*, gpt-4* (empty = everything's fair game)
  • \n
  • Alert threshold โ€” get pinged at 1โ€“100% of budget
  • \n
  • Hard cutoff โ€” block requests when the budget's gone, or just track and let it ride
  • \n
\n

Every tenant gets a default plan out of the box. Manage them on the Plans page and assign them in Keys settings.

\n
\n

๐Ÿšฆ Rate Limiting

\n

Keep your gateway (and your upstream quotas) from getting hammered with per-key RPM, TPM, and concurrency caps. For a single-instance setup, the in-memory limiter is all you need:

\n
limits:\n  enabled: true\n  backend: memory\n  default_rpm: 600\n  default_tpm: 200000\n  default_concurrency: 50\n  window: 1m\n  cleanup_interval: 1m\n
\n

Those defaults only apply to keys without a plan. The moment a key has one, the plan's rpm_limit, tpm_limit, and concurrency_limit take over (0 = unlimited).

\n
\n

๐Ÿ›ก๏ธ Guardrails

\n

A built-in content-safety layer runs detectors against every request and response. Policies stack global โ†’ provider โ†’ model โ†’ chain โ†’ API key and merge at request time, so the most specific rule wins.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DetectorCatchesDefault engineOptional engine
PIIEmail, phone, credit card, IBAN, IP, URL, NIK / NPWP / Indonesian passportNative Go (Presidio-compatible)Microsoft Presidio HTTP sidecar
Prompt InjectionIgnore-previous, role override, DAN, prompt-leak, safety bypassNative regex catalogโ€”
TopicsAllow-list / block-list of topicsKeyword + n-gramEmbedding similarity
ToxicityProfanity, hate, harassment, violence, sexual (id + en)Native catalogOpenAI Moderation API
Bias (outbound)Political, gender, ethnic, religious bias in responsesNative bilingual lexiconโ€”
\n
    \n
  • Actions: log_only, warn, mask (rewrite it), or block (refuse it). Strictest action across detectors wins.
  • \n
  • PII strategies: redact, replace, mask, hash, anonymize, or block.
  • \n
  • Streaming-safe: a sliding 256-char buffer scans assistant output as it streams and pulls the plug mid-sentence if something leaks.
  • \n
  • Observability: every decision shows up in Audit Logs (live via SSE); Prometheus serves keirouter_guardrail_decisions_total and keirouter_guardrail_eval_seconds at /metrics.
  • \n
  • Compliance: a per-tenant allow_external_engines flag forces every detector offline; KEIROUTER_GUARDRAILS__AUDIT_RETENTION_DAYS controls retention; the test endpoint is capped at 10 req/min.
  • \n
\n

Starter templates ship in the dashboard's \"From template\" picker (Indonesia PII ยท Strict safety ยท Compliance audit ยท Public chatbot ยท Alerts-only), and you can export/import policies as a JSON bundle.

\n

Want NER-based PII detection (PERSON, LOCATION, full multilingual)? Spin up the optional Presidio sidecar:

\n
docker compose -f compose.yaml -f compose.postgres.yaml -f compose.presidio.yaml up -d\n
\n

Then flip any PII policy's engine to presidio in the dashboard.

\n
\n

๐ŸŽจ Make it yours: Branding

\n

Rebrand the admin dashboard and the public Usage Portal from Settings โ†’ Branding:

\n
    \n
  • App name โ€” swap \"KeiRouter\" for your own
  • \n
  • Logo & favicon URLs โ€” your SVG/PNG, your vibe
  • \n
  • Tagline โ€” the line on the portal login screen
  • \n
  • Color palette โ€” sage-terra, ocean, midnight, and friends
  • \n
\n
\n

๐Ÿ”ง CLI Tools Auto-Config

\n

The CLI Tools page spits out ready-to-paste config snippets for the usual suspects:

\n
\n

Claude Code ยท Cursor ยท Cline ยท GitHub Copilot ยท DeepSeek ยท KiloCode ยท OpenCode ยท OpenClaw ยท Hermes ยท JCode ยท Droid ยท CodeBuddy

\n
\n

Copy, paste into your tool's config, done.

\n
\n

๐ŸŒ Usage Portal

\n

A dedicated, no-admin-required view at /portal where teammates keep an eye on their own usage โ€” quota and spend, token usage over time, compression savings, and plan limits. All it asks for is the API key. No keys to the kingdom required.

\n
\n

๐ŸŒ Supported Providers (60+)

\n

๐Ÿง  LLM / Chat

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CategoryProviders
Major CloudOpenAI, Anthropic, Google Gemini, Vertex AI, Azure OpenAI, AWS (Kiro)
Free / Free TierOpenRouter (27+ free models), NVIDIA NIM, Ollama (Cloud & Local), Cloudflare Workers AI, BytePlus ModelArk
China / AsiaDeepSeek, Qwen (Alibaba), GLM, Kimi (Moonshot), MiniMax, Volcengine Ark, Xiaomi MiMo, SiliconFlow, iFlow
OAuth / IDEClaude Code, GitHub Copilot, Cursor IDE, Cline, Kilo Code, OpenAI Codex, CodeBuddy (Tencent), Kimi Coding
PerformanceGroq, Cerebras, SambaNova, DeepInfra
SpecializedxAI (Grok), Mistral, Perplexity, Cohere, AI21 Labs, Reka AI
AggregatorsTogether AI, Fireworks AI, Nebius AI, OpenCode, AIML API, Vercel AI Gateway
EmergingBlackbox AI, Chutes AI, Hyperbolic, Lepton AI, Kluster AI, MorphLLM, LongCat, Puter AI, GLHF, SumoPod, Scaleway, NLP Cloud, and many more
CustomAny OpenAI- or Anthropic-compatible endpoint (self-hosted, proxy, etc.)
\n

๐ŸŽจ Media & Search

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TypeProviders
Image GenerationOpenAI DALLยทE, Gemini Imagen, Cloudflare, Fal.ai, Stability AI, Black Forest Labs, Recraft, Topaz, Runway ML, NanoBanana, HuggingFace, SD WebUI, ComfyUI
Text-to-SpeechOpenAI TTS, NVIDIA NIM, ElevenLabs, Deepgram, Cartesia, PlayHT, AWS Polly, Google TTS, Edge TTS, Inworld, Coqui, Tortoise
Speech-to-TextOpenAI Whisper, Groq Whisper, Deepgram, AssemblyAI, Gemini STT, HuggingFace
EmbeddingsOpenAI, Gemini, Mistral, Together AI, Fireworks AI, Nebius, Voyage AI, Jina AI, OpenRouter
Web SearchTavily, Exa, Serper, Brave Search, SearXNG, Perplexity, xAI, Google PSE, Linkup, SearchAPI, You.com, OpenAI
Web FetchTavily, Exa, Firecrawl, Jina Reader
\n
\n

โš™๏ธ Configuration

\n

Out of the box, KeiRouter runs on an embedded SQLite database โ€” zero config, zero fuss. Running it for a team? Switch to PostgreSQL: copy config.example.yaml and run with -config, or use environment variables like KEIROUTER_SERVER__PORT=8080. Docker/Coolify examples are in deploy/README.md.

\n
\n

๐Ÿ› ๏ธ Architecture

\n

Curious what happens after you hit send? Here's the life of a request:

\n
    \n
  1. Gateway โ€” takes your HTTP request and figures out the dialect (OpenAI, Anthropic, Gemini, โ€ฆ).
  2. \n
  3. Guardrails (inbound) โ€” runs PII / injection / toxicity / topics detectors; block โ†’ refuse, mask โ†’ rewrite the prompt on the spot.
  4. \n
  5. Pipeline โ€” runs the token savers (RTK โ†’ Headroom โ†’ Terse/Caveman โ†’ Ponytail) and checks your budget.
  6. \n
  7. Dispatch โ€” picks the best provider account and juggles fallbacks.
  8. \n
  9. Connector & Transform โ€” calls the provider, then translates the answer back into your tool's format.
  10. \n
  11. Guardrails (outbound) โ€” scans the response (or each stream chunk) for leaked PII, bias, or toxicity; block โ†’ cancel, mask โ†’ rewrite.
  12. \n
  13. Meter โ€” logs token usage and savings so the dashboard has something pretty to show.
  14. \n
\n
\n

๐Ÿ”’ Security

\n
    \n
  • The admin API (/api/*) only listens to localhost by default. Exposing it? Put it behind a reverse proxy and set a stable master_key.
  • \n
  • Guard your master key with your life โ€” it's the root of trust for every encrypted credential.
  • \n
  • Credentials sit behind AES-256-GCM envelope encryption; the dashboard uses password auth + HMAC session cookies; outbound requests get SSRF protection.
  • \n
\n

Found a security issue? Please follow SECURITY.md instead of opening a public issue. ๐Ÿ™

\n
\n

๐Ÿง‘โ€๐Ÿ’ป Hack on it

\n
make setup   # first time: installs deps + starts backend (:20180) and dashboard (:5180)\nmake dev     # after that: just start the servers\nmake test    # run the backend test suite\nmake build   # build the backend binary + frontend assets\n
\n

PRs and ideas are always welcome โ€” start with CONTRIBUTING.md.

\n
\n

๐Ÿ“„ License

\n

MIT โ€” see LICENSE. Go build something cool. ๐Ÿ› ๏ธ

\n" @@ -829,8 +829,8 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-07-22T04:44:08Z", - "pushedAt": "2026-07-22T09:18:51Z", + "updatedAt": "2026-07-22T12:03:53Z", + "pushedAt": "2026-07-22T12:01:43Z", "latestRelease": { "name": "Bansos v0.0.13", "tagName": "v0.0.13", @@ -841,10 +841,10 @@ "licenseSpdx": "MIT", "createdAt": "2026-06-11T13:28:54Z", "openIssues": 3, - "openPullRequests": 2, + "openPullRequests": 1, "subscribers": 0, "communityHealth": 100, - "readmeHtml": "

bansos.dev

\n

\"npm\n\"License:\n\"Built\n\"Deploy:\n\"Discord\"\n\"Telegram\"\n\"WhatsApp\"

\n

\"Bansos

\n

๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia (Default) ยท ๐ŸŒ English

\n
\n

๐ŸŒ Bahasa Indonesia (Default)

\n

Bantuan sosial untuk developer jelata

\n

bansos.dev adalah open-source katalog info bagi-bagi berkah, promo gratisan, dan diskonan tools coding paling legit khusus untuk developer jelata di Indonesia. Dibuat biar portofolio kita-kita tetep menyala walau dompet lagi sekarat. Nyari domain gratis, hosting free-tier, cloud credits, API credits, database gratisan, atau startup credits? Di sini tempat ngumpulnya! 100% Gratisan, No Clickbait, No Ribet. fr fr ๐Ÿš€

\n

Situs ini dibangun sebagai static SvelteKit site yang super SEO-friendly, data-driven, aman di mode terang/gelap, dan gampang banget buat dikontribusikan lewat email atau merge request.

\n

Keyword cepat

\n

bansos developer, promo developer Indonesia, domain gratis, cloud credits gratis, API credits, hosting free tier, startup credits, developer tools gratis, open source Indonesia, SvelteKit static site.

\n

Fitur utama

\n
    \n
  • Katalog bansos developer yang crawlable dan mudah dicari.
  • \n
  • Listing domain gratis, cloud gratis, hosting free-tier, API credits, database credits, dan benefit startup.
  • \n
  • Halaman detail dengan provider, benefit, syarat klaim, masa berlaku, status aktif/expired, dan link resmi.
  • \n
  • Filter tag dan highlight rekomendasi/terbaru.
  • \n
  • Data terstruktur di src/lib/data/bansos.json.
  • \n
  • SEO metadata untuk halaman publik, termasuk meta description dan social card pattern.
  • \n
  • Workflow kontribusi publik via email dan Git clone.
  • \n
  • Halaman kontribusi publik: bansos.dev/contribute.
  • \n
  • Terms and conditions: bansos.dev/terms.
  • \n
\n

Deploy dan Hosting

\n

Situs ini di-deploy dan di-hosting menggunakan Cloudflare Pages dengan adapter @sveltejs/adapter-cloudflare. Setiap kali ada merge request atau push ke branch main, Cloudflare secara otomatis memicu build dan mendistribusikan situs statis super cepat beserta seluruh dynamic OG image yang sudah di-prerender.

\n

Menjalankan proyek

\n
npm install\nnpm run dev\nnpm run build\n
\n

Validasi lokal:

\n
npm run check\nnpm run lint\n
\n

Struktur penting

\n
src/lib/data/bansos.json       # data utama listing bansos\nsrc/lib/data/bansos.ts         # helper selector, sorting, dan contributor stats\nsrc/lib/components/            # komponen UI reusable\nsrc/routes/list/               # halaman list dan detail bansos\nsrc/routes/contribute/         # panduan kontribusi publik\nscripts/add-bansos.mjs         # script lokal tambah data\npackages/bansosdev-cli/        # CLI bansosdev (disabled untuk submit publik)\n
\n

Cara Menambah Bansos

\n

Untuk saat ini, submit publik yang aktif adalah via email dan Git clone. Jalur form, npx CLI, dan bot dinonaktifkan sementara karena spam.

\n
\n

[!TIP]\nSoon: Submisi via Discord & Telegram Bot!\nKami sedang membangun integrasi bot agar kamu bisa mengirimkan bansos baru secara otomatis langsung dari server Discord atau channel Telegram.\nSembari menunggu, yuk gabung ke komunitas kami:

\n
    \n
  • Discord Server untuk ngobrol, diskusi, dan submit via chat (coming soon).
  • \n
  • Telegram Channel untuk dapetin update instan promo developer terbaru langsung di HP-mu.
  • \n
\n
\n

1. Opsi 1: Lewat Email

\n

Opsi ini sangat cocok buat kamu yang ingin berbagi info dengan cepat tanpa perlu menyentuh terminal.

\n
    \n
  1. Buka halaman kontribusi di browser: bansos.dev/contribute.
  2. \n
  3. Pilih tab Email.
  4. \n
  5. Kirim usulan ke submit@bansos.dev memakai template yang tersedia.
  6. \n
  7. Pastikan semua field penting terisi: judul, provider, benefit, syarat klaim, link resmi, status, sumber, dan kontributor.
  8. \n
\n
\n

2. Opsi 2: Lewat Command Line (npx CLI) - Dinonaktifkan

\n

Submit publik via npx bansosdev add sedang dinonaktifkan sementara karena spam. Dokumentasi CLI tetap disimpan untuk maintainer dan pengujian lokal, tetapi jangan dipakai untuk submit publik saat ini.

\n
npx bansosdev add\n
\n

CLI akan menuntunmu mengisi field demi field untuk menyiapkan data lokal.

\n

Kamu juga bisa mengirimkan data langsung menggunakan argumen CLI:

\n
npx bansosdev add \\\n  --id contoh-bansos \\\n  --title \"Contoh Bansos Developer\" \\\n  --provider \"Example Provider\" \\\n  --description \"Deskripsi singkat bansos.\" \\\n  --benefits \"Benefit satu|Benefit dua\" \\\n  --validity-type fixed \\\n  --validity-date 2026-06-30 \\\n  --validity-desc \"Berlaku khusus pelajar\" \\\n  --published-at 2026-06-13 \\\n  --requirements \"Buat akun|Klaim program\" \\\n  --cta-link \"https://example.com\" \\\n  --contributor-name \"Nama Kamu\" \\\n  --contributor-url \"https://example.com\" \\\n  --tags \"Cloud,Gratisan\"\n
\n

Parameter validity

\n
    \n
  • --validity-type wajib: pilih fixed, uncertain, atau forever.
  • \n
  • --validity-date wajib jika --validity-type fixed, memakai format YYYY-MM-DD (Berfungsi sebagai Tanggal Berakhir).
  • \n
  • --validity-desc opsional untuk catatan masa berlaku, kuota, atau syarat khusus.
  • \n
  • --published-at opsional untuk tanggal mulai berlaku (start date) dalam format YYYY-MM-DD. Default adalah hari ini.
  • \n
  • --source opsional untuk sumber verifikasi; bisa berupa URL atau teks biasa.
  • \n
\n
\n

Catatan Otomatisasi:

\n
    \n
  • Parameter provider akan diekstrak secara otomatis dari domain cta-link.
  • \n
  • Parameter status akan dihitung otomatis (active, upcoming, atau expired) berdasarkan tanggal published-at dan validity-date.
  • \n
\n
\n

Cek payload JSON

\n
npx bansosdev add ... --mode json\n
\n
\n

3. Opsi 3: Lewat Git Clone (Manual Merge Request)

\n

Opsi ini bagi kamu yang ingin menguji kode secara lokal atau memodifikasi file secara langsung.

\n
    \n
  1. Clone repositori ini ke komputermu:

    \n
    git clone https://gitlab.com/wauputr4/bansos.git\ncd bansos\nnpm install\n
    \n
  2. \n
  3. Tambahkan data secara lokal menggunakan helper script:

    \n
    npm run add:bansos -- \\\n  --id contoh-bansos \\\n  --title \"Contoh Bansos Developer\" \\\n  --provider \"Example Provider\" \\\n  --description \"Deskripsi singkat bansos.\" \\\n  --benefits \"Benefit satu|Benefit dua\" \\\n  --validity-type fixed \\\n  --validity-date 2026-06-30 \\\n  --requirements \"Buat akun|Klaim program\" \\\n  --cta-link \"https://example.com\" \\\n  --contributor-name \"Nama Kamu\" \\\n  --contributor-url \"https://example.com\" \\\n  --tags \"Cloud,Gratisan\"\n
    \n

    Script ini akan memvalidasi data dan menyimpannya di file data terstruktur src/lib/data/bansos.json.

    \n

    Argumen --benefits dan --requirements dipisahkan dengan |.\nArgumen --tags dipisahkan dengan koma.

    \n
  4. \n
  5. Buat branch baru, tambahkan commit, push ke fork, dan kirim merge request ke repositori utama.

    \n
  6. \n
\n
\n

Maintainer mode (Khusus Admin / Maintainer)

\n

Mode direct untuk submit otomatis sedang dinonaktifkan. Untuk perubahan maintainer, gunakan Git clone, commit manual, dan merge request ke main.

\n
npx bansosdev add ... --mode json\n
\n

Perintah di atas hanya untuk mengecek payload JSON secara lokal.

\n

Detail lengkap CLI lihat docs/bansosdev-cli.md.

\n

Panduan kualitas listing

\n

Listing yang baik sebaiknya menyertakan:

\n
    \n
  • Link resmi provider atau halaman program.
  • \n
  • Benefit yang spesifik, misalnya nominal credit, durasi, atau batas kuota.
  • \n
  • Syarat klaim yang jelas.
  • \n
  • Status aktif, expired, atau upcoming.
  • \n
  • Tag yang membantu pencarian, misalnya Cloud, Domain, AI Credits, Startup, atau No Credit Card.
  • \n
  • Nama dan URL kontributor.
  • \n
\n

Kontribusi

\n
    \n
  • Kirim data lewat email ke submit@bansos.dev.
  • \n
  • Jika lebih nyaman, tambahkan melalui branch dan merge request manual.
  • \n
  • Baca panduan kontribusi lengkap di CONTRIBUTING.
  • \n
\n

Kode etik komunitas

\n

Ikuti Code of Conduct.

\n

Sponsor & Dukungan

\n

Proyek bansos.dev dibangun secara gratis oleh komunitas. Jika proyek ini membantumu menghemat budget developer-mu, silakan kirim dukungan via email ke me@wau.my.id.

\n
\n

[!NOTE]\nSoon: Kami berencana menghadirkan fitur di mana donatur/pengunjung bisa mengirimkan dukungan (donasi) langsung ke masing-masing kontributor yang mendaftarkan/menulis listing bansos tersebut.

\n
\n

Lisensi

\n

MIT. Lihat LICENSE.

\n

Disclaimer

\n

bansos.dev adalah platform komunitas open-source yang bertujuan membantu sesama developer Indonesia menemukan program bantuan sosial yang sah dan legal dari provider resmi. Kami tidak terafiliasi dengan provider mana pun.

\n

Kami dengan tegas melarang:

\n
    \n
  • Penyalahgunaan informasi bansos untuk tujuan abuse atau mengeksploitasi celah kebijakan provider.
  • \n
  • Pelanggaran terhadap ketentuan layanan (ToS) platform atau provider pihak ketiga.
  • \n
  • Tindakan yang melanggar privasi data individu atau organisasi.
  • \n
  • Segala bentuk tindakan ilegal atau melanggar hukum yang berlaku.
  • \n
  • Submit informasi bansos yang palsu, menyesatkan, atau tidak bisa diklaim.
  • \n
\n

Semua informasi yang ditampilkan bersifat referensi. Selalu verifikasi langsung ke situs resmi provider sebelum melakukan klaim. Kami tidak bertanggung jawab atas perubahan kebijakan sepihak dari provider, interpretasi manfaat yang keliru, ataupun penyalahgunaan informasi oleh pihak tidak bertanggung jawab.

\n

Dengan menggunakan bansos.dev, Anda menyetujui bahwa platform ini hanyalah katalog komunitas dan segala klaim, transaksi, atau interaksi dengan provider sepenuhnya merupakan tanggung jawab pribadi masing-masing pengguna.

\n" + "readmeHtml": "

bansos.dev

\n

\"License:\n\"Built\n\"Deploy:\n\"Discord\"\n\"Telegram\"\n\"WhatsApp\"

\n

\"Bansos

\n

๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia (Default) ยท ๐ŸŒ English

\n
\n

๐ŸŒ Bahasa Indonesia (Default)

\n

Bantuan sosial untuk developer jelata

\n

bansos.dev adalah open-source katalog info bagi-bagi berkah, promo gratisan, dan diskonan tools coding paling legit khusus untuk developer jelata di Indonesia. Dibuat biar portofolio kita-kita tetep menyala walau dompet lagi sekarat. Nyari domain gratis, hosting free-tier, cloud credits, API credits, database gratisan, atau startup credits? Di sini tempat ngumpulnya! 100% Gratisan, No Clickbait, No Ribet. fr fr ๐Ÿš€

\n

Situs ini dibangun sebagai static SvelteKit site yang super SEO-friendly, data-driven, aman di mode terang/gelap, dan gampang banget buat dikontribusikan lewat email atau pull request.

\n

Keyword cepat

\n

bansos developer, promo developer Indonesia, domain gratis, cloud credits gratis, API credits, hosting free tier, startup credits, developer tools gratis, open source Indonesia, SvelteKit static site.

\n

Fitur utama

\n
    \n
  • Katalog bansos developer yang crawlable dan mudah dicari.
  • \n
  • Listing domain gratis, cloud gratis, hosting free-tier, API credits, database credits, dan benefit startup.
  • \n
  • Halaman detail dengan provider, benefit, syarat klaim, masa berlaku, status aktif/expired, dan link resmi.
  • \n
  • Filter tag dan highlight rekomendasi/terbaru.
  • \n
  • Data per listing di src/lib/data/bansos/.
  • \n
  • SEO metadata untuk halaman publik, termasuk meta description dan social card pattern.
  • \n
  • Workflow kontribusi publik via email dan Git clone.
  • \n
  • Halaman kontribusi publik: bansos.dev/contribute.
  • \n
  • Terms and conditions: bansos.dev/terms.
  • \n
\n

Deploy dan Hosting

\n

Situs ini di-deploy dan di-hosting menggunakan Cloudflare Pages dengan adapter @sveltejs/adapter-cloudflare. Setiap kali ada pull request atau push ke branch main, Cloudflare secara otomatis memicu build dan mendistribusikan situs statis super cepat beserta seluruh dynamic OG image yang sudah di-prerender.

\n

Menjalankan proyek

\n
npm install\nnpm run dev\nnpm run build\n
\n

Validasi lokal:

\n
npm run check\nnpm run lint\n
\n

Struktur penting

\n
src/lib/data/bansos/<slug>/    # index.json + README tiap listing\nsrc/lib/data/bansos/contributors/ # profil kontributor\nsrc/lib/data/bansos.ts         # loader, selector, sorting, dan stats\nsrc/lib/components/            # komponen UI reusable\nsrc/routes/list/               # halaman list dan detail bansos\nsrc/routes/contribute/         # panduan kontribusi publik\nscripts/add-bansos.mjs         # script lokal tambah data\npackages/bansosdev-cli/        # CLI lama (submit publik dinonaktifkan)\n
\n

Setiap listing wajib memiliki contributorSlug yang terhubung dua arah dengan manifest profil.\nAvatar diambil otomatis dari GitHub bila tersedia; profil tanpa GitHub tetap tampil memakai dua\ninisial. Semua tautan nama kontributor di situs mengarah ke profil internal bansos.dev.\nKonten profil dapat disesuaikan melalui src/lib/data/bansos/contributors/<slug>/README.md.\nProfil publik memakai URL canonical https://bansos.dev/<slug>/; validator mencegah slug contributor\nbentrok dengan route situs atau shortlink bansos.

\n

Cara Menambah Bansos

\n

Untuk saat ini, submit publik yang aktif adalah via AI Agent, email, dan Git clone. Jalur form, CLI publik, dan bot dinonaktifkan sementara karena spam.

\n
\n

[!TIP]\nSoon: Submisi via Discord & Telegram Bot!\nKami sedang membangun integrasi bot agar kamu bisa mengirimkan bansos baru secara otomatis langsung dari server Discord atau channel Telegram.\nSembari menunggu, yuk gabung ke komunitas kami:

\n
    \n
  • Discord Server untuk ngobrol, diskusi, dan submit via chat (coming soon).
  • \n
  • Telegram Channel untuk dapetin update instan promo developer terbaru langsung di HP-mu.
  • \n
\n
\n

1. Opsi 1: Lewat AI Agent

\n

Install skill resmi bansos.dev agar agent memahami struktur listing, profil contributor, validasi, dan alur PR terbaru:

\n
npx skills add wauputr4/skill-bansos --skill '*' --agent '*'\n
\n

Setelah terpasang, berikan link sumber dan minta agent memakai $bansos-add-entry. Review data dan diff sebelum membuka pull request.

\n
\n

2. Opsi 2: Lewat Email

\n

Opsi ini sangat cocok buat kamu yang ingin berbagi info dengan cepat tanpa perlu menyentuh terminal.

\n
    \n
  1. Buka halaman kontribusi di browser: bansos.dev/contribute.
  2. \n
  3. Pilih tab Email.
  4. \n
  5. Kirim usulan ke submit@bansos.dev memakai template yang tersedia.
  6. \n
  7. Pastikan semua field penting terisi: judul, provider, benefit, syarat klaim, link resmi, status, sumber, dan kontributor.
  8. \n
\n
\n

3. Opsi 3: Lewat Git Clone (Manual Pull Request)

\n

Opsi ini bagi kamu yang ingin menguji kode secara lokal atau memodifikasi file secara langsung.

\n
    \n
  1. Fork dan clone repositori ini ke komputermu memakai GitHub CLI:

    \n
    gh repo fork wauputr4/bansos --clone\ncd bansos\nnpm install\n
    \n
  2. \n
  3. Tambahkan data secara lokal menggunakan helper script:

    \n
    npm run add:bansos -- \\\n  --id contoh-bansos \\\n  --title \"Contoh Bansos Developer\" \\\n  --provider \"Example Provider\" \\\n  --description \"Deskripsi singkat bansos.\" \\\n  --benefits \"Benefit satu|Benefit dua\" \\\n  --validity-type fixed \\\n  --validity-date 2026-06-30 \\\n  --requirements \"Buat akun|Klaim program\" \\\n  --cta-link \"https://example.com\" \\\n --contributor-slug username-kamu \\\n  --contributor-name \"Nama Kamu\" \\\n  --contributor-url \"https://example.com\" \\\n  --tags \"Cloud,Gratisan\"\n
    \n

    Script ini akan memvalidasi data lalu membuat src/lib/data/bansos/<slug>/index.json dan README listing.

    \n

    Argumen --benefits dan --requirements dipisahkan dengan |.\nArgumen --tags dipisahkan dengan koma.\n--contributor-slug wajib pada setiap submit. --contributor-name wajib dan\n--contributor-url opsional hanya jika profil contributor tersebut belum ada.

    \n
  4. \n
  5. Buat branch baru, tambahkan commit, push ke fork, dan kirim pull request ke repositori utama.

    \n
  6. \n
\n

Panduan kualitas listing

\n

Listing yang baik sebaiknya menyertakan:

\n
    \n
  • Link resmi provider atau halaman program.
  • \n
  • Benefit yang spesifik, misalnya nominal credit, durasi, atau batas kuota.
  • \n
  • Syarat klaim yang jelas.
  • \n
  • Status aktif, expired, atau upcoming.
  • \n
  • Tag yang membantu pencarian, misalnya Cloud, Domain, AI Credits, Startup, atau No Credit Card.
  • \n
  • Nama dan URL kontributor.
  • \n
\n

Kontribusi

\n
    \n
  • Kirim data lewat email ke submit@bansos.dev.
  • \n
  • Jika lebih nyaman, tambahkan melalui branch dan pull request manual.
  • \n
  • Baca panduan kontribusi lengkap di CONTRIBUTING.
  • \n
\n

Kode etik komunitas

\n

Ikuti Code of Conduct.

\n

Sponsor & Dukungan

\n

Proyek bansos.dev dibangun secara gratis oleh komunitas. Jika proyek ini membantumu menghemat budget developer-mu, silakan kirim dukungan via email ke me@wau.my.id.

\n
\n

[!NOTE]\nSoon: Kami berencana menghadirkan fitur di mana donatur/pengunjung bisa mengirimkan dukungan (donasi) langsung ke masing-masing kontributor yang mendaftarkan/menulis listing bansos tersebut.

\n
\n

Lisensi

\n

MIT. Lihat LICENSE.

\n

Disclaimer

\n

bansos.dev adalah platform komunitas open-source yang bertujuan membantu sesama developer Indonesia menemukan program bantuan sosial yang sah dan legal dari provider resmi. Kami tidak terafiliasi dengan provider mana pun.

\n

Kami dengan tegas melarang:

\n
    \n
  • Penyalahgunaan informasi bansos untuk tujuan abuse atau mengeksploitasi celah kebijakan provider.
  • \n
  • Pelanggaran terhadap ketentuan layanan (ToS) platform atau provider pihak ketiga.
  • \n
  • Tindakan yang melanggar privasi data individu atau organisasi.
  • \n
  • Segala bentuk tindakan ilegal atau melanggar hukum yang berlaku.
  • \n
  • Submit informasi bansos yang palsu, menyesatkan, atau tidak bisa diklaim.
  • \n
\n

Semua informasi yang ditampilkan bersifat referensi. Selalu verifikasi langsung ke situs resmi provider sebelum melakukan klaim. Kami tidak bertanggung jawab atas perubahan kebijakan sepihak dari provider, interpretasi manfaat yang keliru, ataupun penyalahgunaan informasi oleh pihak tidak bertanggung jawab.

\n

Dengan menggunakan bansos.dev, Anda menyetujui bahwa platform ini hanyalah katalog komunitas dan segala klaim, transaksi, atau interaksi dengan provider sepenuhnya merupakan tanggung jawab pribadi masing-masing pengguna.

\n" }, { "fullName": "giosakti/duragent", @@ -983,8 +983,8 @@ "stars": 45, "forks": 10, "topics": [], - "updatedAt": "2026-07-21T04:20:00Z", - "pushedAt": "2026-07-21T04:20:02Z", + "updatedAt": "2026-07-22T09:59:47Z", + "pushedAt": "2026-07-22T09:59:29Z", "latestRelease": { "name": "v0.15.1", "tagName": "v0.15.1", @@ -2266,13 +2266,13 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-06-25T07:10:51Z", - "pushedAt": "2026-06-14T21:13:08Z", + "updatedAt": "2026-07-22T11:40:45Z", + "pushedAt": "2026-07-22T11:40:45Z", "latestRelease": { - "name": "skill-bansos v0.1.1", - "tagName": "v0.1.1", - "url": "https://github.com/wauputr4/skill-bansos/releases/tag/v0.1.1", - "publishedAt": "2026-06-13T11:36:57Z" + "name": "skill-bansos v0.2.0", + "tagName": "v0.2.0", + "url": "https://github.com/wauputr4/skill-bansos/releases/tag/v0.2.0", + "publishedAt": "2026-07-22T11:40:46Z" }, "archived": false, "licenseSpdx": "MIT", @@ -2281,7 +2281,7 @@ "openPullRequests": 0, "subscribers": 0, "communityHealth": 100, - "readmeHtml": "

skill-bansos

\n

Open Agent Skills for AI agents working on bansos.dev and wauputr4/bansos.

\n

These skills follow the skills.sh / npx skills format: each skill lives in skills/<skill-name>/ with a required SKILL.md, optional references/, and optional agents/openai.yaml UI metadata.

\n

Skills

\n
    \n
  • bansos-add-entry: add or review bansos.dev listings using source-backed data and the npx bansosdev add workflow.
  • \n
  • bansos-develop-feature: develop UI, SEO, data, and feature changes for the static SvelteKit bansos.dev site.
  • \n
\n

Install

\n

Install all skills to every supported agent:

\n
npx skills add wauputr4/skill-bansos --skill '*' --agent '*'\n
\n

Install only the submit-entry skill:

\n
npx skills add wauputr4/skill-bansos --skill bansos-add-entry\n
\n

Usage

\n

Use each skill directly by path:

\n
Use $bansos-add-entry to add a new bansos.dev listing from this source: ...\nUse $bansos-develop-feature to improve the mobile contribution page UI.\n
\n

Validation

\n

Validate before publishing or opening a pull request:

\n
python3 /path/to/skill-creator/scripts/quick_validate.py skills/bansos-add-entry\npython3 /path/to/skill-creator/scripts/quick_validate.py skills/bansos-develop-feature\n
\n

License

\n

MIT. See LICENSE.

\n" + "readmeHtml": "

skill-bansos

\n

Open Agent Skills for AI agents working on bansos.dev and wauputr4/bansos.

\n

These skills follow the skills.sh / npx skills format: each skill lives in skills/<skill-name>/ with a required SKILL.md, optional references/, and optional agents/openai.yaml UI metadata.

\n

Skills

\n
    \n
  • bansos-add-entry: add or review folder-based bansos.dev listings with source verification and contributor attribution.
  • \n
  • bansos-develop-feature: develop UI, SEO, data, and feature changes for the SvelteKit and Cloudflare Pages site.
  • \n
\n

Install

\n

Install all skills to every supported agent:

\n
npx skills add wauputr4/skill-bansos --skill '*' --agent '*'\n
\n

Install only the submit-entry skill:

\n
npx skills add wauputr4/skill-bansos --skill bansos-add-entry\n
\n

Usage

\n

Use each skill directly by path:

\n
Use $bansos-add-entry to add a new bansos.dev listing from this source: ...\nUse $bansos-develop-feature to improve the mobile contribution page UI.\n
\n

Validation

\n

Validate before publishing or opening a pull request:

\n
python3 /path/to/skill-creator/scripts/quick_validate.py skills/bansos-add-entry\npython3 /path/to/skill-creator/scripts/quick_validate.py skills/bansos-develop-feature\n
\n

Release tags are created from merged main. The current folder-based workflow update is planned for v0.2.0; see CONTRIBUTING.md.

\n

License

\n

MIT. See LICENSE.

\n" }, { "fullName": "wauputr4/agent-proxmox", From 3226f576bb9f334e497549c00362e665cc97c361 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 14:29:16 +0000 Subject: [PATCH 18/25] Sync content data --- src/data/projects.json | 44 +++++++++++++++++++++--------------------- src/data/revival.json | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 7a2428a..2b6342a 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -10,7 +10,7 @@ "homepage": "https://uaparser.dev/", "language": "JavaScript", "stars": 10168, - "forks": 1220, + "forks": 1219, "topics": [ "analytics", "bot-detection", @@ -123,13 +123,13 @@ "url": "https://github.com/OpenSID/OpenSID", "homepage": "", "language": "PHP", - "stars": 1212, - "forks": 1167, + "stars": 1213, + "forks": 1168, "topics": [ "opensid", "sistem-informasi-desa" ], - "updatedAt": "2026-07-22T07:59:43Z", + "updatedAt": "2026-07-22T13:40:31Z", "pushedAt": "2026-07-18T13:09:40Z", "latestRelease": { "name": "Rilis v2607.0.0", @@ -142,7 +142,7 @@ "createdAt": "2016-05-21T10:55:38Z", "openIssues": 353, "openPullRequests": 7, - "subscribers": 111, + "subscribers": 110, "communityHealth": 50, "readmeHtml": "

Selamat datang di OpenSID! ๐Ÿ‘‹

\"readme-image\"

\n

๐Ÿค” Apa itu OpenSID?

\n

OpenSID adalah Sistem Informasi Desa (SID) yang dikembangkan secara terbuka dan kolaboratif oleh komunitas yang peduli dengan SID.

\n

SID diharapkan dapat membantu pemerintah desa dalam beberapa hal berikut:

\n
    \n
  • Menjadikan kantor desa lebih efisien dan efektif
  • \n
  • Mendorong transparansi dan akuntabilitas pemerintah desa
  • \n
  • Meningkatkan kualitas layanan publik
  • \n
  • Memberikan akses informasi desa yang lebih baik bagi warga
  • \n
\n
\n

OpenSID bertujuan agar sebanyak mungkin desa di Indonesia dapat menerapkan sistem informasi untuk memajukan desa masing-masing..

\n
\n

Strategi pengembangan OpenSID adalah untuk:

\n
    \n
  • Memudahkan pengguna memperoleh SID secara bebas, tanpa birokrasi
  • \n
  • Memudahkan pengguna menyerap rilis SID terbaru
  • \n
  • Memungkinkan pegiat SID berkontribusi langsung pada source code aplikasi SID
  • \n
\n

OpenSID dikelola di GitHub untuk:

\n
    \n
  • Mencatat seluruh perubahan yang dilakukan
  • \n
  • Memungkinkan pengembalian ke revisi sebelumnya jika diperlukan
  • \n
  • Mempermudah kolaborasi antar pegiat SID dan dengan desa-desa pendamping
  • \n
  • Menyediakan backup daring source code SID yang dapat diakses kapan saja
  • \n
\n

๐Ÿ“ƒ PEDOMAN PENGGUNAAN

\n

Panduan pemasangan dan penggunaan OpenSID tersedia di Panduan OpenSID.

\n

๐Ÿ“‘ Distribusi \"VERSI PUBLIK (UMUM)\" dan \"VERSI PREMIUM\":

\n
    \n
  • 'Versi Publik (UMUM)' merupakan perangkat lunak dengan akses terbatas terhadap fitur-fitur 'Versi Premium' selama 6 bulan.
  • \n
  • 'Versi Premium' terus diperbarui berdasarkan umpan balik pengguna, mencakup perbaikan bug mingguan dan rilis fitur bulanan.
  • \n
  • Setiap fitur dan peningkatan yang dirilis dalam 'Versi Premium' juga akan tersedia di 'Versi Publik (UMUM)', namun dengan penundaan selama 6 bulan.
  • \n
  • Beberapa fitur tertentu tidak akan pernah dirilis di 'Versi Publik (UMUM)' dan hanya tersedia secara eksklusif bagi pengguna 'Versi Premium', sesuai kebijakan administrator.
  • \n
\n

๐Ÿ“‘ Hak Cipta dan Lisensi Tambahan:

\n
    \n
  • Pemegang hak cipta memiliki hak eksklusif dalam menentukan dan mengatur perbedaan antara 'Versi Publik (UMUM)' dan 'Versi Premium', termasuk akses fitur dan fungsi.
  • \n
  • Pemegang hak cipta berwenang menetapkan aturan, kebijakan, dan jadwal pembaruan kedua versi tersebut sesuai dengan ketentuan GPL yang berlaku.
  • \n
  • Perbedaan yang ditentukan oleh pemegang hak cipta bersifat final dan mengikat. Fitur eksklusif 'Versi Premium' tidak akan tersedia di 'Versi Publik (UMUM)'.
  • \n
\n

๐Ÿ“‘ HAK CIPTA, SYARAT, DAN KETENTUAN

\n

Sistem Informasi Desa (SID) pertama kali dikembangkan oleh Combine Resource Institution sejak tahun 2009. Hak cipta awal dimiliki oleh Combine Resource Institution (http://lumbungkomunitas.net/).

\n

Sistem ini dikelola berdasarkan lisensi GNU General Public License Versi 3 (http://www.gnu.org/licenses/gpl.html).

\n

Versi GitHub ini dikembangkan sejak Mei 2016, gratis dan bebas dimanfaatkan serta dikembangkan oleh semua desa. Hak Cipta OpenSID kini dipegang oleh Perkumpulan Desa Digital Terbuka (https://opendesa.id), sebuah lembaga hukum yang dibentuk khusus untuk mengelola OpenSID.

\n

๐Ÿ’ป DEMO

\n\n

๐Ÿ’ฌ FORUM

\n

Bergabunglah dengan Forum Pengguna dan Pegiat OpenSID di Facebook atau di Telegram.
Forum ini bersifat informal, sebagai wadah berbagi informasi dan saling membantu dalam menggunakan dan mengembangkan OpenSID.

\n

๐Ÿค KEMBANGKAN BERSAMA

\n

Laporkan masalah, usulan, atau permintaan pengembangan OpenSID melalui issue GitHub.
Kontribusi dari komunitas SID sangat dihargai, baik untuk dokumentasi di Wiki OpenSID maupun untuk source code di repo utama.

\n

๐Ÿ’ฐ DONASI

\n

\"Backers\n\"Sponsors

\n

๐Ÿง‘ Pendukung

\n

Peduli OpenSID dan misi membangun desa? Dukung OpenSID di sini.

\n
\n

Atau donasi langsung melalui rekening bank. Info lengkap di sini.

\n
\n

โญ๏ธ Sponsor

\n

Apakah desa, lembaga, atau perusahaan Anda mendapat manfaat dari OpenSID?
Bantu kami mengembangkan OpenSID dengan menjadi sponsor.
Logo sponsor Anda akan tampil di sini dengan tautan ke situs Anda.

\n

\n

๐Ÿ‘จโ€๐Ÿ’ป KONTRIBUTOR

\n

Berikut adalah para kontributor luar biasa yang telah membantu mengembangkan OpenSID:

\n

\"Contributors\"

\n" }, @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T11:05:15Z", - "pushedAt": "2026-07-22T11:15:41Z", + "updatedAt": "2026-07-22T14:01:45Z", + "pushedAt": "2026-07-22T13:58:48Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 18, - "openPullRequests": 2, + "openIssues": 20, + "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n
    \n
  • Pipeline Latency: < 10ms overhead.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -340,8 +340,8 @@ "url": "https://github.com/hadziqmtqn/erd-builder-pro", "homepage": "https://www.erdbuilderpro.com", "language": "TypeScript", - "stars": 171, - "forks": 31, + "stars": 173, + "forks": 32, "topics": [ "coding", "developer-tools", @@ -352,7 +352,7 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-22T11:55:37Z", + "updatedAt": "2026-07-22T13:03:39Z", "pushedAt": "2026-07-22T07:01:42Z", "latestRelease": { "name": "v3.2.1", @@ -657,8 +657,8 @@ "url": "https://github.com/mydisha/keirouter", "homepage": "https://keirouter.app", "language": "Go", - "stars": 90, - "forks": 32, + "stars": 91, + "forks": 33, "topics": [ "ai", "ai-gateway", @@ -679,7 +679,7 @@ "rtk", "zai" ], - "updatedAt": "2026-07-22T08:00:24Z", + "updatedAt": "2026-07-22T13:25:02Z", "pushedAt": "2026-07-16T08:27:50Z", "latestRelease": { "name": "v0.1.26", @@ -815,7 +815,7 @@ "url": "https://github.com/wauputr4/bansos", "homepage": "https://bansos.dev", "language": "Svelte", - "stars": 50, + "stars": 51, "forks": 8, "topics": [ "bansos", @@ -829,7 +829,7 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-07-22T12:03:53Z", + "updatedAt": "2026-07-22T12:18:56Z", "pushedAt": "2026-07-22T12:01:43Z", "latestRelease": { "name": "Bansos v0.0.13", @@ -1320,7 +1320,7 @@ "url": "https://github.com/ammar-rasyidi/mandum-rimba", "homepage": "https://www.mandumrimba.org", "language": "TypeScript", - "stars": 20, + "stars": 21, "forks": 5, "topics": [ "conservation", @@ -1337,7 +1337,7 @@ "pmtiles", "wildlife" ], - "updatedAt": "2026-07-21T15:22:06Z", + "updatedAt": "2026-07-22T13:53:51Z", "pushedAt": "2026-07-20T10:31:33Z", "latestRelease": { "name": "Mandum Rimba v1.0.0", @@ -1591,8 +1591,8 @@ "stars": 14, "forks": 2, "topics": [], - "updatedAt": "2026-07-19T13:15:57Z", - "pushedAt": "2026-07-19T13:15:50Z", + "updatedAt": "2026-07-22T12:27:39Z", + "pushedAt": "2026-07-22T12:26:04Z", "latestRelease": { "name": "v1.2.54", "tagName": "v1.2.54", @@ -1606,7 +1606,7 @@ "openPullRequests": 0, "subscribers": 0, "communityHealth": 57, - "readmeHtml": "

Superagent ๐Ÿš€

\n

Superagent is an interactive, terminal-based AI coding assistant designed to facilitate the cycle of development, testing, debugging, and application optimization directly from your workspace.

\n

It features a cyberpunk-styled terminal user interface built with terminal UI components, automatic tracking of model context token limits, a robust security permission layer, a 3-tier multi-agent orchestration system (Master Agent โ†’ Superagent โ†’ Subagent), and persistent integration with local terminal shells.

\n

\"Superagent

\n
\n

๐Ÿ“– Background

\n

In modern software development, developers frequently switch context between writing code, running terminal commands, inspecting system logs, searching documentation, and interacting with Large Language Models (LLMs).

\n

Superagent bridges this gap by providing an integrated terminal environment that understands your project's context automatically using a project specification file (agents.md), automates execution of independent tasks through secondary agents (subagents), and tracks LLM context window limits in real-time. Security is a primary design goal: every file modification, tool invocation, and shell command execution requires explicit user authorization.

\n
\n

๐Ÿ’Ž Unique Advantages

\n

Unlike standard headless execution bots or basic shell wrappers, Superagent is designed from the ground up as a fully interactive developer workspace companion:

\n
    \n
  • Real-Time Context Window Tracking & Intelligent Compacting: Traditional assistants run blind to token consumption. Superagent features a continuous visual dashboard tracking prompt tokens, completion costs, and remaining context windows, powered by a modular Context Manager with model-specific tokenizers (OpenAI/Anthropic). When the context grows too large, automatic compaction kicks in using pluggable strategies โ€” truncation, LLM-powered summarization, or semantic-aware scoring. Use /compact now to force compaction on demand, /pin to protect important messages from being compacted, and /compaction-history to audit all compaction events.
  • \n
  • Global Pinned Knowledge Store: Pinned messages are automatically stored in a persistent, cross-session knowledge base. Use /knowledge to browse and search pinned knowledge across ALL sessions and projects. AI agents can access this via search_pinned_knowledge and load_pinned_session tools, enabling them to learn from previous sessions' decisions and context.
  • \n
  • Granular Session Checkpoints: Never lose progress. Superagent lets you snapshot your conversational and code states into checkpoints (via /checkpoint). If an experimental approach fails, you can revert back instantly to a previous checkpoint, restoring the entire session timeline.
  • \n
  • 3-Tier Multi-Agent Orchestration (Experimental): Instead of doing all work sequentially under a single LLM thread, Superagent supports a full 3-tier agent hierarchy. A Master Agent orchestrates one or more Superagents, each isolated in their own git worktree for independent feature development. Superagents can further delegate atomic operations to ephemeral Subagents. It adopts explicit multi-stage planning, structured delegation with constraints and acceptance criteria, and automated self-verification. Launch with superagent --multi. Note: Multi-agent mode is currently experimental.
  • \n
  • Pre-Merge Auto-Debugging Loop: Ensures code quality at merge boundaries. Before any Superagent task is merged, a verification script runs builds and tests. If a failure occurs, the Master Agent triggers an auto-debugging loop (up to 3 retries), prompting the Superagent to analyze the logs, implement a fix, and verify it dynamically.
  • \n
  • Visible, Non-Headless Interactive Terminals: Most agents run shell commands in the background without visibility or interactivity. With /terminal, Superagent spawns a real, popped-up host emulator terminal window. This is perfect for running interactive servers, watch scripts, and commands that require manual inputs.
  • \n
  • Global Config & Repository Hygiene: No messy .env or log files cluttering your project codebase. All API keys, environment settings, and session logs are kept safe and clean in your user's global directory (~/.superagent-r/).
  • \n
  • Smart Workspace Discovery & Automatic Directory Trust: Automatically fingerprints and hashes the workspace files and structure on startup, caching results under ~/.superagent-r/workspace-caches/ to bypass redundant scans. It dynamically monitors and updates the cache when workspace changes occur in the agent loop. Additionally, git worktree directories created for Superagents (~/.superagent-r/worktrees/<name>) are automatically configured as trusted (safe.directory) in git to prevent \"dubious ownership\" warnings and errors.
  • \n
  • Automatic Checkpointing: In addition to manual checkpoints, Superagent automatically snapshots your session on every user message and before any destructive tool operation (file writes, deletions, etc.), with a built-in cooldown to avoid excessive snapshots. You always have a safe rollback point without lifting a finger.
  • \n
  • Mandatory Interactive Decision Points: All agent tiers (Master, Superagent, Subagent) are required to use the ask_question tool at every decision point โ€” choosing implementations, resolving ambiguity, or selecting approaches โ€” ensuring the AI never guesses or assumes on the user's behalf.
  • \n
  • AI-Guided Preset Initialization: Configure your workspace commands effortlessly. Superagent scans your codebase structure (such as dependencies, packages, and scripts) to automatically recommend, select, and construct terminal command presets with the /terminal init wizard.
  • \n
  • Multimodal Image Paste & Path Detection: Drag-and-drop or paste an image file path (like D:\\images\\screenshot.png) directly into the prompt to auto-attach it. Press Ctrl+V to automatically capture image binary data from your system clipboard (cross-platform support for Windows, macOS, and Linux). Attached images are rendered in a sleek visual queue above the prompt and transmitted as high-fidelity multimodal inputs to vision-capable models (e.g. Claude 3.5 Sonnet, GPT-4o), with automatic token tracking.
  • \n
  • Internal Hooks โ€” Custom Agent Tools: Extend Superagent's toolset with your own executable scripts directly from your project. Place a script in internal-hooks/<name>/ with a hook.json schema definition and an index.js entrypoint. Hooks are auto-discovered on startup and registered as first-class agent tools. Use /ih init <name> to scaffold the project, /ih dev <name> to run and test it locally, and /ih active to pick which hooks are active via an interactive multi-select checkbox dialog. Active selections are persisted per-project in ~/.superagent-r/model-config.json.
  • \n
\n
\n

๐Ÿ› ๏ธ Tech Stack & Architecture

\n

Superagent is built on modern Node.js technologies for high performance and modular architecture:

\n
    \n
  • Language: TypeScript (ES Modules)
  • \n
  • Runtime: Node.js (v18+)
  • \n
  • User Interface: Ink (React for the terminal) for a highly interactive, responsive visual layout.
  • \n
  • LLM Integration: Vercel AI SDK (ai, @ai-sdk/openai, @ai-sdk/anthropic) for structured and streaming interactions.
  • \n
  • Process Execution: Execa for reliable control of background and external processes.
  • \n
  • Testing: Vitest for fast and reliable unit testing.
  • \n
\n

Directory Structure

\n
superagent/\nโ”œโ”€โ”€ src/\nโ”‚   โ”œโ”€โ”€ cli.tsx                    # Main entrypoint; routes --multi flag to masterAgent\nโ”‚   โ”œโ”€โ”€ app.tsx                    # React UI wrapper and command handling logic\nโ”‚   โ”œโ”€โ”€ core/\nโ”‚   โ”‚   โ”œโ”€โ”€ agent.ts               # Core cognitive loop and instruction runner\nโ”‚   โ”‚   โ”œโ”€โ”€ masterAgent.ts         # Master Agent orchestrator (3-tier entry point)\nโ”‚   โ”‚   โ”œโ”€โ”€ config.ts              # Environment variable and global config management\nโ”‚   โ”‚   โ”œโ”€โ”€ checkpoints.ts         # Conversation state checkpoint save/load logic\nโ”‚   โ”‚   โ”œโ”€โ”€ slash-commands.ts      # Interactive command definitions\nโ”‚   โ”‚   โ””โ”€โ”€ tools/\nโ”‚   โ”‚       โ”œโ”€โ”€ types.ts           # Shared types: AgentTier, SubagentInstance, ToolSet\nโ”‚   โ”‚       โ”œโ”€โ”€ toolsets.ts        # ToolSet definitions per tier (master/super/sub)\nโ”‚   โ”‚       โ”œโ”€โ”€ prompts.ts         # System prompts per tier with dynamic context\nโ”‚   โ”‚       โ”œโ”€โ”€ state.ts           # Shared subagent registry and event emitters\nโ”‚   โ”‚       โ”œโ”€โ”€ shellTools.ts      # Command execution and background task control\nโ”‚   โ”‚       โ”œโ”€โ”€ systemTools.ts     # File operations, directory creation, port checks\nโ”‚   โ”‚       โ”œโ”€โ”€ subagentTools.ts   # Subagent instantiation (superagent tier)\nโ”‚   โ”‚       โ”œโ”€โ”€ superagentTools.ts # Superagent orchestration tools (master tier)\nโ”‚   โ”‚       โ”œโ”€โ”€ dynamicHooks.ts    # Internal hook discovery, loading, and active state\nโ”‚   โ”‚       โ””โ”€โ”€ networkTools.ts    # Web content fetch and browser integration\nโ”‚   โ””โ”€โ”€ components/                # React Ink components (visual stats, wizards)\nโ”œโ”€โ”€ bin/                           # Portable Python and setup scripts\nโ”œโ”€โ”€ tests/                         # Unit test suites using Vitest\nโ””โ”€โ”€ package.json                   # Project manifest and scripts\n
\n
\n

๐ŸŒŸ Key Developer Features

\n

1. Cyberpunk Terminal UI, Token Tracking & Model Speed

\n

A rich terminal interface showing live statistics on active prompt sizes, completion token counts, token cost summaries, active models, remaining context windows, and real-time model generation speed (tokens per second).

\n

2. Session Management & Checkpoints

\n

Allows developers to save the current state of a coding conversation and restore it at any point using /checkpoint save <name> and /checkpoint restore <id>. This allows you to safely experiment with different implementations. Checkpoints can be browsed, restored, or deleted via an interactive wizard (launched by /checkpoint, /checkpoint list, or Ctrl+P in multi-agent mode). Use the --resume or -r flag to continue where you left off. Multi-agent sessions are fully serialized, ensuring smooth restore and resume of running tasks and interactive prompts. Auto-checkpointing creates snapshots automatically on every user message and before destructive tool operations, with a cooldown to prevent excessive saves โ€” ensuring you always have a safe rollback point.

\n

3. 3-Tier Multi-Agent Orchestration (--multi) (Experimental)

\n
\n

[!WARNING]\nMulti-agent mode (--multi) is currently experimental and not recommended for production environments.

\n
\n

Launch with superagent --multi to activate the full 3-tier hierarchy:

\n
superagent --multi\n      โ”‚\n  Master Agent  (orchestrator tier)\n  Tools: invoke_superagent, await_superagents, merge_superagents, manage_superagents, define_superagent, send_message_to_superagent, manage_subagents, git_worktree\n  Spawns Superagents with git worktree isolation\n      โ”‚\n  Superagent  (per-feature coordinator/lead)\n  Tools: shell + file tools, invoke_subagent, manage_subagents, git_worktree\n  Isolated in its own git worktree\n  Can spawn Subagents for atomic ops\n      โ”‚\n  Subagent  (atomic operation tier)\n  Tools: file tools only (read/write/search)\n  Ephemeral, single-purpose execution\n
\n

Tier Responsibilities:

\n
    \n
  • Master Agent: High-level planning, task decomposition, and result merging. Manages which Superagents are running, lets you dynamically define custom Superagent roles/prompts, and allows sending interactive messages/instructions to active Superagents.
  • \n
  • Superagent: Feature coordination and development in an isolated git worktree. Responsible for leading implementation and delegating atomic operations (research, coding, testing) to specialized Subagents.
  • \n
  • Subagent: Atomic file/search operations delegated by a Superagent. Ephemeral โ€” lives only for the duration of a single task.
  • \n
\n

Advanced Orchestration Features:

\n
    \n
  • Pre-Merge Auto-Debugging Loop: Before merging changes from any Superagent branch, a verification phase runs builds and test suites in the worktree. If errors are encountered, an automatic feedback loop triggers (up to 3 retries) that sends the failure output to the Superagent, instructing it to automatically debug, fix, and commit updates before completing the task.
  • \n
  • ASCII Dependency Graph: The dashboard's active agents registry panel draws a real-time, hierarchical ASCII tree (using โ”œโ”€โ”€ and โ””โ”€โ”€ connectors) mapping active relationships between the Master Agent, spawned Superagents, and running subagents/tasks.
  • \n
  • Illegal Operation Reporting & Auto-Escalation: When a child agent attempts a blocked operation (e.g., unauthorized file modification, scope creep, or policy violation), a structured ViolationRecord event is emitted with severity levels (warning or critical). These violations automatically propagate up the agent hierarchy (Subagent โ†’ Superagent โ†’ Master Agent), enabling parent agents to track, log, and take corrective action โ€” including halting or redirecting the offending agent.
  • \n
  • Mandatory Interactive Decision Points: All tiers enforce the use of the ask_question tool at every decision point. Agents must present multiple-choice options to the user rather than guessing, assuming, or making unilateral decisions about implementation approaches, file selections, or design trade-offs.
  • \n
\n

Standard subagent roles (single-agent mode):

\n
    \n
  • Researcher: Explores the codebase and retrieves context (Read-Only).
  • \n
  • Coder: Implements code modifications and refactoring.
  • \n
  • Reviewer: Audits changes, runs tests, and validates implementations.
  • \n
  • software-tester: Automated browser testing (Playwright), browser log/error analysis, and visual UI/UX design taste checks.
  • \n
  • security-engineer: Security auditing, threat modeling, vulnerability scanning, and secure remediation.
  • \n
\n

4. Visible Terminal Windows (/terminal)

\n

Runs development servers, local builds, or test watchers in popped-up, visible OS terminal windows (Windows cmd, macOS Terminal, Linux x-terminal). It includes an AI-assisted preset initializer (/terminal init) to auto-configure workspace command presets.

\n

5. Structured Planning & Approvals

\n

For complex changes, the Master Agent enforces structured planning and execution boundaries:

\n
    \n
  • Explicit Multi-Stage Planning: The implementation plan is structured into three mandatory stages: Stage 1: Discovery & Dependency Mapping (dependency tracing), Stage 2: Interface & Contract Definition (API/types specification), and Stage 3: Spawning Roadmap (Superagent spawning checklist and branch topology).
  • \n
  • Structured Delegation: When invoking a Superagent, the Master Agent specifies explicit task constraints (files or logic NOT to modify) and acceptanceCriteria (a checklist of specific test cases to satisfy).
  • \n
  • Approval Checkpoint: The plan is written to the workspace root as implementation_plan.md and requires explicit user review and approval before any execution begins, guaranteeing complete oversight.
  • \n
\n

6. Safe Merge Strategy (v2)

\n

The merge system uses a safe-by-default strategy that prevents file corruption:

\n
    \n
  • Line-Based Conflict Resolution: When conflicts occur, the system first attempts safe line-based resolution (e.g., one side is empty, both sides identical, or one side is a subset). Only trivially safe conflicts are auto-resolved.
  • \n
  • Universal Post-Merge Validation: After a clean merge (or successful line-based resolution), the system runs validation checks:
      \n
    • Conflict marker detection (leftover <<<<<<< in files)
    • \n
    • Duplicate adjacent lines detection
    • \n
    • Duplicate attributes detection
    • \n
    • Line merging detection (multiple statements crammed onto one line)
    • \n
    • Diff sanity check (abnormally large diffs)
    • \n
    • Project-level validation (build/test/lint scripts)
    • \n
    \n
  • \n
  • Auto-Revert on Failure: If validation fails, the merge is automatically reverted before committing. No corrupted files are ever committed.
  • \n
  • Manual Resolution Required: Complex conflicts that cannot be safely resolved are aborted and reported to the user for manual resolution.
  • \n
\n

7. Advanced Superagent Modes

\n
    \n
  • Patch Mode (mode: 'patch'): Lightweight mode that skips worktree creation and operates directly in the parent's working directory. Ideal for small, targeted fixes (1-2 lines). Much faster than spawning a full Superagent. Includes safety warnings if the parent worktree has uncommitted changes.
  • \n
  • Base Branch (baseBranch: 'feat/...'): When a Superagent needs to build on top of another feature branch instead of the current HEAD, specify baseBranch to create the worktree from that branch. Useful for dependent features or building on top of in-progress work.
  • \n
\n

Example:

\n
invoke_superagent({\n  role: 'fix-html-corrupt',\n  task: 'Fix duplicate closing tags in Toolbar component',\n  branch: 'fix/toolbar-html',\n  baseBranch: 'feat/separate-compressor-menu',  // Build on top of this branch\n  mode: 'patch'  // Quick fix, no worktree needed\n})\n
\n

8. Centralized Logging

\n

All agent operations, including single-agent and 3-tier multi-agent processes, are dynamically logged to a central log file in the user's home directory (~/.superagent-r/superagent.log). The log maintains tier-aware indentation to cleanly trace parallel execution branches.

\n

9. Automatic Checkpointing

\n

Beyond manual /checkpoint commands, Superagent creates checkpoints automatically:

\n
    \n
  • On every user message: A snapshot is taken before processing each new user input, preserving the state prior to the agent's response.
  • \n
  • Before destructive operations: File writes, deletions, and other state-modifying tool calls trigger a checkpoint before execution.
  • \n
  • Cooldown-based: A configurable minimum interval between auto-checkpoints prevents excessive snapshots during rapid interactions.
  • \n
  • Non-blocking: Auto-checkpoints run asynchronously in the background and never interrupt the conversation flow. A visible notification appears in the terminal UI when one is created.
  • \n
\n

10. Illegal Operation Reporting & Auto-Escalation

\n

In multi-agent mode, the permission layer emits structured ViolationRecord events whenever a child agent attempts a blocked operation. These violations include:

\n
    \n
  • Severity levels: \"warning\" for soft blocks (e.g., scope creep attempts) and \"critical\" for hard policy violations (e.g., unauthorized file modifications).
  • \n
  • Automatic propagation: Violation events bubble up from Subagents โ†’ Superagents โ†’ Master Agent, allowing the parent agent to track, log, and take corrective action.
  • \n
  • Structured metadata: Each violation records the timestamp, tool name, reason code, description, and optional context (file path, command, worktree).
  • \n
\n
\n

๐Ÿ”ฌ Deep Dive: System Architecture & Core Logic

\n

Superagent features several robust subsystems that ensure stability, execution safety, and a seamless developer workflow:

\n

1. Active Host Diagnostics & Auto-Dependency Setup (androidSetup.ts)

\n

Superagent proactively audits and prepares your local machine's developer environment:

\n
    \n
  • Automatic Utility Provisioning: If ripgrep (rg for high-speed workspace indexing) or curl (on Windows) is missing on your host machine, Superagent automatically downloads, extracts, and places the binaries locally in ~/.superagent-r/bin/.
  • \n
  • Android CLI Orchestrator: Scans and provisions Google's official Android SDK command-line utilities using custom PowerShell (install.cmd for Windows) and Shell (install.sh for macOS/Linux) scripts.
  • \n
\n

2. 3-Tier Multi-Agent Architecture (masterAgent.ts, superagentTools.ts, subagentTools.ts)

\n

For parallel feature development, Superagent implements a 3-tier hierarchy:

\n
    \n
  • Tier Isolation: Each Superagent runs in an isolated git worktree (~/.superagent-r/worktrees/<name>), preventing file conflicts between concurrent agents.
  • \n
  • Instant Dependency Linking: To speed up execution, spawning a Superagent automatically links the root node_modules into the worktree using platform-specific symlinks (or directory junctions on Windows) instead of re-installing dependencies.
  • \n
  • Delegation Guardrails: Delegation depth is enforced per-tier โ€” Master can spawn Superagents, Superagents can spawn Subagents, Subagents cannot spawn further agents.
  • \n
  • Permission Scoping: Each tier gets a strictly scoped toolset. Master agents get orchestration, definition, and messaging tools; Superagents get shell + file tools; Subagents get file tools only.
  • \n
  • Dynamic Custom Roles: Master Agent can define customized Superagent types/roles dynamically using define_superagent with custom system prompts, enabling domain-specific behaviors.
  • \n
  • Interactive Messaging & Routing: Master Agent can send follow-up instructions and questions to active Superagents via send_message_to_superagent, permitting real-time collaboration. Multi-agent sessions are fully serialized, allowing dynamic resumption and routing of paused instances.
  • \n
  • Robust Worktree Cleanup: Terminating or killing Superagents (via manage_superagents with kill or kill_all actions) robustly cleans up and removes their corresponding Git worktrees, avoiding disk clutter.
  • \n
  • Structured Markdown Reporting: Every Superagent completes its task by printing a standardized markdown report (goal, actions taken, key findings, outcome status) that the Master Agent can parse and merge.
  • \n
  • Concurrent Task Isolation: Uses agentLocalStorage to track and isolate concurrent task logging paths, preventing environment variable clashes during parallel execution.
  • \n
  • Visual Log Streaming & Centralized Logging: Agent actions, thoughts, tool calls, and execution errors are formatted and logged in a nested visual tree layout with tier-aware indentation. All logs are dynamically captured and written to the global directory at ~/.superagent-r/superagent.log.
  • \n
\n

3. Execution Safety Guardrails (permissions.ts)

\n

A dedicated validation layer inspects all terminal execution commands before they are executed. It immediately blocks destructive command invocations, including:

\n
    \n
  • Directory wipes on root/home directories (rm -rf /, rmdir /s /q C:\\, etc.)
  • \n
  • Disk formatting/initialization commands (Format-Volume, Initialize-Disk, mkfs)
  • \n
  • System power commands (shutdown, reboot, Stop-Computer)
  • \n
  • Force process termination on critical system tasks
  • \n
  • Unverified remote script pipes (curl/wget | sh, Invoke-Expression/iex)
  • \n
\n

4. Background Job Scheduling & Timers (schedule)

\n

Superagent implements a background scheduler supporting:

\n
    \n
  • Active Waiting: Synchronous waiting (wait: true) showing a real-time countdown indicator directly on the stdout terminal.
  • \n
  • Asynchronous Timers: One-shot background reminders and recurring interval cron checks (e.g., 5m or 1h).
  • \n
  • Full Abort Signal Propagation: Timers immediately clean up processes and interval hooks upon getting a cancel or abort event from the agent core.
  • \n
\n

5. Auto-Checkpoint Engine

\n

Built into the core agent loop (agent.ts), the auto-checkpoint system:

\n
    \n
  • Triggers on user messages: A snapshot is taken before the agent processes each new user input.
  • \n
  • Triggers before destructive tools: File writes, deletions, and other mutating tool calls create a checkpoint before execution begins.
  • \n
  • Cooldown mechanism: A minimum time interval (AUTO_CHECKPOINT_COOLDOWN_MS) prevents excessive checkpoint creation during rapid interactions.
  • \n
  • Non-blocking: Runs asynchronously and swallows errors โ€” never interrupts the conversation flow. A visible notification event (checkpoint_auto) appears in the terminal UI.
  • \n
\n

6. Atomic Config Persistence

\n

Model configuration (model-config.json) uses atomic write operations to prevent file corruption. If the process is interrupted (e.g., Ctrl+C), the config file remains intact โ€” writes are first written to a temporary file and then atomically renamed, ensuring zero risk of partial/corrupt state.

\n

8. Chrome Extension Integration & Local Server (Experimental)

\n
\n

[!WARNING]\nThe Chrome Extension integration and local server are currently experimental features.

\n
\n

Superagent features a built-in REST API and Server-Sent Events (SSE) server (server.ts) that enables two-way integration with the browser via a Chrome Extension SidePanel:

\n
    \n
  • Local Server Engine: Run with superagent --server, starting an HTTP server on port 7888 (or custom port). The CLI automatically trust-checks the workspace directory initialized by the browser client.
  • \n
  • Bi-directional Streaming (SSE): Streams real-time thoughts, reasoning blocks, and tool executions to the Chrome SidePanel dynamically.
  • \n
  • Interactive Prompts Overlays: Intercepts tool execution permissions and question requests from active agents, routing them to the Chrome sidepanel as responsive overlay forms for immediate user authorization and feedback.
  • \n
  • Browser Automation Capabilities: Empowers the assistant to interact with active browser tabs by capturing tab content (grab page text or selection context), taking visible screenshots, reading client-side console error logs, and executing automated page tasks (navigation, scroll, click, and text entry).
  • \n
\n
\n

๐Ÿš€ Getting Started & Configuration

\n

Prerequisites

\n
    \n
  • Node.js v18+ or Bun v1.0+
  • \n
  • npm or Bun package manager
  • \n
\n

Installation

\n
    \n
  1. Clone and navigate into the repository:

    \n
    git clone <repository-url>\ncd superagent\n
    \n
  2. \n
  3. Install dependencies:\nUsing npm:

    \n
    npm install\n
    \n

    Or using Bun:

    \n
    bun install\n
    \n
  4. \n
  5. Make Superagent Executable Globally:\nTo install the superagent command globally on your system so you can invoke it from any directory, build the project and register it:

    \n

    Using npm:

    \n
    npm run build\nnpm link\n
    \n

    Or using Bun:

    \n
    bun run build\nbun link\n
    \n

    This compiles the TypeScript files to JavaScript and registers a global symlink pointing to your local repository build. Now, you can start the assistant from any directory simply by typing:

    \n
    superagent\n
    \n

    (To uninstall the global symlink, run npm unlink inside this directory).

    \n
  6. \n
\n

Linking and Running in Another Project

\n

If you want to use the local development version of Superagent inside another project using Bun:

\n
    \n
  1. In the superagent repository root directory, register the package:

    \n
    bun link\n
    \n
  2. \n
  3. In your target project's root directory, link the registered package:

    \n
    bun link superagent\n
    \n
  4. \n
  5. Start the assistant in your target project using bunx with the --bun flag (to run it fully under the Bun runtime instead of Node.js):

    \n
    bunx --bun superagent\n
    \n

    Alternatively, you can add a script in your target project's package.json:

    \n
    \"scripts\": {\n  \"superagent\": \"superagent\"\n}\n
    \n

    And run it using:

    \n
    bun run superagent\n
    \n
  6. \n
  7. Configure Global API Credentials:\nSuperagent stores all configuration โ€” provider credentials, model settings, rate limits, and system settings โ€” in a centralized JSON config file at ~/.superagent-r/model-config.json. The easiest way to configure everything is through the interactive slash commands:

    \n
    superagent\n# Then inside the terminal UI:\n/login     # Add API keys and configure providers\n/model     # Set active AI models per tier\n/settings  # Configure rate limits, concurrency, streaming, etc.\n
    \n

    Alternatively, you can create a .env file in ~/.superagent-r/ for optional runtime overrides:

    \n
    # Global model override (format: \"provider:model\" or just \"model\")\n# MODEL=openai:gpt-4o\n\n# Enable multi-agent mode via flag (or set SUPERAGENT_MULTI=true)\n# SUPERAGENT_MULTI=false\n
    \n
  8. \n
\n

๐Ÿ”‘ Multi-API Key & Model Management

\n

Superagent natively supports configuring multiple API providers concurrently. All provider profiles, API keys, and model settings are stored in ~/.superagent-r/model-config.json and managed through slash commands:

\n
    \n
  • /login โ€” Add or update provider profiles with API keys.
  • \n
  • /model โ€” Set active models per agent tier (Master, Superagent, Subagent).
  • \n
  • /settings โ€” Configure rate limits, concurrency, streaming, context window, and max iterations.
  • \n
\n

Custom providers (e.g., self-hosted Claude API proxies, Ollama, vLLM) are supported via /login custom <base_url> <key>. Anthropic-compatible endpoints are automatically detected and run with the Anthropic driver.

\n

To dynamically switch your active API provider or model at runtime, use the /login or /model slash commands. Changes take effect immediately without restarting the assistant.

\n

๐Ÿ”Œ Chrome Extension Setup (Experimental)

\n
\n

[!WARNING]\nThe Chrome Extension is currently experimental and may contain bugs or incomplete features.

\n
\n

Superagent includes a developer Chrome Extension that provides a cyberpunk-themed sidepanel interface to interact with your agent workspace directly inside the browser.

\n

Installation

\n
    \n
  1. Open Google Chrome and navigate to chrome://extensions/.
  2. \n
  3. Enable Developer mode using the toggle switch in the top-right corner.
  4. \n
  5. Click Load unpacked in the top-left corner.
  6. \n
  7. Select the chrome-extension folder located at the root of your cloned Superagent repository.
  8. \n
  9. The extension \"Superagent AI Coding SidePanel\" is now ready. Click the extension icon in Chrome or pin it to open the sidepanel interface.
  10. \n
\n

Usage

\n
    \n
  1. Start the Superagent local server (by default it listens on port 7888):
    superagent --server 7888\n
    \n
  2. \n
  3. Open the sidepanel extension in Chrome.
  4. \n
  5. Input the absolute path of your workspace folder in the Workspace Path input field.
  6. \n
  7. (Optional) Provide the security API Token if configured.
  8. \n
  9. Select the Agent Mode (Single or Multi) and toggle Resume last session if you wish to restore previous state.
  10. \n
  11. Click LAUNCHING SESSION to initialize and connect.
  12. \n
  13. You can now chat, view task checklists, monitor the agent tree, and let the agent automate tab actions.
  14. \n
\n

โš™๏ธ Development Scripts

\n

Run the following scripts during development:

\n
    \n
  • Start Development Mode:\nUsing npm:

    \n
    npm run dev\n
    \n

    Or using Bun:

    \n
    bun run dev\n
    \n
  • \n
  • Start Multi-Agent Mode (3-tier orchestration):\nUsing npm:

    \n
    npm run dev -- --multi\n
    \n

    Or using Bun:

    \n
    bun run dev --multi\n
    \n

    (Or globally: superagent --multi)

    \n
  • \n
  • Start Chrome Extension API Server:\nUsing npm:

    \n
    npm run dev -- --server [port]\n
    \n

    Or using Bun:

    \n
    bun run dev --server [port]\n
    \n

    (Or globally: superagent --server [port])

    \n
  • \n
  • Resume Last Session:\nUsing npm:

    \n
    npm run dev -- --resume\n
    \n

    Or using Bun:

    \n
    bun run dev --resume\n
    \n
  • \n
  • Compile TypeScript:\nUsing npm:

    \n
    npm run build\n
    \n

    Or using Bun:

    \n
    bun run build\n
    \n
  • \n
  • Run Production Build:\nUsing npm:

    \n
    npm start\n
    \n

    Or using Bun:

    \n
    bun start\n
    \n
  • \n
  • Run Unit Tests:\nUsing npm:

    \n
    npm test\n
    \n

    Or using Bun:

    \n
    bun test\n
    \n
  • \n
\n
\n

๐Ÿ’ฌ Interactive Slash Commands

\n

Superagent supports a wide range of slash commands within the terminal chat to manage session state, configure the assistant, and run commands.

\n

Navigation & Session Control

\n
    \n
  • /new: Starts a fresh conversation session. Wipes the chat history, resets agent states, and deletes temporary checkpoints.
  • \n
  • /resume: Opens an interactive visual wizard listing previous session histories, allowing you to select and resume any past conversation.
  • \n
  • /clear: Wipes the visual logs and terminal chat screen while maintaining the current conversation history.
  • \n
  • /compact: Shows the current ContextManager status including compaction count, total tokens saved, current state, and last compaction strategy used.
  • \n
  • /compact now: Forces manual compaction on demand. Displays tokens before/after, tokens saved, and the strategy used (truncation, summarization, or semantic).
  • \n
  • /pin: Pin important messages to prevent them from being removed during compaction. Pinned messages store full content, agent tags, and sync to the global knowledge store. Subcommands: /pin list (view pinned messages with metadata), /pin last (pin the last user message), /pin unpin <id> (remove a pin), /pin view <index> (view full pinned content), /pin tag <index> <label> (tag a pinned message), /pin list-messages (show all messages with indexes).
  • \n
  • /knowledge (alias: /k): Browse and search the global pinned knowledge store โ€” important messages pinned across ALL sessions and projects. Subcommands: /knowledge (list all entries), /knowledge <query> (search), /knowledge projects (list projects with pins).
  • \n
  • /search-history <query> (alias: /sh): Search conversation history. Add --all flag to search across ALL sessions and projects (e.g., /search-history auth login --all). Add --debug flag to display step-by-step logs of the AI semantic matching and summary generation process (e.g., /search-history auth login --debug).
  • \n
  • /compaction-history (alias: /ch): View the full audit trail of compaction events with timestamps, strategies used, tokens saved, and messages preserved.
  • \n
  • /quit or /exit: Safely exits the application.
  • \n
\n

State Checkpoints

\n
    \n
  • /checkpoint (or /checkpoint <name>): Saves a snapshot of your current conversation history, active model state, and planning states.
  • \n
  • /checkpoint list (or /checkpoint with no args): Opens an interactive wizard listing all saved checkpoints with relative timestamps, message counts, and Git commit tags. From the wizard, you can restore or delete any checkpoint.
  • \n
  • /checkpoint restore <id>: Restores a checkpoint by its ID. If no ID is provided, opens a pre-filtered restore wizard. Automatically terminates running subagents/tasks and reverts the agent's internal state to the checkpoint.
  • \n
  • /checkpoint delete <id>: Deletes a specific checkpoint by its ID. If no ID is provided, opens a pre-filtered delete wizard for interactive selection.
  • \n
  • Auto-Checkpoint Notifications: When an auto-checkpoint is created (e.g., before destructive operations), a visible system notification appears in the terminal UI.
  • \n
  • Ctrl+P (Multi-Agent): In multi-agent dashboard mode, press Ctrl+P to open the interactive checkpoint browser wizard.
  • \n
\n

Automation & Tasks

\n
    \n
  • /goal <description>: Activates Goal Mode. The assistant enters a persistent, autonomous loop (up to 200 iterations) to accomplish the goal (e.g., /goal write a full suite of unit tests for auth.ts).
  • \n
  • /init: Runs a system audit. Checks OS info, Node.js version, Git repository status, active model configuration, and auto-generates the agents.md specification file.
  • \n
  • /agents: Lists all active subagents and details about the preconfigured types (researcher, coder, reviewer).
  • \n
  • /processes (or /procs): Displays active background processes managed by the agent, along with a visual progress bar and a checklist parsed from the current task.md.
  • \n
\n

Terminal & Presets

\n
    \n
  • /terminal <command>: Spawns a visible, popped-up terminal window executing the specified command.
  • \n
  • /terminal preset <name> (or /terminal <preset_name>): Executes a command preset defined in your terminal-presets.json or .superagent-r/terminal-presets.json.
  • \n
  • /terminal init: Launches an interactive, AI-guided wizard that scans your workspace files (like package.json, Cargo.toml, etc.), suggests relevant run commands, and writes them to .superagent-r/terminal-presets.json.
  • \n
\n

Skills & Plugins

\n
    \n
  • /skills: Displays a visual wizard containing all currently installed automation templates and guidelines.
  • \n
  • /install <owner/repo>: Installs new automated developer skills directly from remote repositories via npx skills add.
  • \n
\n

Internal Hooks

\n
    \n
  • /ih init <name> (alias: /internal-hooks init <name>): Scaffolds a new internal hook project workspace under internal-hooks/<name>/, creating hook.json (tool schema), package.json, index.js (entrypoint), and test-payload.json (dev test fixture). The new hook is automatically activated and hot-reloaded into the agent's toolset.
  • \n
  • /ih dev <name>: Runs the hook's dev script (from package.json) or falls back to the command field in hook.json, piping test-payload.json as stdin. Ideal for rapid local iteration.
  • \n
  • /ih active: Opens an interactive multi-select checkbox dialog listing all discovered hooks. Space to check/uncheck, Enter to confirm. The selected set is saved per-project in ~/.superagent-r/model-config.json and takes effect immediately.
  • \n
\n

Provider & Model Settings

\n
    \n
  • /login: Opens a visual wizard to add API credentials, switch active providers, or list configured providers. You can also log in directly via /login <key> or /login custom <base_url> <key>.
  • \n
  • /model <name>: Switches the active Large Language Model (e.g., /model openai/gpt-4o or /model google/gemini-2.5-flash). Running without arguments prints the active model name.
  • \n
\n
\n

โœ๏ธ Authors & Contributors

\n

Developed and maintained by:

\n\n

For guidelines on how to contribute to features and bug fixes, please see CONTRIBUTING.md.

\n
\n

๐Ÿ“„ License

\n

This project is licensed under the MIT License - see the LICENSE file for details.

\n

Copyright (c) 2026 Rudy H. hrudy715@gmail.com

\n" + "readmeHtml": "

Superagent ๐Ÿš€

\n

Superagent is an interactive, terminal-based AI coding assistant designed to facilitate the cycle of development, testing, debugging, and application optimization directly from your workspace.

\n

It features a cyberpunk-styled terminal user interface built with terminal UI components, automatic tracking of model context token limits, a robust security permission layer, a 3-tier multi-agent orchestration system (Master Agent โ†’ Superagent โ†’ Subagent), and persistent integration with local terminal shells.

\n

\"Superagent

\n
\n

๐Ÿ“– Background

\n

In modern software development, developers frequently switch context between writing code, running terminal commands, inspecting system logs, searching documentation, and interacting with Large Language Models (LLMs).

\n

Superagent bridges this gap by providing an integrated terminal environment that understands your project's context automatically using a project specification file (agents.md), automates execution of independent tasks through secondary agents (subagents), and tracks LLM context window limits in real-time. Security is a primary design goal: every file modification, tool invocation, and shell command execution requires explicit user authorization.

\n
\n

๐Ÿ’Ž Unique Advantages

\n

Unlike standard headless execution bots or basic shell wrappers, Superagent is designed from the ground up as a fully interactive developer workspace companion:

\n
    \n
  • Real-Time Context Window Tracking & Intelligent Compacting: Traditional assistants run blind to token consumption. Superagent features a continuous visual dashboard tracking prompt tokens, completion costs, and remaining context windows, powered by a modular Context Manager with model-specific tokenizers (OpenAI/Anthropic). When the context grows too large, automatic compaction kicks in using pluggable strategies โ€” truncation, LLM-powered summarization, or semantic-aware scoring. Use /compact now to force compaction on demand, /pin to protect important messages from being compacted, and /compaction-history to audit all compaction events.
  • \n
  • Global Pinned Knowledge Store: Pinned messages are automatically stored in a persistent, cross-session knowledge base. Use /knowledge to browse and search pinned knowledge across ALL sessions and projects. AI agents can access this via search_pinned_knowledge and load_pinned_session tools, enabling them to learn from previous sessions' decisions and context.
  • \n
  • Granular Session Checkpoints: Never lose progress. Superagent lets you snapshot your conversational and code states into checkpoints (via /checkpoint). If an experimental approach fails, you can revert back instantly to a previous checkpoint, restoring the entire session timeline.
  • \n
  • 3-Tier Multi-Agent Orchestration (Experimental): Instead of doing all work sequentially under a single LLM thread, Superagent supports a full 3-tier agent hierarchy. A Master Agent orchestrates one or more Superagents, each isolated in their own git worktree for independent feature development. Superagents can further delegate atomic operations to ephemeral Subagents. It adopts explicit multi-stage planning, structured delegation with constraints and acceptance criteria, and automated self-verification. Launch with superagent --multi. Note: Multi-agent mode is currently experimental.
  • \n
  • Pre-Merge Auto-Debugging Loop: Ensures code quality at merge boundaries. Before any Superagent task is merged, a verification script runs builds and tests. If a failure occurs, the Master Agent triggers an auto-debugging loop (up to 3 retries), prompting the Superagent to analyze the logs, implement a fix, and verify it dynamically.
  • \n
  • Visible, Non-Headless Interactive Terminals: Most agents run shell commands in the background without visibility or interactivity. With /terminal, Superagent spawns a real, popped-up host emulator terminal window. This is perfect for running interactive servers, watch scripts, and commands that require manual inputs.
  • \n
  • Global Config & Repository Hygiene: No messy .env or log files cluttering your project codebase. All API keys, environment settings, and session logs are kept safe and clean in your user's global directory (~/.superagent-r/).
  • \n
  • Smart Workspace Discovery & Automatic Directory Trust: Automatically fingerprints and hashes the workspace files and structure on startup, caching results under ~/.superagent-r/workspace-caches/ to bypass redundant scans. It dynamically monitors and updates the cache when workspace changes occur in the agent loop. Additionally, git worktree directories created for Superagents (~/.superagent-r/worktrees/<name>) are automatically configured as trusted (safe.directory) in git to prevent \"dubious ownership\" warnings and errors.
  • \n
  • Automatic Checkpointing: In addition to manual checkpoints, Superagent automatically snapshots your session on every user message and before any destructive tool operation (file writes, deletions, etc.), with a built-in cooldown to avoid excessive snapshots. You always have a safe rollback point without lifting a finger.
  • \n
  • Mandatory Interactive Decision Points: All agent tiers (Master, Superagent, Subagent) are required to use the ask_question tool at every decision point โ€” choosing implementations, resolving ambiguity, or selecting approaches โ€” ensuring the AI never guesses or assumes on the user's behalf.
  • \n
  • AI-Guided Preset Initialization: Configure your workspace commands effortlessly. Superagent scans your codebase structure (such as dependencies, packages, and scripts) to automatically recommend, select, and construct terminal command presets with the /terminal init wizard.
  • \n
  • Multimodal Image Paste & Path Detection: Drag-and-drop or paste an image file path (like D:\\images\\screenshot.png) directly into the prompt to auto-attach it. Press Ctrl+V to automatically capture image binary data from your system clipboard (cross-platform support for Windows, macOS, and Linux). Attached images are rendered in a sleek visual queue above the prompt and transmitted as high-fidelity multimodal inputs to vision-capable models (e.g. Claude 3.5 Sonnet, GPT-4o), with automatic token tracking.
  • \n
  • Internal Hooks โ€” Custom Agent Tools: Extend Superagent's toolset with your own executable scripts directly from your project. Place a script in internal-hooks/<name>/ with a hook.json schema definition and an index.js entrypoint. Hooks are auto-discovered on startup and registered as first-class agent tools. Use /ih init <name> to scaffold the project, /ih dev <name> to run and test it locally, and /ih active to pick which hooks are active via an interactive multi-select checkbox dialog. Active selections are persisted per-project in ~/.superagent-r/model-config.json.
  • \n
\n
\n

๐Ÿ› ๏ธ Tech Stack & Architecture

\n

Superagent is built on modern Node.js technologies for high performance and modular architecture:

\n
    \n
  • Language: TypeScript (ES Modules)
  • \n
  • Runtime: Node.js (v18+)
  • \n
  • User Interface: Ink (React for the terminal) for a highly interactive, responsive visual layout.
  • \n
  • LLM Integration: Vercel AI SDK (ai, @ai-sdk/openai, @ai-sdk/anthropic) for structured and streaming interactions.
  • \n
  • Process Execution: Execa for reliable control of background and external processes.
  • \n
  • Testing: Vitest for fast and reliable unit testing.
  • \n
\n

Directory Structure

\n
superagent/\nโ”œโ”€โ”€ src/\nโ”‚   โ”œโ”€โ”€ cli.tsx                    # Main entrypoint; routes --multi flag to masterAgent\nโ”‚   โ”œโ”€โ”€ app.tsx                    # React UI wrapper and command handling logic\nโ”‚   โ”œโ”€โ”€ core/\nโ”‚   โ”‚   โ”œโ”€โ”€ agent.ts               # Core cognitive loop and instruction runner\nโ”‚   โ”‚   โ”œโ”€โ”€ masterAgent.ts         # Master Agent orchestrator (3-tier entry point)\nโ”‚   โ”‚   โ”œโ”€โ”€ config.ts              # Environment variable and global config management\nโ”‚   โ”‚   โ”œโ”€โ”€ checkpoints.ts         # Conversation state checkpoint save/load logic\nโ”‚   โ”‚   โ”œโ”€โ”€ slash-commands.ts      # Interactive command definitions\nโ”‚   โ”‚   โ””โ”€โ”€ tools/\nโ”‚   โ”‚       โ”œโ”€โ”€ types.ts           # Shared types: AgentTier, SubagentInstance, ToolSet\nโ”‚   โ”‚       โ”œโ”€โ”€ toolsets.ts        # ToolSet definitions per tier (master/super/sub)\nโ”‚   โ”‚       โ”œโ”€โ”€ prompts.ts         # System prompts per tier with dynamic context\nโ”‚   โ”‚       โ”œโ”€โ”€ state.ts           # Shared subagent registry and event emitters\nโ”‚   โ”‚       โ”œโ”€โ”€ shellTools.ts      # Command execution and background task control\nโ”‚   โ”‚       โ”œโ”€โ”€ systemTools.ts     # File operations, directory creation, port checks\nโ”‚   โ”‚       โ”œโ”€โ”€ subagentTools.ts   # Subagent instantiation (superagent tier)\nโ”‚   โ”‚       โ”œโ”€โ”€ superagentTools.ts # Superagent orchestration tools (master tier)\nโ”‚   โ”‚       โ”œโ”€โ”€ dynamicHooks.ts    # Internal hook discovery, loading, and active state\nโ”‚   โ”‚       โ”œโ”€โ”€ academicSearchTools.ts # Academic journal search engine API integrations\nโ”‚   โ”‚       โ””โ”€โ”€ networkTools.ts    # Web content fetch and browser integration\nโ”‚   โ””โ”€โ”€ components/                # React Ink components (visual stats, wizards)\nโ”œโ”€โ”€ bin/                           # Portable Python and setup scripts\nโ”œโ”€โ”€ tests/                         # Unit test suites using Vitest\nโ””โ”€โ”€ package.json                   # Project manifest and scripts\n
\n
\n

๐ŸŒŸ Key Developer Features

\n

1. Cyberpunk Terminal UI, Token Tracking & Model Speed

\n

A rich terminal interface showing live statistics on active prompt sizes, completion token counts, token cost summaries, active models, remaining context windows, and real-time model generation speed (tokens per second).

\n

2. Session Management & Checkpoints

\n

Allows developers to save the current state of a coding conversation and restore it at any point using /checkpoint save <name> and /checkpoint restore <id>. This allows you to safely experiment with different implementations. Checkpoints can be browsed, restored, or deleted via an interactive wizard (launched by /checkpoint, /checkpoint list, or Ctrl+P in multi-agent mode). Use the --resume or -r flag to continue where you left off. Multi-agent sessions are fully serialized, ensuring smooth restore and resume of running tasks and interactive prompts. Auto-checkpointing creates snapshots automatically on every user message and before destructive tool operations, with a cooldown to prevent excessive saves โ€” ensuring you always have a safe rollback point.

\n

3. 3-Tier Multi-Agent Orchestration (--multi) (Experimental)

\n
\n

[!WARNING]\nMulti-agent mode (--multi) is currently experimental and not recommended for production environments.

\n
\n

Launch with superagent --multi to activate the full 3-tier hierarchy:

\n
superagent --multi\n      โ”‚\n  Master Agent  (orchestrator tier)\n  Tools: invoke_superagent, await_superagents, merge_superagents, manage_superagents, define_superagent, send_message_to_superagent, manage_subagents, git_worktree\n  Spawns Superagents with git worktree isolation\n      โ”‚\n  Superagent  (per-feature coordinator/lead)\n  Tools: shell + file tools, invoke_subagent, manage_subagents, git_worktree\n  Isolated in its own git worktree\n  Can spawn Subagents for atomic ops\n      โ”‚\n  Subagent  (atomic operation tier)\n  Tools: file tools only (read/write/search)\n  Ephemeral, single-purpose execution\n
\n

Tier Responsibilities:

\n
    \n
  • Master Agent: High-level planning, task decomposition, and result merging. Manages which Superagents are running, lets you dynamically define custom Superagent roles/prompts, and allows sending interactive messages/instructions to active Superagents.
  • \n
  • Superagent: Feature coordination and development in an isolated git worktree. Responsible for leading implementation and delegating atomic operations (research, coding, testing) to specialized Subagents.
  • \n
  • Subagent: Atomic file/search operations delegated by a Superagent. Ephemeral โ€” lives only for the duration of a single task.
  • \n
\n

Advanced Orchestration Features:

\n
    \n
  • Pre-Merge Auto-Debugging Loop: Before merging changes from any Superagent branch, a verification phase runs builds and test suites in the worktree. If errors are encountered, an automatic feedback loop triggers (up to 3 retries) that sends the failure output to the Superagent, instructing it to automatically debug, fix, and commit updates before completing the task.
  • \n
  • ASCII Dependency Graph: The dashboard's active agents registry panel draws a real-time, hierarchical ASCII tree (using โ”œโ”€โ”€ and โ””โ”€โ”€ connectors) mapping active relationships between the Master Agent, spawned Superagents, and running subagents/tasks.
  • \n
  • Illegal Operation Reporting & Auto-Escalation: When a child agent attempts a blocked operation (e.g., unauthorized file modification, scope creep, or policy violation), a structured ViolationRecord event is emitted with severity levels (warning or critical). These violations automatically propagate up the agent hierarchy (Subagent โ†’ Superagent โ†’ Master Agent), enabling parent agents to track, log, and take corrective action โ€” including halting or redirecting the offending agent.
  • \n
  • Mandatory Interactive Decision Points: All tiers enforce the use of the ask_question tool at every decision point. Agents must present multiple-choice options to the user rather than guessing, assuming, or making unilateral decisions about implementation approaches, file selections, or design trade-offs.
  • \n
\n

Standard subagent roles (single-agent mode):

\n
    \n
  • Researcher: Explores the codebase and retrieves context (Read-Only).
  • \n
  • Coder: Implements code modifications and refactoring.
  • \n
  • Reviewer: Audits changes, runs tests, and validates implementations.
  • \n
  • software-tester: Automated browser testing (Playwright), browser log/error analysis, and visual UI/UX design taste checks.
  • \n
  • security-engineer: Security auditing, threat modeling, vulnerability scanning, and secure remediation.
  • \n
\n

4. Visible Terminal Windows (/terminal)

\n

Runs development servers, local builds, or test watchers in popped-up, visible OS terminal windows (Windows cmd, macOS Terminal, Linux x-terminal). It includes an AI-assisted preset initializer (/terminal init) to auto-configure workspace command presets.

\n

5. Structured Planning & Approvals

\n

For complex changes, the Master Agent enforces structured planning and execution boundaries:

\n
    \n
  • Explicit Multi-Stage Planning: The implementation plan is structured into three mandatory stages: Stage 1: Discovery & Dependency Mapping (dependency tracing), Stage 2: Interface & Contract Definition (API/types specification), and Stage 3: Spawning Roadmap (Superagent spawning checklist and branch topology).
  • \n
  • Structured Delegation: When invoking a Superagent, the Master Agent specifies explicit task constraints (files or logic NOT to modify) and acceptanceCriteria (a checklist of specific test cases to satisfy).
  • \n
  • Approval Checkpoint: The plan is written to the workspace root as implementation_plan.md and requires explicit user review and approval before any execution begins, guaranteeing complete oversight.
  • \n
\n

6. Safe Merge Strategy (v2)

\n

The merge system uses a safe-by-default strategy that prevents file corruption:

\n
    \n
  • Line-Based Conflict Resolution: When conflicts occur, the system first attempts safe line-based resolution (e.g., one side is empty, both sides identical, or one side is a subset). Only trivially safe conflicts are auto-resolved.
  • \n
  • Universal Post-Merge Validation: After a clean merge (or successful line-based resolution), the system runs validation checks:
      \n
    • Conflict marker detection (leftover <<<<<<< in files)
    • \n
    • Duplicate adjacent lines detection
    • \n
    • Duplicate attributes detection
    • \n
    • Line merging detection (multiple statements crammed onto one line)
    • \n
    • Diff sanity check (abnormally large diffs)
    • \n
    • Project-level validation (build/test/lint scripts)
    • \n
    \n
  • \n
  • Auto-Revert on Failure: If validation fails, the merge is automatically reverted before committing. No corrupted files are ever committed.
  • \n
  • Manual Resolution Required: Complex conflicts that cannot be safely resolved are aborted and reported to the user for manual resolution.
  • \n
\n

7. Advanced Superagent Modes

\n
    \n
  • Patch Mode (mode: 'patch'): Lightweight mode that skips worktree creation and operates directly in the parent's working directory. Ideal for small, targeted fixes (1-2 lines). Much faster than spawning a full Superagent. Includes safety warnings if the parent worktree has uncommitted changes.
  • \n
  • Base Branch (baseBranch: 'feat/...'): When a Superagent needs to build on top of another feature branch instead of the current HEAD, specify baseBranch to create the worktree from that branch. Useful for dependent features or building on top of in-progress work.
  • \n
\n

Example:

\n
invoke_superagent({\n  role: 'fix-html-corrupt',\n  task: 'Fix duplicate closing tags in Toolbar component',\n  branch: 'fix/toolbar-html',\n  baseBranch: 'feat/separate-compressor-menu',  // Build on top of this branch\n  mode: 'patch'  // Quick fix, no worktree needed\n})\n
\n

8. Centralized Logging

\n

All agent operations, including single-agent and 3-tier multi-agent processes, are dynamically logged to a central log file in the user's home directory (~/.superagent-r/superagent.log). The log maintains tier-aware indentation to cleanly trace parallel execution branches.

\n

9. Automatic Checkpointing

\n

Beyond manual /checkpoint commands, Superagent creates checkpoints automatically:

\n
    \n
  • On every user message: A snapshot is taken before processing each new user input, preserving the state prior to the agent's response.
  • \n
  • Before destructive operations: File writes, deletions, and other state-modifying tool calls trigger a checkpoint before execution.
  • \n
  • Cooldown-based: A configurable minimum interval between auto-checkpoints prevents excessive snapshots during rapid interactions.
  • \n
  • Non-blocking: Auto-checkpoints run asynchronously in the background and never interrupt the conversation flow. A visible notification appears in the terminal UI when one is created.
  • \n
\n

10. Illegal Operation Reporting & Auto-Escalation

\n

In multi-agent mode, the permission layer emits structured ViolationRecord events whenever a child agent attempts a blocked operation. These violations include:

\n
    \n
  • Severity levels: \"warning\" for soft blocks (e.g., scope creep attempts) and \"critical\" for hard policy violations (e.g., unauthorized file modifications).
  • \n
  • Automatic propagation: Violation events bubble up from Subagents โ†’ Superagents โ†’ Master Agent, allowing the parent agent to track, log, and take corrective action.
  • \n
  • Structured metadata: Each violation records the timestamp, tool name, reason code, description, and optional context (file path, command, worktree).
  • \n
\n
\n

๐Ÿ”ฌ Deep Dive: System Architecture & Core Logic

\n

Superagent features several robust subsystems that ensure stability, execution safety, and a seamless developer workflow:

\n

1. Active Host Diagnostics & Auto-Dependency Setup (androidSetup.ts)

\n

Superagent proactively audits and prepares your local machine's developer environment:

\n
    \n
  • Automatic Utility Provisioning: If ripgrep (rg for high-speed workspace indexing) or curl (on Windows) is missing on your host machine, Superagent automatically downloads, extracts, and places the binaries locally in ~/.superagent-r/bin/.
  • \n
  • Android CLI Orchestrator: Scans and provisions Google's official Android SDK command-line utilities using custom PowerShell (install.cmd for Windows) and Shell (install.sh for macOS/Linux) scripts.
  • \n
\n

2. 3-Tier Multi-Agent Architecture (masterAgent.ts, superagentTools.ts, subagentTools.ts)

\n

For parallel feature development, Superagent implements a 3-tier hierarchy:

\n
    \n
  • Tier Isolation: Each Superagent runs in an isolated git worktree (~/.superagent-r/worktrees/<name>), preventing file conflicts between concurrent agents.
  • \n
  • Instant Dependency Linking: To speed up execution, spawning a Superagent automatically links the root node_modules into the worktree using platform-specific symlinks (or directory junctions on Windows) instead of re-installing dependencies.
  • \n
  • Delegation Guardrails: Delegation depth is enforced per-tier โ€” Master can spawn Superagents, Superagents can spawn Subagents, Subagents cannot spawn further agents.
  • \n
  • Permission Scoping: Each tier gets a strictly scoped toolset. Master agents get orchestration, definition, and messaging tools; Superagents get shell + file tools; Subagents get file tools only.
  • \n
  • Dynamic Custom Roles: Master Agent can define customized Superagent types/roles dynamically using define_superagent with custom system prompts, enabling domain-specific behaviors.
  • \n
  • Interactive Messaging & Routing: Master Agent can send follow-up instructions and questions to active Superagents via send_message_to_superagent, permitting real-time collaboration. Multi-agent sessions are fully serialized, allowing dynamic resumption and routing of paused instances.
  • \n
  • Robust Worktree Cleanup: Terminating or killing Superagents (via manage_superagents with kill or kill_all actions) robustly cleans up and removes their corresponding Git worktrees, avoiding disk clutter.
  • \n
  • Structured Markdown Reporting: Every Superagent completes its task by printing a standardized markdown report (goal, actions taken, key findings, outcome status) that the Master Agent can parse and merge.
  • \n
  • Concurrent Task Isolation: Uses agentLocalStorage to track and isolate concurrent task logging paths, preventing environment variable clashes during parallel execution.
  • \n
  • Visual Log Streaming & Centralized Logging: Agent actions, thoughts, tool calls, and execution errors are formatted and logged in a nested visual tree layout with tier-aware indentation. All logs are dynamically captured and written to the global directory at ~/.superagent-r/superagent.log.
  • \n
\n

3. Execution Safety Guardrails (permissions.ts)

\n

A dedicated validation layer inspects all terminal execution commands before they are executed. It immediately blocks destructive command invocations, including:

\n
    \n
  • Directory wipes on root/home directories (rm -rf /, rmdir /s /q C:\\, etc.)
  • \n
  • Disk formatting/initialization commands (Format-Volume, Initialize-Disk, mkfs)
  • \n
  • System power commands (shutdown, reboot, Stop-Computer)
  • \n
  • Force process termination on critical system tasks
  • \n
  • Unverified remote script pipes (curl/wget | sh, Invoke-Expression/iex)
  • \n
\n

4. Background Job Scheduling & Timers (schedule)

\n

Superagent implements a background scheduler supporting:

\n
    \n
  • Active Waiting: Synchronous waiting (wait: true) showing a real-time countdown indicator directly on the stdout terminal.
  • \n
  • Asynchronous Timers: One-shot background reminders and recurring interval cron checks (e.g., 5m or 1h).
  • \n
  • Full Abort Signal Propagation: Timers immediately clean up processes and interval hooks upon getting a cancel or abort event from the agent core.
  • \n
\n

5. Auto-Checkpoint Engine

\n

Built into the core agent loop (agent.ts), the auto-checkpoint system:

\n
    \n
  • Triggers on user messages: A snapshot is taken before the agent processes each new user input.
  • \n
  • Triggers before destructive tools: File writes, deletions, and other mutating tool calls create a checkpoint before execution begins.
  • \n
  • Cooldown mechanism: A minimum time interval (AUTO_CHECKPOINT_COOLDOWN_MS) prevents excessive checkpoint creation during rapid interactions.
  • \n
  • Non-blocking: Runs asynchronously and swallows errors โ€” never interrupts the conversation flow. A visible notification event (checkpoint_auto) appears in the terminal UI.
  • \n
\n

6. Atomic Config Persistence

\n

Model configuration (model-config.json) uses atomic write operations to prevent file corruption. If the process is interrupted (e.g., Ctrl+C), the config file remains intact โ€” writes are first written to a temporary file and then atomically renamed, ensuring zero risk of partial/corrupt state.

\n

8. Chrome Extension Integration & Local Server (Experimental)

\n
\n

[!WARNING]\nThe Chrome Extension integration and local server are currently experimental features.

\n
\n

Superagent features a built-in REST API and Server-Sent Events (SSE) server (server.ts) that enables two-way integration with the browser via a Chrome Extension SidePanel:

\n
    \n
  • Local Server Engine: Run with superagent --server, starting an HTTP server on port 7888 (or custom port). The CLI automatically trust-checks the workspace directory initialized by the browser client.
  • \n
  • Bi-directional Streaming (SSE): Streams real-time thoughts, reasoning blocks, and tool executions to the Chrome SidePanel dynamically.
  • \n
  • Interactive Prompts Overlays: Intercepts tool execution permissions and question requests from active agents, routing them to the Chrome sidepanel as responsive overlay forms for immediate user authorization and feedback.
  • \n
  • Browser Automation Capabilities: Empowers the assistant to interact with active browser tabs by capturing tab content (grab page text or selection context), taking visible screenshots, reading client-side console error logs, and executing automated page tasks (navigation, scroll, click, and text entry).
  • \n
\n
\n

๐Ÿš€ Getting Started & Configuration

\n

Prerequisites

\n
    \n
  • Node.js v18+ or Bun v1.0+
  • \n
  • npm or Bun package manager
  • \n
\n

Installation

\n
    \n
  1. Clone and navigate into the repository:

    \n
    git clone <repository-url>\ncd superagent\n
    \n
  2. \n
  3. Install dependencies:\nUsing npm:

    \n
    npm install\n
    \n

    Or using Bun:

    \n
    bun install\n
    \n
  4. \n
  5. Make Superagent Executable Globally:\nTo install the superagent command globally on your system so you can invoke it from any directory, build the project and register it:

    \n

    Using npm:

    \n
    npm run build\nnpm link\n
    \n

    Or using Bun:

    \n
    bun run build\nbun link\n
    \n

    This compiles the TypeScript files to JavaScript and registers a global symlink pointing to your local repository build. Now, you can start the assistant from any directory simply by typing:

    \n
    superagent\n
    \n

    (To uninstall the global symlink, run npm unlink inside this directory).

    \n
  6. \n
\n

Linking and Running in Another Project

\n

If you want to use the local development version of Superagent inside another project using Bun:

\n
    \n
  1. In the superagent repository root directory, register the package:

    \n
    bun link\n
    \n
  2. \n
  3. In your target project's root directory, link the registered package:

    \n
    bun link superagent\n
    \n
  4. \n
  5. Start the assistant in your target project using bunx with the --bun flag (to run it fully under the Bun runtime instead of Node.js):

    \n
    bunx --bun superagent\n
    \n

    Alternatively, you can add a script in your target project's package.json:

    \n
    \"scripts\": {\n  \"superagent\": \"superagent\"\n}\n
    \n

    And run it using:

    \n
    bun run superagent\n
    \n
  6. \n
  7. Configure Global API Credentials:\nSuperagent stores all configuration โ€” provider credentials, model settings, rate limits, and system settings โ€” in a centralized JSON config file at ~/.superagent-r/model-config.json. The easiest way to configure everything is through the interactive slash commands:

    \n
    superagent\n# Then inside the terminal UI:\n/login     # Add API keys and configure providers\n/model     # Set active AI models per tier\n/settings  # Configure rate limits, concurrency, streaming, etc.\n
    \n

    Alternatively, you can create a .env file in ~/.superagent-r/ for optional runtime overrides:

    \n
    # Global model override (format: \"provider:model\" or just \"model\")\n# MODEL=openai:gpt-4o\n\n# Enable multi-agent mode via flag (or set SUPERAGENT_MULTI=true)\n# SUPERAGENT_MULTI=false\n
    \n
  8. \n
\n

๐Ÿ”‘ Multi-API Key & Model Management

\n

Superagent natively supports configuring multiple API providers concurrently. All provider profiles, API keys, and model settings are stored in ~/.superagent-r/model-config.json and managed through slash commands:

\n
    \n
  • /login โ€” Add or update provider profiles with API keys.
  • \n
  • /model โ€” Set active models per agent tier (Master, Superagent, Subagent).
  • \n
  • /settings โ€” Configure rate limits, concurrency, streaming, context window, and max iterations.
  • \n
\n

Custom providers (e.g., self-hosted Claude API proxies, Ollama, vLLM) are supported via /login custom <base_url> <key>. Anthropic-compatible endpoints are automatically detected and run with the Anthropic driver.

\n

To dynamically switch your active API provider or model at runtime, use the /login or /model slash commands. Changes take effect immediately without restarting the assistant.

\n

๐Ÿ”Œ Chrome Extension Setup (Experimental)

\n
\n

[!WARNING]\nThe Chrome Extension is currently experimental and may contain bugs or incomplete features.

\n
\n

Superagent includes a developer Chrome Extension that provides a cyberpunk-themed sidepanel interface to interact with your agent workspace directly inside the browser.

\n

Installation

\n
    \n
  1. Open Google Chrome and navigate to chrome://extensions/.
  2. \n
  3. Enable Developer mode using the toggle switch in the top-right corner.
  4. \n
  5. Click Load unpacked in the top-left corner.
  6. \n
  7. Select the chrome-extension folder located at the root of your cloned Superagent repository.
  8. \n
  9. The extension \"Superagent AI Coding SidePanel\" is now ready. Click the extension icon in Chrome or pin it to open the sidepanel interface.
  10. \n
\n

Usage

\n
    \n
  1. Start the Superagent local server (by default it listens on port 7888):
    superagent --server 7888\n
    \n
  2. \n
  3. Open the sidepanel extension in Chrome.
  4. \n
  5. Input the absolute path of your workspace folder in the Workspace Path input field.
  6. \n
  7. (Optional) Provide the security API Token if configured.
  8. \n
  9. Select the Agent Mode (Single or Multi) and toggle Resume last session if you wish to restore previous state.
  10. \n
  11. Click LAUNCHING SESSION to initialize and connect.
  12. \n
  13. You can now chat, view task checklists, monitor the agent tree, and let the agent automate tab actions.
  14. \n
\n

โš™๏ธ Development Scripts

\n

Run the following scripts during development:

\n
    \n
  • Start Development Mode:\nUsing npm:

    \n
    npm run dev\n
    \n

    Or using Bun:

    \n
    bun run dev\n
    \n
  • \n
  • Start Multi-Agent Mode (3-tier orchestration):\nUsing npm:

    \n
    npm run dev -- --multi\n
    \n

    Or using Bun:

    \n
    bun run dev --multi\n
    \n

    (Or globally: superagent --multi)

    \n
  • \n
  • Start Chrome Extension API Server:\nUsing npm:

    \n
    npm run dev -- --server [port]\n
    \n

    Or using Bun:

    \n
    bun run dev --server [port]\n
    \n

    (Or globally: superagent --server [port])

    \n
  • \n
  • Resume Last Session:\nUsing npm:

    \n
    npm run dev -- --resume\n
    \n

    Or using Bun:

    \n
    bun run dev --resume\n
    \n
  • \n
  • Compile TypeScript:\nUsing npm:

    \n
    npm run build\n
    \n

    Or using Bun:

    \n
    bun run build\n
    \n
  • \n
  • Run Production Build:\nUsing npm:

    \n
    npm start\n
    \n

    Or using Bun:

    \n
    bun start\n
    \n
  • \n
  • Run Unit Tests:\nUsing npm:

    \n
    npm test\n
    \n

    Or using Bun:

    \n
    bun test\n
    \n
  • \n
\n
\n

๐Ÿ’ฌ Interactive Slash Commands

\n

Superagent supports a wide range of slash commands within the terminal chat to manage session state, configure the assistant, and run commands.

\n

Navigation & Session Control

\n
    \n
  • /new: Starts a fresh conversation session. Wipes the chat history, resets agent states, and deletes temporary checkpoints.
  • \n
  • /resume: Opens an interactive visual wizard listing previous session histories, allowing you to select and resume any past conversation.
  • \n
  • /clear: Wipes the visual logs and terminal chat screen while maintaining the current conversation history.
  • \n
  • /compact: Shows the current ContextManager status including compaction count, total tokens saved, current state, and last compaction strategy used.
  • \n
  • /compact now: Forces manual compaction on demand. Displays tokens before/after, tokens saved, and the strategy used (truncation, summarization, or semantic).
  • \n
  • /pin: Pin important messages to prevent them from being removed during compaction. Pinned messages store full content, agent tags, and sync to the global knowledge store. Subcommands: /pin list (view pinned messages with metadata), /pin last (pin the last user message), /pin unpin <id> (remove a pin), /pin view <index> (view full pinned content), /pin tag <index> <label> (tag a pinned message), /pin list-messages (show all messages with indexes).
  • \n
  • /knowledge (alias: /k): Browse and search the global pinned knowledge store โ€” important messages pinned across ALL sessions and projects. Subcommands: /knowledge (list all entries), /knowledge <query> (search), /knowledge projects (list projects with pins).
  • \n
  • /search-history <query> (alias: /sh): Search conversation history. Add --all flag to search across ALL sessions and projects (e.g., /search-history auth login --all). Add --debug flag to display step-by-step logs of the AI semantic matching and summary generation process (e.g., /search-history auth login --debug).
  • \n
  • /compaction-history (alias: /ch): View the full audit trail of compaction events with timestamps, strategies used, tokens saved, and messages preserved.
  • \n
  • /quit or /exit: Safely exits the application.
  • \n
\n

State Checkpoints

\n
    \n
  • /checkpoint (or /checkpoint <name>): Saves a snapshot of your current conversation history, active model state, and planning states.
  • \n
  • /checkpoint list (or /checkpoint with no args): Opens an interactive wizard listing all saved checkpoints with relative timestamps, message counts, and Git commit tags. From the wizard, you can restore or delete any checkpoint.
  • \n
  • /checkpoint restore <id>: Restores a checkpoint by its ID. If no ID is provided, opens a pre-filtered restore wizard. Automatically terminates running subagents/tasks and reverts the agent's internal state to the checkpoint.
  • \n
  • /checkpoint delete <id>: Deletes a specific checkpoint by its ID. If no ID is provided, opens a pre-filtered delete wizard for interactive selection.
  • \n
  • Auto-Checkpoint Notifications: When an auto-checkpoint is created (e.g., before destructive operations), a visible system notification appears in the terminal UI.
  • \n
  • Ctrl+P (Multi-Agent): In multi-agent dashboard mode, press Ctrl+P to open the interactive checkpoint browser wizard.
  • \n
\n

Automation & Tasks

\n
    \n
  • /goal <description>: Activates Goal Mode. The assistant enters a persistent, autonomous loop (up to 200 iterations) to accomplish the goal (e.g., /goal write a full suite of unit tests for auth.ts).
  • \n
  • /init: Runs a system audit. Checks OS info, Node.js version, Git repository status, active model configuration, and auto-generates the agents.md specification file.
  • \n
  • /agents: Lists all active subagents and details about the preconfigured types (researcher, coder, reviewer).
  • \n
  • /processes (or /procs): Displays active background processes managed by the agent, along with a visual progress bar and a checklist parsed from the current task.md.
  • \n
\n

Terminal & Presets

\n
    \n
  • /terminal <command>: Spawns a visible, popped-up terminal window executing the specified command.
  • \n
  • /terminal preset <name> (or /terminal <preset_name>): Executes a command preset defined in your terminal-presets.json or .superagent-r/terminal-presets.json.
  • \n
  • /terminal init: Launches an interactive, AI-guided wizard that scans your workspace files (like package.json, Cargo.toml, etc.), suggests relevant run commands, and writes them to .superagent-r/terminal-presets.json.
  • \n
\n

Skills & Plugins

\n
    \n
  • /skills: Displays a visual wizard containing all currently installed automation templates and guidelines.
  • \n
  • /install <owner/repo>: Installs new automated developer skills directly from remote repositories via npx skills add.
  • \n
\n

Internal Hooks

\n
    \n
  • /ih init <name> (alias: /internal-hooks init <name>): Scaffolds a new internal hook project workspace under internal-hooks/<name>/, creating hook.json (tool schema), package.json, index.js (entrypoint), and test-payload.json (dev test fixture). The new hook is automatically activated and hot-reloaded into the agent's toolset.
  • \n
  • /ih dev <name>: Runs the hook's dev script (from package.json) or falls back to the command field in hook.json, piping test-payload.json as stdin. Ideal for rapid local iteration.
  • \n
  • /ih active: Opens an interactive multi-select checkbox dialog listing all discovered hooks. Space to check/uncheck, Enter to confirm. The selected set is saved per-project in ~/.superagent-r/model-config.json and takes effect immediately.
  • \n
\n

Provider & Model Settings

\n
    \n
  • /login: Opens a visual wizard to add API credentials, switch active providers, or list configured providers. You can also log in directly via /login <key> or /login custom <base_url> <key>.
  • \n
  • /model <name>: Switches the active Large Language Model (e.g., /model openai/gpt-4o or /model google/gemini-2.5-flash). Running without arguments prints the active model name.
  • \n
\n
\n

โœ๏ธ Authors & Contributors

\n

Developed and maintained by:

\n\n

For guidelines on how to contribute to features and bug fixes, please see CONTRIBUTING.md.

\n
\n

๐Ÿ“„ License

\n

This project is licensed under the MIT License - see the LICENSE file for details.

\n

Copyright (c) 2026 Rudy H. hrudy715@gmail.com

\n" }, { "fullName": "muslimtify-org/muslimtify", diff --git a/src/data/revival.json b/src/data/revival.json index 65ddeef..1138a76 100644 --- a/src/data/revival.json +++ b/src/data/revival.json @@ -81,13 +81,13 @@ "description": "", "url": "https://github.com/MBenedictt/JudolSlayerProject", "homepage": "", - "stars": 102, + "stars": 101, "forks": 26, "language": "JavaScript", "topics": [], "license": null, "createdAt": "2025-04-04T15:50:35Z", - "updatedAt": "2026-07-17T04:19:14Z", + "updatedAt": "2026-07-22T14:01:50Z", "pushedAt": "2025-04-17T01:39:08Z", "archived": false, "disabled": false From ae867da0be027cd8c68cd45d59550f517297699c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 16:53:07 +0000 Subject: [PATCH 19/25] Sync content data --- src/data/projects.json | 78 +++++++++++++++++++++--------------------- src/data/revival.json | 4 +-- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 2b6342a..baf92fe 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 353, + "openIssues": 355, "openPullRequests": 7, "subscribers": 110, "communityHealth": 50, @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T14:01:45Z", - "pushedAt": "2026-07-22T13:58:48Z", + "updatedAt": "2026-07-22T16:36:35Z", + "pushedAt": "2026-07-22T16:35:08Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,11 +324,11 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 20, + "openIssues": 21, "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, - "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. omni recall surfaces the exact solution in under 10ms.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust for imperceptible latency.

\n
    \n
  • Pipeline Latency: < 10ms overhead.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
No. OMNI is written in Rust and executes the distillation pipeline in under 10ms.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" + "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. The agent surfaces it through the omni_recall MCP tool before it repeats the mistake.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust, though the end-to-end cost is not zero.

\n
    \n
  • Distillation: the scoring and collapsing pipeline itself runs in single-digit milliseconds.
  • \n
  • End to end: what you actually wait for is that plus the RewindStore write, and it grows with your history โ€” roughly 82 ms against a fresh database and ~308 ms against a 97 MB one. See Benchmarks before you assume it is free.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
Yes, measurably, and the cost grows with your history. The distillation pipeline itself runs in single-digit milliseconds, but every hooked command also writes to the local RewindStore: a 496-byte git status takes ~82 ms against a fresh database and ~308 ms against a 97 MB one, and a 16.5 KB cargo test takes ~276 ms. Budget for it. OMNI_PASSTHROUGH=1 skips the pipeline entirely when you need the raw output back.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" }, { "fullName": "hadziqmtqn/erd-builder-pro", @@ -340,8 +340,8 @@ "url": "https://github.com/hadziqmtqn/erd-builder-pro", "homepage": "https://www.erdbuilderpro.com", "language": "TypeScript", - "stars": 173, - "forks": 32, + "stars": 174, + "forks": 33, "topics": [ "coding", "developer-tools", @@ -352,7 +352,7 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-22T13:03:39Z", + "updatedAt": "2026-07-22T14:50:59Z", "pushedAt": "2026-07-22T07:01:42Z", "latestRelease": { "name": "v3.2.1", @@ -379,7 +379,7 @@ "url": "https://github.com/gnoviawan/termul", "homepage": "https://termul.dev", "language": "TypeScript", - "stars": 165, + "stars": 166, "forks": 34, "topics": [ "cross-platform", @@ -396,7 +396,7 @@ "terminal-emulator", "workspace-manager" ], - "updatedAt": "2026-07-22T08:31:59Z", + "updatedAt": "2026-07-22T15:41:25Z", "pushedAt": "2026-07-22T08:00:15Z", "latestRelease": { "name": "Termul Manager v0.4.8", @@ -507,31 +507,6 @@ "communityHealth": 75, "readmeHtml": "

\n \"Uteke\n

Uteke

\n

Give your AI a memory that never leaves your machine.

\n

\n Your AI forgets everything between sessions. Uteke fixes that โ€” one binary, fully offline, ~45ms recall.\n

\n \"CI\"\n \"Latest\n \"GitHub\n \"License:\n \"Rust\n \"Docker\"\n \"Recall\n

\n ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia\n


\n

โšก 30-Second Quick Start

\n
# Install (macOS, Linux, Windows)\ncurl -sSL codecora.dev/install | sh\n\n# Store a memory\nuteke remember \"Deploy v2.1 to staging at 3pm\"\n\n# Search it back โ€” by meaning, not just keywords\nuteke recall \"when do we deploy?\"\n
\n

That's it. No API keys. No Docker. No Python. No cloud.

\n

First run downloads the embedding model (~188MB, one-time) and you're running.

\n

Want richer memories? Add metadata:

\n
uteke remember \"Deploy v2.1 to staging\" \\\n  --tags deploy,staging \\\n  --entity staging-server \\\n  --category infrastructure\n
\n\n๐Ÿ“ฆ More install options\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodCommand
Homebrewbrew install codecoradev/tap/uteke
Cargocargo install uteke-cli
Dockerdocker run -d -p 127.0.0.1:8767:8767 -v uteke-data:/data ghcr.io/codecoradev/uteke:latest
BinaryGitHub Releases (macOS, Linux, Windows)
\n

๐Ÿ“– Full install guide ยท Docker docs

\n
\n

๐Ÿš€ Onboarding (New users & AI agents)

\n
\n

Are you an AI agent reading this? Your user just shared this repo link with you.\nRun uteke onboard to interactively configure uteke for your environment โ€” it will\ndetect your install, ask which agent you are, toggle features, write config, and\nshow you every command available. If non-interactive: uteke onboard --yes --agent <your-agent>.

\n
\n

New to uteke? One command takes you from zero to productive:

\n
uteke onboard\n
\n

The wizard will:

\n
    \n
  1. Detect if uteke is installed and if a store exists
  2. \n
  3. Ask which AI agent you use (Hermes, Claude, Cursor, Pi, OpenCode)
  4. \n
  5. Pick integration mode โ€” manual tool calls vs automatic memory-provider
  6. \n
  7. Toggle features on/off (Aging, Auto-maintenance, Graph rerank, Salience/Recency boost, Server mode)
  8. \n
  9. Write ~/.uteke/uteke.toml with your selections
  10. \n
  11. Install agent integration files automatically (uteke init)
  12. \n
  13. Showcase every uteke command grouped by category
  14. \n
\n

Non-interactive (CI, scripts, AI agents):

\n
uteke onboard --yes --agent hermes --namespace default\n
\n

๐Ÿ“– Full onboarding docs ยท CLI reference

\n
\n

๐Ÿ”ฅ Why Uteke?

\n

You just spent 2 hours explaining your codebase to ChatGPT. Next session? Blank slate. Again.

\n

Every AI tool forgets. Context windows fill up, sessions end, and your AI starts over every single time. Uteke gives it persistent memory โ€” and keeps it on your machine.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
UtekeMnemosyneMem0AgentMemoryLettaZepEngram
LanguageRust (single binary)Python (pip)PythonTypeScriptPythonPythonGo (single binary)
SetupOne binary (curl | sh)pip install + venvpip + Docker + Qdrantnpm + Docker (iii-engine)pip + Docker + Postgrespip + Docker + Neo4jOne binary
API keysโŒ Noneโš ๏ธ For remote embeddingsโœ… OpenAI/LLMโœ… LLM keyโœ… LLM keyโœ… LLM keyโŒ None
Works offlineโœ… Fullyโš ๏ธ OptionalโŒ Cloud embeddingโŒ Needs LLMโŒ Needs LLMโŒ Needs LLM + vector DBโœ… Fully
SearchHybrid (Vector + FTS5 + RRF)sqlite-vec + FTS5Vector + GraphVector + GraphVectorTemporal GraphFTS5 only
Recall speed~45ms~50ms+Network round-tripNetwork round-tripNetwork round-tripNetwork round-trip~Fast (local)
Multi-agentโœ… Rooms (built-in collaboration)โš ๏ธ Shared APIโŒโŒโŒโŒโŒ
Time-travelโœ… Native point-in-timeโš ๏ธ Temporal triplesโŒโŒโŒโŒโŒ
MCP serverโœ… JSON-RPC + HTTPโœ… stdio + SSEโŒโŒโŒโŒโŒ
Your dataโœ… Never leaves machineโœ… Local-firstโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโš ๏ธ Sent to LLM cloudโœ… Local
LicenseApache 2.0MITApache 2.0Apache 2.0Apache 2.0Apache 2.0Apache 2.0
\n
\n

Uteke vs Mnemosyne: Both are local-first with semantic + FTS5 search. Mnemosyne is the closest competitor (~1.5K stars, Python). Uteke wins on single binary (no Python runtime), rooms, time-travel queries, and zero runtime dependencies.

\n
\n
\n

Uteke vs Engram: Both are single-binary, offline, no-API-key tools. But Engram is FTS5-only (keyword search). Uteke adds vector semantic search + RRF fusion + rooms + time-travel + graph relationships + smart decay + document engine + batch import. Same simplicity thesis, 10ร— the features.

\n
\n
\n

Uteke vs AgentMemory/Mem0/Letta/Zep: Those are powerful โ€” but all require cloud LLM API keys and Docker infrastructure. Your data goes to OpenAI/Anthropic. Uteke runs fully offline with local ONNX embeddings. No Docker, no Python, no API keys.

\n
\n

\n \"Uteke\n


\n

๐Ÿ’ก What Can You Do With Uteke?

\n

๐Ÿค– Building AI agents? Give them persistent memory without cloud dependencies. Your agent remembers user preferences, past decisions, and context โ€” across sessions, fully offline.

\n

๐Ÿ‘ฅ Working in a team? Use Rooms to share knowledge. Meeting notes, project decisions, architecture choices โ€” searchable by everyone, attributed by author.

\n

๐Ÿ”’ Building for privacy-sensitive domains? Healthcare, finance, legal โ€” data stays on your machine. No API calls, no telemetry, no cloud. Local embeddings (ONNX, 768d).

\n

โŒจ๏ธ Power user who lives in the terminal? Uteke is your personal knowledge graph. Remember anything, recall by meaning, link related thoughts. All from the command line.

\n
\n

โœจ Features

\n

Core Memory

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿง  Hybrid SearchVector similarity + FTS5 full-text search, merged by Reciprocal Rank Fusion (RRF). Finds by meaning AND exact keywords.
๐Ÿ  RoomsGroup memories by context (meetings, projects, clients) with author attribution.
โณ Time-travelRecall memories as they existed at any point in time. uteke recall \"deploy\" --at 2025-01-15
๐Ÿท๏ธ Rich MetadataTags, entities, categories, key:value pairs on every memory.
๐Ÿงฉ Memory TypesTyped categories (fact, procedure, decision, etc.) with auto-inference.
โœ๏ธ Partial UpdatesUpdate content, tags, metadata, importance, or type without full rewrite.
๐Ÿ“Ž CitationsSource attribution on every memory (URL, file, user, import batch).
\n

Search & Intelligence

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”— Relationship GraphLink memories with typed edges (supersedes, contradicts, references). Auto-backlinks.
๐Ÿ”— Cross-Entity LinkingBidirectional memoryโ†”document references via [[doc-slug]] wikilinks.
๐Ÿค– Cosine Auto-LinkingAutomatically creates similar_to edges between related memories.
๐Ÿ“‰ Smart DecayComposite importance scoring. Pin what matters, let stale memories fade.
๐Ÿ“ˆ Salience + RecencyDual-axis recall boost by memory type and age.
๐Ÿ” Orphan DetectionFind disconnected, low-importance memories for cleanup.
๐ŸŒ™ Dream CycleOne-command maintenance: lint โ†’ backlinks โ†’ dedup โ†’ orphans.
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ”Œ MCP ServerJSON-RPC over stdio + Streamable HTTP. Works with Claude Code, Cursor, Hermes.
๐Ÿ–ฅ๏ธ Server ModePersistent daemon โ€” eliminates cold-start embedding load on every call.
๐Ÿ“‚ Batch ImportImport entire directories with auto-strategy routing (document vs. memory extraction).
๐Ÿ“ Document EngineWiki/knowledge base with uteke doc create/get/list and auto-chunking.
๐Ÿ“ฅ Import/ExportJSONL-based backup and restore.
๐Ÿ”‘ View-Only API KeysRead-only tokens for safe GET-only access to the server.
\n

Performance & Privacy

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureWhat it does
๐Ÿ“ฆ Single BinaryZero dependencies. No Docker needed, no database server, no Python, no API keys.
๐Ÿ”’ Fully OfflineLocal ONNX embeddings (EmbeddingGemma Q4, 768d). No telemetry, no cloud.
โšก Recall CacheLRU cache eliminates redundant embedding for repeated queries.
๐Ÿ”ฅ Tiered MemoryHot/Warm/Cold tracking with auto-cleanup of stale memories.
๐Ÿ”„ Embed FallbackGracefully degrades to no-op embedder if local model fails (never crashes).
๐Ÿ‘ฅ Multi-Agent NamespacesFully isolated memory per agent, zero overhead.
๐Ÿ“Š BenchmarksBuilt-in uteke bench for perf testing. See results.
\n\n๐Ÿ”Œ MCP Server config โ€” connect to Claude Code, Cursor, Hermes
// .mcp.json (Claude Code, Cursor)\n{ \"mcpServers\": { \"uteke\": { \"command\": \"uteke-mcp\" } } }\n
\n

For Claude Desktop, Hermes, and HTTP transport, see MCP docs.

\n

๐Ÿ“– Full documentation ยท CLI reference ยท Configuration

\n
\n

๐Ÿ—๏ธ Architecture

\n
graph LR\n    Input[User Query] --> Embed[Local ONNX Embedder<br/>768d, EmbeddingGemma Q4]\n    Embed --> HNSW[HNSW Vector Index<br/>usearch]\n    Embed --> FTS5[FTS5 Full-Text<br/>SQLite]\n    HNSW --> RRF[Reciprocal Rank Fusion<br/>k=60]\n    FTS5 --> RRF\n    RRF --> Results[Ranked Results]\n\n    style Input fill:#4a9eff,color:#fff\n    style Results fill:#4aff9e,color:#000\n    style RRF fill:#ff9e4a,color:#fff\n
\n

How hybrid search works:

\n
    \n
  1. HNSW (usearch) โ€” finds by meaning (\"deploy\" matches \"rollout\")
  2. \n
  3. FTS5 (SQLite) โ€” finds by exact terms (\"deploy\" matches \"deploy\")
  4. \n
  5. RRF (k=60) โ€” merges both ranked lists โ†’ best of both worlds
  6. \n
\n

Everything runs in-process. No network. No cloud. No server required (unless you want server mode).

\n

\n \"Uteke\n


\n

โ“ FAQ

\n\nHow is Uteke different from Mem0 or Letta?

Mem0 and Letta are great โ€” but they require cloud API keys (OpenAI/LLM) and external infrastructure (Docker, Postgres, Qdrant). Your data gets sent to a cloud LLM provider. Uteke is a single binary with zero API keys. All embeddings run locally via ONNX. Your data never leaves your machine. See comparison table.

\n\nHow is Uteke different from AgentMemory?

AgentMemory (25K stars) is a TypeScript/Node.js platform with 53 MCP tools and 12 auto-hooks. It's feature-rich but requires Docker + the iii-engine + LLM API keys. Uteke is Rust, zero dependencies, and works fully offline. If you want maximum integrations and don't mind cloud dependency โ†’ AgentMemory. If you want privacy, speed, and zero setup โ†’ Uteke.

\n\nHow is Uteke different from Engram?

Engram (2.4K stars, Go) shares our philosophy: single binary, zero deps, MCP server, local-first. The key difference is search: Engram uses FTS5 only (keyword matching). Uteke uses hybrid search (HNSW vector similarity + FTS5 + Reciprocal Rank Fusion) โ€” meaning you can search by meaning, not just exact words. Uteke also adds rooms, time-travel, graph relationships, smart decay, document engine, and batch import.

\n\nWhat can Uteke remember?

Anything text-based: decisions, meeting notes, code snippets, project context, personal notes, agent state. You can tag, categorize, and link memories. The --batch-dir flag lets you import entire document directories.

\n\nDoes it really work offline?

Yes. The embedding model (EmbeddingGemma Q4, 768d) downloads once (~188MB) on first run. After that, zero network calls. No telemetry. If the local model fails, Uteke degrades gracefully to a no-op embedder โ€” it never crashes and never calls a cloud API.

\n\nHow fast is recall?

~45ms as a library (measured at 100โ€“10K memories). No network round-trip because everything is local. The LRU recall cache eliminates redundant embedding computation for repeated queries.

\n\nCan I use Uteke with my existing AI tools?

Yes. Uteke ships with an MCP server that works with Claude Code, Cursor, and Hermes. You can also use the HTTP API directly in any language. See MCP setup โ†’

\n\nIs it production-ready?

Uteke is at v0.7.3 with 206 tests, CI/CD on every commit, and benchmark harness. It's used in production by the CodeCora team and other early adopters. Still in 0.x โ€” expect rough edges, but the core is stable.

\n
\n

๐Ÿค Contributing

\n
cargo build --workspace        # Build\ncargo test --workspace         # Test (206 tests)\ncargo clippy -- -D warnings    # Lint\ncargo fmt                      # Format\n
\n

Contributions welcome! Read CONTRIBUTING.md for the full guide.

\n
\n

๐Ÿ“„ License

\n

Apache License 2.0 โ€” use it, fork it, ship it.

\n
\n

โญ Star History

\n\n \n \n \n \"Star\n \n
\n

\n Found this useful? โญ Star this repo โ€” it helps others discover Uteke.\n

\n

\n \n \"Star\n \n

\n" }, - { - "fullName": "jipraks/kasirgratisan", - "name": "kasirgratisan", - "owner": "jipraks", - "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/10278519?v=4", - "description": "Free, Open Source, Offline Point of Sales Apps", - "metaDescription": "Free, Open Source, Offline Point of Sales Apps", - "url": "https://github.com/jipraks/kasirgratisan", - "homepage": "", - "language": "TypeScript", - "stars": 112, - "forks": 56, - "topics": [], - "updatedAt": "2026-07-20T04:58:20Z", - "pushedAt": "2026-07-13T00:57:27Z", - "latestRelease": null, - "archived": false, - "licenseSpdx": "MIT", - "createdAt": "2026-02-12T11:02:43Z", - "openIssues": 0, - "openPullRequests": 1, - "subscribers": 1, - "communityHealth": 42, - "readmeHtml": "

๐Ÿงพ FreeKasir

\n

A free, offline-first, open source Point of Sale (POS) Progressive Web App built for Indonesian Micro, Small, and Medium Enterprises (UMKM). All data is stored locally on the user's device โ€” no server, no registration, no cost.

\n
\n

โœจ Features

\n
    \n
  • POS / Cashier โ€” Full cashier interface with cart, per-item & per-transaction discounts, payment method selection, and automatic change calculation
  • \n
  • Open Bill โ€” Save transactions as open bills for later checkout, with customer name, table number, per-item notes, and remarks (also shown on the receipt)
  • \n
  • Multi-User Mode โ€” Optional opt-in mode with owner + staff roles and granular per-staff permissions (e.g. manage products, view reports, do refunds). Staff log in with username + 4-6 digit PIN
  • \n
  • Multi-Language โ€” Full Bahasa Indonesia, English, and Bahasa Malaysia translations via i18next. Language can be switched from Settings or during onboarding
  • \n
  • Responsive Layout โ€” Mobile-first phone UI with landscape/tablet mode featuring side-by-side cashier (products + cart) and adaptive grid columns
  • \n
  • Barcode Scanning โ€” Scan product barcodes via camera (supports EAN-13, EAN-8, UPC-A, UPC-E, Code-128, Code-39, ITF, Code-93, QR) with robust permission handling for installed PWAs, or manual keyboard entry
  • \n
  • Product Management โ€” Complete CRUD with categories, SKU (unique & required), units, optional descriptions (searchable, previewable in cashier), photos, and barcode support
  • \n
  • Master Data Satuan (Units) โ€” Manage units of measurement with CRUD; safe deletion blocked when in use by products
  • \n
  • Stock Management โ€” Stock in (from suppliers) and stock out (damaged, lost, returned, etc.)
  • \n
  • Automatic COGS (HPP) โ€” Cost of Goods Sold is automatically calculated using the weighted average method on each stock-in
  • \n
  • Sales Reports โ€” 7/30 day sales charts, top products, total revenue & profit
  • \n
  • Transaction History โ€” Browse completed transactions with open bill filter tabs; delete transactions with optional stock restore
  • \n
  • Supplier Management โ€” Manage supplier contacts and details
  • \n
  • Backup & Restore โ€” Export/import all data as JSON, with automatic backup reminders
  • \n
  • PWA โ€” Installable to home screen, fully offline with Service Worker (Workbox), supports any orientation. Install button is also available from Settings with adaptive instructions for iOS Safari and Chrome/Edge
  • \n
  • Android APK โ€” Ships as a native Android app via Capacitor from the same codebase, running in parallel with the PWA. Includes app icon, splash screen, and native status bar handling
  • \n
  • Bluetooth Thermal Printing โ€” Print receipts to ESC/POS thermal printers. PWA uses Web Bluetooth (Chrome on Android); the Android APK uses Classic Bluetooth, with a configurable default printer selection (APK-only setting)
  • \n
  • Onboarding โ€” Interactive tutorial for first-time users (the PWA install step is automatically skipped in the APK)
  • \n
  • Dark Mode โ€” Full dark theme support
  • \n
  • Theme Customization โ€” Pick your preferred accent color
  • \n
\n
\n

๐Ÿ› ๏ธ Tech Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerTechnology
FrameworkReact 18 + TypeScript
Build ToolVite
StylingTailwind CSS + shadcn/ui
Themingnext-themes (dark mode)
DatabaseIndexedDB via Dexie.js
ChartsRecharts
RoutingReact Router DOM v6
Forms & ValidationReact Hook Form + Zod
State@tanstack/react-query
IconsLucide React
i18ni18next + react-i18next
Datedate-fns (id, en-US, ms locales)
PWAvite-plugin-pwa (Workbox)
Barcodehtml5-qrcode (camera scanner + manual input)
Receipthtml2canvas (to PNG), Web Bluetooth Print (PWA), Bluetooth Classic (Android APK via Capacitor)
FontPlus Jakarta Sans
Native WrapperCapacitor 8 (Android)
\n
\n

๐Ÿš€ Getting Started

\n

Prerequisites

\n
    \n
  • Bun (recommended) or Node.js v18+ (via nvm)
  • \n
  • npm, yarn, or bun
  • \n
\n

Installation

\n
# Clone the repository\ngit clone https://github.com/user/kasirgratisan.git\ncd kasirgratisan\n\n# Install dependencies\nnpm install\n\n# Start the development server\nnpm run dev\n
\n

The app will be running at http://localhost:8080.

\n

Production Build (PWA/Web)

\n
npm run build\nnpm run preview\n
\n

Android Build (Capacitor)

\n

This project can also run as a native Android app using Capacitor while keeping the PWA/web version working from the same codebase.

\n

Requirements:

\n
    \n
  • Android Studio installed
  • \n
  • Android SDK configured
  • \n
  • JDK 21 (Android Studio bundled JBR works)
  • \n
\n

Set JAVA_HOME

\n

macOS / Linux:

\n
export JAVA_HOME=\"/Applications/Android Studio.app/Contents/jbr/Contents/Home\"\n
\n

Windows (PowerShell):

\n
$env:JAVA_HOME = \"C:\\Program Files\\Android\\Android Studio\\jbr\"\n
\n
\n

Adjust the path if your Android Studio is installed elsewhere.

\n
\n

Build debug APK

\n
npm run build\nnpx cap sync android\ncd android\n./gradlew assembleDebug\n
\n

Output: android/app/build/outputs/apk/debug/app-debug.apk

\n

Build release AAB (for Play Store)

\n
npm run build\nnpx cap sync android\ncd android\n./gradlew bundleRelease\n
\n

Output: android/app/build/outputs/bundle/release/app-release.aab

\n
\n

The release AAB must be signed before uploading to Google Play. See Android signing docs.

\n
\n

Useful scripts

\n
npm run cap:sync      # build web bundle and sync Capacitor\nnpm run cap:android   # build, sync, then open Android Studio\nnpm run cap:run       # build, sync, then run on connected Android device/emulator\n
\n
\n

๐Ÿ“ Project Structure

\n
src/\nโ”œโ”€โ”€ App.tsx                  # Root component & routing\nโ”œโ”€โ”€ main.tsx                 # Entry point\nโ”œโ”€โ”€ index.css                # Design tokens (HSL CSS variables)\nโ”œโ”€โ”€ lib/\nโ”‚   โ”œโ”€โ”€ db.ts                # Dexie database schema, interfaces, seed data\nโ”‚   โ”œโ”€โ”€ auth.ts              # Multi-user auth helpers (PIN hashing, sessions, validation)\nโ”‚   โ”œโ”€โ”€ utils.ts             # Utility functions (cn, etc.)\nโ”‚   โ”œโ”€โ”€ image-utils.ts       # Image compression utility\nโ”‚   โ””โ”€โ”€ version-check.ts     # Version check webhook\nโ”œโ”€โ”€ components/\nโ”‚   โ”œโ”€โ”€ layout/\nโ”‚   โ”‚   โ”œโ”€โ”€ AppLayout.tsx    # Main layout (responsive: max-w-lg mobile, max-w-6xl tablet/landscape)\nโ”‚   โ”‚   โ””โ”€โ”€ BottomNav.tsx    # Bottom nav (5 tabs, center cashier CTA)\nโ”‚   โ”œโ”€โ”€ Onboarding.tsx       # First-run tutorial & store setup\nโ”‚   โ”œโ”€โ”€ LoginScreen.tsx      # Multi-user login (username + PIN)\nโ”‚   โ”œโ”€โ”€ LockedPage.tsx       # Permission-gated route fallback\nโ”‚   โ”œโ”€โ”€ NavLink.tsx          # Permission-aware nav link\nโ”‚   โ”œโ”€โ”€ BackupReminder.tsx   # Backup reminder & export utility\nโ”‚   โ”œโ”€โ”€ Receipt.tsx          # Receipt component (view, download, share, Bluetooth print)\nโ”‚   โ”œโ”€โ”€ BarcodeScanner.tsx   # Barcode/QR scanner with PWA-aware permission handling\nโ”‚   โ”œโ”€โ”€ ThemeColorPicker.tsx # Accent color picker (8 presets)\nโ”‚   โ”œโ”€โ”€ LanguageSwitcher.tsx # Language picker (ID, EN, MS)\nโ”‚   โ””โ”€โ”€ ui/                  # shadcn/ui components (40+)\nโ”œโ”€โ”€ i18n/\nโ”‚   โ”œโ”€โ”€ index.ts             # i18next initialization\nโ”‚   โ””โ”€โ”€ locales/\nโ”‚       โ”œโ”€โ”€ id/               # Bahasa Indonesia\nโ”‚       โ”œโ”€โ”€ en/               # English\nโ”‚       โ””โ”€โ”€ ms/               # Bahasa Malaysia\nโ”œโ”€โ”€ pages/\nโ”‚   โ”œโ”€โ”€ Dashboard.tsx        # Home: stats, quick actions, low stock alerts\nโ”‚   โ”œโ”€โ”€ Cashier.tsx          # POS / cashier (barcode scan input, camera scanner, side-by-side cart on landscape)\nโ”‚   โ”œโ”€โ”€ Products.tsx         # Product CRUD (with description, SKU, units, photos)\nโ”‚   โ”œโ”€โ”€ Reports.tsx          # Sales reports & charts\nโ”‚   โ”œโ”€โ”€ Settings.tsx         # Settings (store, payments, categories, units, theme, backup, install PWA)\nโ”‚   โ”œโ”€โ”€ Users.tsx            # Multi-user management (owner only)\nโ”‚   โ”œโ”€โ”€ Supplier.tsx         # Supplier CRUD\nโ”‚   โ”œโ”€โ”€ StockIn.tsx          # Stock in + COGS calculation\nโ”‚   โ”œโ”€โ”€ StockOut.tsx         # Stock out\nโ”‚   โ”œโ”€โ”€ StockReport.tsx      # Stock movement reports\nโ”‚   โ”œโ”€โ”€ TransactionHistory.tsx # Transaction history with open bill filter tabs\nโ”‚   โ””โ”€โ”€ NotFound.tsx         # 404 page\nโ””โ”€โ”€ hooks/\n    โ”œโ”€โ”€ use-auth.tsx         # Multi-user auth context (current user, permissions, login/logout)\n    โ”œโ”€โ”€ use-pwa-install.ts   # PWA install prompt + standalone detection (incl. iOS)\n    โ”œโ”€โ”€ use-theme-color.ts   # Accent color persistence\n    โ”œโ”€โ”€ use-mobile.tsx       # Mobile breakpoint detection\n    โ””โ”€โ”€ use-toast.ts         # Toast helper\n
\n
\n

๐Ÿ’พ Database

\n

All data is stored locally in the browser using IndexedDB (via Dexie.js). No data is ever sent to any server.

\n

Tables

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TableDescription
usersMulti-user accounts (owner/staff role, hashed PIN, granular permissions)
categoriesProduct categories (name, color, icon)
productsMaster products (name, SKU, sell price, COGS, stock, unit, description)
unitsMaster units of measurement
suppliersSupplier data
stockInsStock-in records
stockOutsStock-out records
hppHistoryCOGS change audit trail
paymentMethodsPayment methods (Cash, Bank Transfer, QRIS, etc.)
transactionsSales transactions (status: open/completed, customer name, table number, remarks)
transactionItemsIndividual items within each transaction (per-item notes & discount)
storeSettingsStore settings & app state (incl. multi-user toggle)
\n

COGS Calculation (Weighted Average)

\n

When stock is received, COGS is automatically recalculated:

\n
New COGS = ((Old Stock ร— Old COGS) + (New Qty ร— Buy Price)) / (Old Stock + New Qty)\n
\n
\n

๐Ÿ’ฌ Feedback & Feature Requests

\n

Got suggestions, feature ideas, or found a bug? Submit and vote on our board:

\n

๐Ÿ‘‰ kasirgratisan.fider.io

\n
\n

๐Ÿ‘ฅ Community

\n

Join the Telegram group to discuss the app, ask questions, and share tips with other users:

\n

๐Ÿ‘‰ t.me/kasirgratisan

\n
\n

๐Ÿ’Ž Sponsors

\n

FreeKasir is proudly supported by:

\n\n \"Sumopod\"\n

Want to sponsor FreeKasir and have your logo featured here? Reach out at sponsorship@freekasir.com.

\n
\n

โ˜• Support the Developer

\n

FreeKasir is built and maintained for free. If you find it useful, you can buy the developer a coffee to support continued development:

\n

๐Ÿ‘‰ traktir.jipraks.com

\n
\n

๐Ÿค Contributing

\n

Contributions are welcome! Here's how:

\n
    \n
  1. Fork this repository
  2. \n
  3. Create a feature branch (git checkout -b feature/new-feature)
  4. \n
  5. Commit your changes (git commit -m 'Add new feature')
  6. \n
  7. Push to the branch (git push origin feature/new-feature)
  8. \n
  9. Open a Pull Request
  10. \n
\n

Guidelines

\n
    \n
  • UI text uses i18next โ€” add new strings to src/i18n/locales/{id,en,ms}/ JSON files inside the appropriate namespace (common, settings, products, reports, dashboard, onboarding)
  • \n
  • Use useTranslation('namespace') hook and t('key') in components
  • \n
  • Currency and number formatting should be locale-aware using i18n.language and NUMBER_LOCALES / CURRENCY_SYMBOL maps
  • \n
  • Date formatting should use date-fns with locale from LOCALES map
  • \n
  • Use existing shadcn/ui components from src/components/ui/
  • \n
  • All monetary values are stored as numbers representing Indonesian Rupiah (no decimals)
  • \n
  • Format numbers using toLocaleString('id-ID')
  • \n
  • New features must work fully offline (no API calls)
  • \n
  • Use useLiveQuery() from dexie-react-hooks for reactive data binding
  • \n
  • Gate sensitive UI/actions with the can() helper from useAuth() when multi-user is enabled
  • \n
\n
\n

๐Ÿ“„ License

\n

MIT License

\n
\n

๐Ÿ™ Credits

\n

Built with โค๏ธ for Indonesian small businesses.

\n\n" - }, { "fullName": "IlhamriSKY/PDDIKTI-kemdikbud-API", "name": "PDDIKTI-kemdikbud-API", @@ -542,14 +517,14 @@ "url": "https://github.com/IlhamriSKY/PDDIKTI-kemdikbud-API", "homepage": "https://pddikti.kemdiktisaintek.go.id/", "language": "Python", - "stars": 111, + "stars": 112, "forks": 25, "topics": [ "api-wrapper", "package", "python3" ], - "updatedAt": "2026-07-19T12:43:17Z", + "updatedAt": "2026-07-22T15:35:48Z", "pushedAt": "2025-07-30T13:28:14Z", "latestRelease": { "name": "V.2.0.6", @@ -566,6 +541,31 @@ "communityHealth": 42, "readmeHtml": "

๐ŸŽ“ PDDIKTI API Python Library

\n

\"Codacy\n\"python3.x\"\n\"Version\n\"Downloads\"\n\"Author\"\n\"License\"

\n
\n

Library Python untuk mengakses data PDDIKTI Kemdikbud dengan mudah, aman, dan terdokumentasi lengkap

\n
\n

Wrapper API Python yang powerful dan user-friendly untuk mengambil data dari PDDIKTI Kemdikbud. Library ini menyediakan interface yang mudah digunakan untuk mengakses data mahasiswa, dosen, perguruan tinggi, dan program studi di Indonesia dengan dukungan type hints, error handling yang komprehensif, dan dokumentasi lengkap.

\n

๐Ÿ“‹ Daftar Isi

\n\n

๐Ÿš€ Fitur Utama

\n
    \n
  • โœ… Type Hints Lengkap: Full type annotations untuk better IDE support
  • \n
  • โœ… Error Handling Komprehensif: Custom exceptions dan validation
  • \n
  • โœ… Context Manager Support: Resource management yang aman
  • \n
  • โœ… Dokumentasi Lengkap: Google-style docstrings dengan 63 API methods
  • \n
  • โœ… Performance Optimized: Connection pooling dan retry strategy
  • \n
  • โœ… Indonesian Context: Field explanations dalam konteks pendidikan Indonesia
  • \n
  • โœ… Flexible Parameters: Support untuk integer dan string parameters
  • \n
  • โœ… Production Ready: Enhanced validation dan logging
  • \n
\n

๐Ÿ“ฆ Instalasi

\n
pip install pddiktipy\n
\n

Requirements:

\n
    \n
  • Python 3.7+
  • \n
  • requests
  • \n
  • urllib3
  • \n
\n

โšก Quick Start

\n
from pddiktipy import api\nfrom pprint import pprint\n\n# Menggunakan context manager (recommended)\nwith api() as client:\n    # Cari semua data dengan keyword\n    hasil = client.search_all('Unika Soegijapranata')\n    pprint(hasil)\n    \n    # Cari mahasiswa spesifik\n    mahasiswa = client.search_mahasiswa('Ilham Riski Wibowo')\n    pprint(mahasiswa)\n
\n

โš ๏ธ Error Handling

\n

Library ini menyediakan error handling yang komprehensif:

\n
from pddiktipy import api\nfrom pddiktipy.exceptions import (\n    ValidationError, \n    APIConnectionError, \n    APITimeoutError,\n    PDDIKTIError\n)\n\ntry:\n    with api() as client:\n        # Ini akan raise ValidationError karena keyword kosong\n        result = client.search_mahasiswa(\"\")\n        \nexcept ValidationError as e:\n    print(f\"Error validasi: {e}\")\nexcept APIConnectionError as e:\n    print(f\"Error koneksi: {e}\")\nexcept APITimeoutError as e:\n    print(f\"Request timeout: {e}\")\nexcept PDDIKTIError as e:\n    print(f\"Error PDDIKTI API: {e}\")\n
\n

๐Ÿ“š Dokumentasi Lengkap

\n

โžก๏ธ API Documentation - 63 method API dengan dokumentasi komprehensif, contoh penggunaan, dan struktur data response

\n

๐Ÿ“Š Struktur Data Response

\n

Semua response API menggunakan TypedDict untuk type safety dan konsistensi. Struktur data disesuaikan dengan konteks pendidikan Indonesia dan standar PDDIKTI.

\n

๐Ÿ“ Changelog

\n

๐Ÿ“ Changelog - Riwayat versi dan roadmap pengembangan

\n

๐Ÿ“‹ Requirements

\n
    \n
  • Python 3.7+
  • \n
  • requests
  • \n
  • urllib3
  • \n
\n

๐Ÿงช Testing

\n

๐Ÿงช Testing Guide - Panduan testing dan quality assurance

\n

๐Ÿค Contributing

\n

๐Ÿค Contributing Guide - Panduan berkontribusi pada proyek

\n

๐Ÿ“„ License

\n

๐Ÿ“„ MIT License - Distributed under the MIT License

\n
\n

๐Ÿ“ž Support & Contact

\n\n
\n

โญ Jika library ini membantu proyek Anda, jangan lupa untuk memberikan star di GitHub!

\n" }, + { + "fullName": "jipraks/kasirgratisan", + "name": "kasirgratisan", + "owner": "jipraks", + "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/10278519?v=4", + "description": "Free, Open Source, Offline Point of Sales Apps", + "metaDescription": "Free, Open Source, Offline Point of Sales Apps", + "url": "https://github.com/jipraks/kasirgratisan", + "homepage": "", + "language": "TypeScript", + "stars": 112, + "forks": 56, + "topics": [], + "updatedAt": "2026-07-20T04:58:20Z", + "pushedAt": "2026-07-13T00:57:27Z", + "latestRelease": null, + "archived": false, + "licenseSpdx": "MIT", + "createdAt": "2026-02-12T11:02:43Z", + "openIssues": 0, + "openPullRequests": 1, + "subscribers": 1, + "communityHealth": 42, + "readmeHtml": "

๐Ÿงพ FreeKasir

\n

A free, offline-first, open source Point of Sale (POS) Progressive Web App built for Indonesian Micro, Small, and Medium Enterprises (UMKM). All data is stored locally on the user's device โ€” no server, no registration, no cost.

\n
\n

โœจ Features

\n
    \n
  • POS / Cashier โ€” Full cashier interface with cart, per-item & per-transaction discounts, payment method selection, and automatic change calculation
  • \n
  • Open Bill โ€” Save transactions as open bills for later checkout, with customer name, table number, per-item notes, and remarks (also shown on the receipt)
  • \n
  • Multi-User Mode โ€” Optional opt-in mode with owner + staff roles and granular per-staff permissions (e.g. manage products, view reports, do refunds). Staff log in with username + 4-6 digit PIN
  • \n
  • Multi-Language โ€” Full Bahasa Indonesia, English, and Bahasa Malaysia translations via i18next. Language can be switched from Settings or during onboarding
  • \n
  • Responsive Layout โ€” Mobile-first phone UI with landscape/tablet mode featuring side-by-side cashier (products + cart) and adaptive grid columns
  • \n
  • Barcode Scanning โ€” Scan product barcodes via camera (supports EAN-13, EAN-8, UPC-A, UPC-E, Code-128, Code-39, ITF, Code-93, QR) with robust permission handling for installed PWAs, or manual keyboard entry
  • \n
  • Product Management โ€” Complete CRUD with categories, SKU (unique & required), units, optional descriptions (searchable, previewable in cashier), photos, and barcode support
  • \n
  • Master Data Satuan (Units) โ€” Manage units of measurement with CRUD; safe deletion blocked when in use by products
  • \n
  • Stock Management โ€” Stock in (from suppliers) and stock out (damaged, lost, returned, etc.)
  • \n
  • Automatic COGS (HPP) โ€” Cost of Goods Sold is automatically calculated using the weighted average method on each stock-in
  • \n
  • Sales Reports โ€” 7/30 day sales charts, top products, total revenue & profit
  • \n
  • Transaction History โ€” Browse completed transactions with open bill filter tabs; delete transactions with optional stock restore
  • \n
  • Supplier Management โ€” Manage supplier contacts and details
  • \n
  • Backup & Restore โ€” Export/import all data as JSON, with automatic backup reminders
  • \n
  • PWA โ€” Installable to home screen, fully offline with Service Worker (Workbox), supports any orientation. Install button is also available from Settings with adaptive instructions for iOS Safari and Chrome/Edge
  • \n
  • Android APK โ€” Ships as a native Android app via Capacitor from the same codebase, running in parallel with the PWA. Includes app icon, splash screen, and native status bar handling
  • \n
  • Bluetooth Thermal Printing โ€” Print receipts to ESC/POS thermal printers. PWA uses Web Bluetooth (Chrome on Android); the Android APK uses Classic Bluetooth, with a configurable default printer selection (APK-only setting)
  • \n
  • Onboarding โ€” Interactive tutorial for first-time users (the PWA install step is automatically skipped in the APK)
  • \n
  • Dark Mode โ€” Full dark theme support
  • \n
  • Theme Customization โ€” Pick your preferred accent color
  • \n
\n
\n

๐Ÿ› ๏ธ Tech Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerTechnology
FrameworkReact 18 + TypeScript
Build ToolVite
StylingTailwind CSS + shadcn/ui
Themingnext-themes (dark mode)
DatabaseIndexedDB via Dexie.js
ChartsRecharts
RoutingReact Router DOM v6
Forms & ValidationReact Hook Form + Zod
State@tanstack/react-query
IconsLucide React
i18ni18next + react-i18next
Datedate-fns (id, en-US, ms locales)
PWAvite-plugin-pwa (Workbox)
Barcodehtml5-qrcode (camera scanner + manual input)
Receipthtml2canvas (to PNG), Web Bluetooth Print (PWA), Bluetooth Classic (Android APK via Capacitor)
FontPlus Jakarta Sans
Native WrapperCapacitor 8 (Android)
\n
\n

๐Ÿš€ Getting Started

\n

Prerequisites

\n
    \n
  • Bun (recommended) or Node.js v18+ (via nvm)
  • \n
  • npm, yarn, or bun
  • \n
\n

Installation

\n
# Clone the repository\ngit clone https://github.com/user/kasirgratisan.git\ncd kasirgratisan\n\n# Install dependencies\nnpm install\n\n# Start the development server\nnpm run dev\n
\n

The app will be running at http://localhost:8080.

\n

Production Build (PWA/Web)

\n
npm run build\nnpm run preview\n
\n

Android Build (Capacitor)

\n

This project can also run as a native Android app using Capacitor while keeping the PWA/web version working from the same codebase.

\n

Requirements:

\n
    \n
  • Android Studio installed
  • \n
  • Android SDK configured
  • \n
  • JDK 21 (Android Studio bundled JBR works)
  • \n
\n

Set JAVA_HOME

\n

macOS / Linux:

\n
export JAVA_HOME=\"/Applications/Android Studio.app/Contents/jbr/Contents/Home\"\n
\n

Windows (PowerShell):

\n
$env:JAVA_HOME = \"C:\\Program Files\\Android\\Android Studio\\jbr\"\n
\n
\n

Adjust the path if your Android Studio is installed elsewhere.

\n
\n

Build debug APK

\n
npm run build\nnpx cap sync android\ncd android\n./gradlew assembleDebug\n
\n

Output: android/app/build/outputs/apk/debug/app-debug.apk

\n

Build release AAB (for Play Store)

\n
npm run build\nnpx cap sync android\ncd android\n./gradlew bundleRelease\n
\n

Output: android/app/build/outputs/bundle/release/app-release.aab

\n
\n

The release AAB must be signed before uploading to Google Play. See Android signing docs.

\n
\n

Useful scripts

\n
npm run cap:sync      # build web bundle and sync Capacitor\nnpm run cap:android   # build, sync, then open Android Studio\nnpm run cap:run       # build, sync, then run on connected Android device/emulator\n
\n
\n

๐Ÿ“ Project Structure

\n
src/\nโ”œโ”€โ”€ App.tsx                  # Root component & routing\nโ”œโ”€โ”€ main.tsx                 # Entry point\nโ”œโ”€โ”€ index.css                # Design tokens (HSL CSS variables)\nโ”œโ”€โ”€ lib/\nโ”‚   โ”œโ”€โ”€ db.ts                # Dexie database schema, interfaces, seed data\nโ”‚   โ”œโ”€โ”€ auth.ts              # Multi-user auth helpers (PIN hashing, sessions, validation)\nโ”‚   โ”œโ”€โ”€ utils.ts             # Utility functions (cn, etc.)\nโ”‚   โ”œโ”€โ”€ image-utils.ts       # Image compression utility\nโ”‚   โ””โ”€โ”€ version-check.ts     # Version check webhook\nโ”œโ”€โ”€ components/\nโ”‚   โ”œโ”€โ”€ layout/\nโ”‚   โ”‚   โ”œโ”€โ”€ AppLayout.tsx    # Main layout (responsive: max-w-lg mobile, max-w-6xl tablet/landscape)\nโ”‚   โ”‚   โ””โ”€โ”€ BottomNav.tsx    # Bottom nav (5 tabs, center cashier CTA)\nโ”‚   โ”œโ”€โ”€ Onboarding.tsx       # First-run tutorial & store setup\nโ”‚   โ”œโ”€โ”€ LoginScreen.tsx      # Multi-user login (username + PIN)\nโ”‚   โ”œโ”€โ”€ LockedPage.tsx       # Permission-gated route fallback\nโ”‚   โ”œโ”€โ”€ NavLink.tsx          # Permission-aware nav link\nโ”‚   โ”œโ”€โ”€ BackupReminder.tsx   # Backup reminder & export utility\nโ”‚   โ”œโ”€โ”€ Receipt.tsx          # Receipt component (view, download, share, Bluetooth print)\nโ”‚   โ”œโ”€โ”€ BarcodeScanner.tsx   # Barcode/QR scanner with PWA-aware permission handling\nโ”‚   โ”œโ”€โ”€ ThemeColorPicker.tsx # Accent color picker (8 presets)\nโ”‚   โ”œโ”€โ”€ LanguageSwitcher.tsx # Language picker (ID, EN, MS)\nโ”‚   โ””โ”€โ”€ ui/                  # shadcn/ui components (40+)\nโ”œโ”€โ”€ i18n/\nโ”‚   โ”œโ”€โ”€ index.ts             # i18next initialization\nโ”‚   โ””โ”€โ”€ locales/\nโ”‚       โ”œโ”€โ”€ id/               # Bahasa Indonesia\nโ”‚       โ”œโ”€โ”€ en/               # English\nโ”‚       โ””โ”€โ”€ ms/               # Bahasa Malaysia\nโ”œโ”€โ”€ pages/\nโ”‚   โ”œโ”€โ”€ Dashboard.tsx        # Home: stats, quick actions, low stock alerts\nโ”‚   โ”œโ”€โ”€ Cashier.tsx          # POS / cashier (barcode scan input, camera scanner, side-by-side cart on landscape)\nโ”‚   โ”œโ”€โ”€ Products.tsx         # Product CRUD (with description, SKU, units, photos)\nโ”‚   โ”œโ”€โ”€ Reports.tsx          # Sales reports & charts\nโ”‚   โ”œโ”€โ”€ Settings.tsx         # Settings (store, payments, categories, units, theme, backup, install PWA)\nโ”‚   โ”œโ”€โ”€ Users.tsx            # Multi-user management (owner only)\nโ”‚   โ”œโ”€โ”€ Supplier.tsx         # Supplier CRUD\nโ”‚   โ”œโ”€โ”€ StockIn.tsx          # Stock in + COGS calculation\nโ”‚   โ”œโ”€โ”€ StockOut.tsx         # Stock out\nโ”‚   โ”œโ”€โ”€ StockReport.tsx      # Stock movement reports\nโ”‚   โ”œโ”€โ”€ TransactionHistory.tsx # Transaction history with open bill filter tabs\nโ”‚   โ””โ”€โ”€ NotFound.tsx         # 404 page\nโ””โ”€โ”€ hooks/\n    โ”œโ”€โ”€ use-auth.tsx         # Multi-user auth context (current user, permissions, login/logout)\n    โ”œโ”€โ”€ use-pwa-install.ts   # PWA install prompt + standalone detection (incl. iOS)\n    โ”œโ”€โ”€ use-theme-color.ts   # Accent color persistence\n    โ”œโ”€โ”€ use-mobile.tsx       # Mobile breakpoint detection\n    โ””โ”€โ”€ use-toast.ts         # Toast helper\n
\n
\n

๐Ÿ’พ Database

\n

All data is stored locally in the browser using IndexedDB (via Dexie.js). No data is ever sent to any server.

\n

Tables

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TableDescription
usersMulti-user accounts (owner/staff role, hashed PIN, granular permissions)
categoriesProduct categories (name, color, icon)
productsMaster products (name, SKU, sell price, COGS, stock, unit, description)
unitsMaster units of measurement
suppliersSupplier data
stockInsStock-in records
stockOutsStock-out records
hppHistoryCOGS change audit trail
paymentMethodsPayment methods (Cash, Bank Transfer, QRIS, etc.)
transactionsSales transactions (status: open/completed, customer name, table number, remarks)
transactionItemsIndividual items within each transaction (per-item notes & discount)
storeSettingsStore settings & app state (incl. multi-user toggle)
\n

COGS Calculation (Weighted Average)

\n

When stock is received, COGS is automatically recalculated:

\n
New COGS = ((Old Stock ร— Old COGS) + (New Qty ร— Buy Price)) / (Old Stock + New Qty)\n
\n
\n

๐Ÿ’ฌ Feedback & Feature Requests

\n

Got suggestions, feature ideas, or found a bug? Submit and vote on our board:

\n

๐Ÿ‘‰ kasirgratisan.fider.io

\n
\n

๐Ÿ‘ฅ Community

\n

Join the Telegram group to discuss the app, ask questions, and share tips with other users:

\n

๐Ÿ‘‰ t.me/kasirgratisan

\n
\n

๐Ÿ’Ž Sponsors

\n

FreeKasir is proudly supported by:

\n\n \"Sumopod\"\n

Want to sponsor FreeKasir and have your logo featured here? Reach out at sponsorship@freekasir.com.

\n
\n

โ˜• Support the Developer

\n

FreeKasir is built and maintained for free. If you find it useful, you can buy the developer a coffee to support continued development:

\n

๐Ÿ‘‰ traktir.jipraks.com

\n
\n

๐Ÿค Contributing

\n

Contributions are welcome! Here's how:

\n
    \n
  1. Fork this repository
  2. \n
  3. Create a feature branch (git checkout -b feature/new-feature)
  4. \n
  5. Commit your changes (git commit -m 'Add new feature')
  6. \n
  7. Push to the branch (git push origin feature/new-feature)
  8. \n
  9. Open a Pull Request
  10. \n
\n

Guidelines

\n
    \n
  • UI text uses i18next โ€” add new strings to src/i18n/locales/{id,en,ms}/ JSON files inside the appropriate namespace (common, settings, products, reports, dashboard, onboarding)
  • \n
  • Use useTranslation('namespace') hook and t('key') in components
  • \n
  • Currency and number formatting should be locale-aware using i18n.language and NUMBER_LOCALES / CURRENCY_SYMBOL maps
  • \n
  • Date formatting should use date-fns with locale from LOCALES map
  • \n
  • Use existing shadcn/ui components from src/components/ui/
  • \n
  • All monetary values are stored as numbers representing Indonesian Rupiah (no decimals)
  • \n
  • Format numbers using toLocaleString('id-ID')
  • \n
  • New features must work fully offline (no API calls)
  • \n
  • Use useLiveQuery() from dexie-react-hooks for reactive data binding
  • \n
  • Gate sensitive UI/actions with the can() helper from useAuth() when multi-user is enabled
  • \n
\n
\n

๐Ÿ“„ License

\n

MIT License

\n
\n

๐Ÿ™ Credits

\n

Built with โค๏ธ for Indonesian small businesses.

\n\n" + }, { "fullName": "adenaufal/anti-slop-writing", "name": "anti-slop-writing", @@ -657,7 +657,7 @@ "url": "https://github.com/mydisha/keirouter", "homepage": "https://keirouter.app", "language": "Go", - "stars": 91, + "stars": 92, "forks": 33, "topics": [ "ai", @@ -679,7 +679,7 @@ "rtk", "zai" ], - "updatedAt": "2026-07-22T13:25:02Z", + "updatedAt": "2026-07-22T15:09:52Z", "pushedAt": "2026-07-16T08:27:50Z", "latestRelease": { "name": "v0.1.26", diff --git a/src/data/revival.json b/src/data/revival.json index 1138a76..6be11d6 100644 --- a/src/data/revival.json +++ b/src/data/revival.json @@ -200,7 +200,7 @@ "description": "Unofficial Python 3 API wrapper to retrieve data from PDDIKTI Kemdikbudristek.", "url": "https://github.com/IlhamriSKY/PDDIKTI-kemdikbud-API", "homepage": "https://pddikti.kemdiktisaintek.go.id/", - "stars": 111, + "stars": 112, "forks": 25, "language": "Python", "topics": [ @@ -210,7 +210,7 @@ ], "license": "NOASSERTION", "createdAt": "2021-04-21T07:59:57Z", - "updatedAt": "2026-07-19T12:43:17Z", + "updatedAt": "2026-07-22T15:35:48Z", "pushedAt": "2025-07-30T13:28:14Z", "archived": false, "disabled": false From 7cda9f4787ef16476dd834fcfd3b5cc1e41215b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 18:38:07 +0000 Subject: [PATCH 20/25] Sync content data --- src/data/legacy.json | 2 +- src/data/projects.json | 16 ++++++++-------- src/data/revival.json | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/data/legacy.json b/src/data/legacy.json index 1bb3c5b..155f357 100644 --- a/src/data/legacy.json +++ b/src/data/legacy.json @@ -44,7 +44,7 @@ ], "license": "CC0-1.0", "createdAt": "2017-04-06T23:39:58Z", - "updatedAt": "2026-07-20T18:42:02Z", + "updatedAt": "2026-07-22T17:21:53Z", "pushedAt": "2025-08-03T03:05:42Z", "archived": false, "disabled": false diff --git a/src/data/projects.json b/src/data/projects.json index baf92fe..22247cf 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -291,7 +291,7 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 313, + "stars": 314, "forks": 30, "topics": [ "ai-agents", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T16:36:35Z", - "pushedAt": "2026-07-22T16:35:08Z", + "updatedAt": "2026-07-22T17:36:51Z", + "pushedAt": "2026-07-22T17:58:39Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -325,7 +325,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", "openIssues": 21, - "openPullRequests": 1, + "openPullRequests": 2, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. The agent surfaces it through the omni_recall MCP tool before it repeats the mistake.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust, though the end-to-end cost is not zero.

\n
    \n
  • Distillation: the scoring and collapsing pipeline itself runs in single-digit milliseconds.
  • \n
  • End to end: what you actually wait for is that plus the RewindStore write, and it grows with your history โ€” roughly 82 ms against a fresh database and ~308 ms against a 97 MB one. See Benchmarks before you assume it is free.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
Yes, measurably, and the cost grows with your history. The distillation pipeline itself runs in single-digit milliseconds, but every hooked command also writes to the local RewindStore: a 496-byte git status takes ~82 ms against a fresh database and ~308 ms against a 97 MB one, and a 16.5 KB cargo test takes ~276 ms. Budget for it. OMNI_PASSTHROUGH=1 skips the pipeline entirely when you need the raw output back.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -517,14 +517,14 @@ "url": "https://github.com/IlhamriSKY/PDDIKTI-kemdikbud-API", "homepage": "https://pddikti.kemdiktisaintek.go.id/", "language": "Python", - "stars": 112, + "stars": 113, "forks": 25, "topics": [ "api-wrapper", "package", "python3" ], - "updatedAt": "2026-07-22T15:35:48Z", + "updatedAt": "2026-07-22T17:59:08Z", "pushedAt": "2025-07-30T13:28:14Z", "latestRelease": { "name": "V.2.0.6", @@ -2310,13 +2310,13 @@ "tailscale" ], "updatedAt": "2026-06-25T07:10:50Z", - "pushedAt": "2026-06-06T17:33:55Z", + "pushedAt": "2026-07-22T18:04:09Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-06-06T16:32:11Z", "openIssues": 0, - "openPullRequests": 1, + "openPullRequests": 2, "subscribers": 0, "communityHealth": 100, "readmeHtml": "

Proxmox Host Operator Skill

\n

\"skills.sh\"\n\"Validate\"

\n

Reusable AI agent skill for safe Proxmox VE host operations, LXC service handling, incident response, and maintenance logging.

\n

This repository packages proxmox-host-operator, a portable SKILL.md workflow for agents that operate small to medium Proxmox hosts with LXC containers, Docker Compose services, Cloudflare Tunnel, Tailscale, backups, and LVM thin storage.

\n

The skill is based on roughly two months of hands-on best practices from managing a homelab Proxmox environment that runs production workloads: public websites, staging apps, shared databases, automation, AI tools, tunnels, backups, security hardening, and incident recovery. The source lessons were generalized so the skill is not tied to any one organization, domain, IP address, or service name.

\n

Feature Summary

\n
    \n
  • Host and LXC operations: Proxmox host inspection, LXC inventory, resource scaling, guest startup/shutdown order, Docker-in-LXC handling, and service persistence.
  • \n
  • Production service management: Docker Compose, PM2, systemd, user systemd, reverse proxy, Cloudflare Tunnel, Tailscale, and public/private endpoint verification.
  • \n
  • Incident response: Thin-pool exhaustion, read-only guests, disk-full events, crash loops, 502/1033 tunnel failures, DNS breakage, runaway processes, and high CPU or IO wait.
  • \n
  • Backup and disaster recovery: Snapshot backup guardrails, Google Drive/rclone offsite backup, local cleanup, retention, backup-size interpretation, restore awareness, and storage safety checks.
  • \n
  • Security hardening: SSH, Proxmox RBAC, scoped sudoers, secret-safe documentation, WordPress/PHP web-layer protections, Fail2Ban, Cloudflare WAF, and alerting hygiene.
  • \n
  • Migration planning: Physical host relocation, subnet changes, internal bridge strategy, hardcoded IP discovery, NAT/Tailscale rebuild, Cloudflare recovery, validation, and rollback.
  • \n
  • AI agent activity logging: Root changelog index, weekly changelog detail, per-LXC maintenance logs, incident notes, verification evidence, and reusable lessons.
  • \n
\n

What It Helps Agents Do

\n
    \n
  • Inspect a Proxmox VE host before making changes.
  • \n
  • Manage LXC, Docker Compose, PM2, systemd, user systemd, Cloudflare Tunnel, and Tailscale workflows safely.
  • \n
  • Diagnose common Proxmox incidents such as thin-pool exhaustion, read-only LXC filesystems, crash loops, runaway agent processes, tunnel 502/1033 errors, security incidents, and IP migration failures.
  • \n
  • Apply reusable security hardening patterns for SSH, RBAC, sudoers, web-layer attacks, Fail2Ban, Cloudflare WAF, and secret-safe documentation.
  • \n
  • Design offsite backup routines with Google Drive or another rclone-compatible cloud target.
  • \n
  • Plan physical server relocation, subnet changes, internal bridge migration, DNS recovery, NAT rebuilds, and rollback.
  • \n
  • Keep AI agent activity logs with scope, problem, cause, action, verification, rollback, follow-up, and per-LXC documentation updates.
  • \n
  • Avoid leaking secrets while still documenting useful infrastructure state.
  • \n
  • Turn incident lessons into reusable runbooks and best practices.
  • \n
\n

Install

\n

After publishing this repository on GitHub, install it with the skills CLI:

\n
npx skills add wauputr4/agent-proxmox\n
\n

skills.sh lists GitHub-hosted skills automatically after users install them with the CLI.

\n

Repository Layout

\n
skills/\n  proxmox-host-operator/\n    SKILL.md\n    agents/openai.yaml\n    references/\n      incident-patterns.md\n      activity-logging.md\n      migration-playbook.md\n      ops-logbook.md\n      proxmox-runbooks.md\n      security-hardening.md\n    scripts/\n      collect-proxmox-triage.sh\n      new-log-entry.py\nskills.sh.json\nREADME.md\nCONTRIBUTING.md\nCODE_OF_CONDUCT.md\nSECURITY.md\nLICENSE\n
\n

Who This Is For

\n

Use this skill if your AI agent helps with:

\n
    \n
  • Proxmox VE home labs, edge servers, agency infrastructure, internal staging servers, or small production nodes.
  • \n
  • LXC-first deployments with Docker inside containers.
  • \n
  • Shared database containers, reverse proxies, tunnels, and VPN-only admin surfaces.
  • \n
  • Daily or weekly operational logs that need to stay accurate.
  • \n
\n

Design Principles

\n
    \n
  • Read before changing.
  • \n
  • Prefer read-only diagnostics first.
  • \n
  • Keep changes scoped to one host, one LXC, or one service at a time.
  • \n
  • Record verification evidence, not vibes.
  • \n
  • Never log credential values, tokens, private keys, or full secret-bearing .env files.
  • \n
  • Treat storage, backups, networking, and tunnels as first-class operational surfaces.
  • \n
  • Convert every painful incident into a reusable prevention rule.
  • \n
\n

Contributing

\n

Contributions are welcome. Good additions include generalized incident patterns, safer diagnostics, better rollback checklists, and examples from other Proxmox environments.

\n

Please avoid organization-specific hostnames, public IPs, credentials, or private service names in contributions. See CONTRIBUTING.md for the contribution workflow.

\n

License

\n

MIT. See LICENSE.

\n" diff --git a/src/data/revival.json b/src/data/revival.json index 6be11d6..23df244 100644 --- a/src/data/revival.json +++ b/src/data/revival.json @@ -200,7 +200,7 @@ "description": "Unofficial Python 3 API wrapper to retrieve data from PDDIKTI Kemdikbudristek.", "url": "https://github.com/IlhamriSKY/PDDIKTI-kemdikbud-API", "homepage": "https://pddikti.kemdiktisaintek.go.id/", - "stars": 112, + "stars": 113, "forks": 25, "language": "Python", "topics": [ @@ -210,7 +210,7 @@ ], "license": "NOASSERTION", "createdAt": "2021-04-21T07:59:57Z", - "updatedAt": "2026-07-22T15:35:48Z", + "updatedAt": "2026-07-22T17:59:08Z", "pushedAt": "2025-07-30T13:28:14Z", "archived": false, "disabled": false From d9dadea689bea86b3513e9c84d2fcf68e0495717 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 20:35:26 +0000 Subject: [PATCH 21/25] Sync content data --- src/data/projects.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 22247cf..f02f4e0 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -2094,8 +2094,8 @@ "stars": 6, "forks": 0, "topics": [], - "updatedAt": "2026-07-21T20:20:21Z", - "pushedAt": "2026-07-21T20:19:56Z", + "updatedAt": "2026-07-22T20:12:49Z", + "pushedAt": "2026-07-22T20:12:36Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", From 6b7565ec909ccf9a9574473a871340b42c6ae6ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:20:12 +0000 Subject: [PATCH 22/25] Sync content data --- src/data/projects.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index f02f4e0..e98daad 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 899, + "stars": 900, "forks": 279, "topics": [], - "updatedAt": "2026-07-22T11:22:16Z", + "updatedAt": "2026-07-22T22:15:38Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 125, + "stars": 126, "forks": 15, "topics": [ "ai", @@ -490,7 +490,7 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-22T09:23:15Z", + "updatedAt": "2026-07-22T21:07:11Z", "pushedAt": "2026-07-21T23:43:24Z", "latestRelease": { "name": "Release v0.10.0", From c72610ba70e2e7d50fcada7a1ce850e8a96f85d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 00:16:45 +0000 Subject: [PATCH 23/25] Sync content data --- src/data/projects.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index e98daad..d03b7ce 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 126, + "stars": 127, "forks": 15, "topics": [ "ai", @@ -490,7 +490,7 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-22T21:07:11Z", + "updatedAt": "2026-07-22T23:20:14Z", "pushedAt": "2026-07-21T23:43:24Z", "latestRelease": { "name": "Release v0.10.0", From 5e60680b648aae7215bbee3b0476d0f6aa5e61e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 03:51:33 +0000 Subject: [PATCH 24/25] Sync content data --- src/data/projects.json | 43 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index d03b7ce..423e024 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -130,7 +130,7 @@ "sistem-informasi-desa" ], "updatedAt": "2026-07-22T13:40:31Z", - "pushedAt": "2026-07-18T13:09:40Z", + "pushedAt": "2026-07-23T03:19:25Z", "latestRelease": { "name": "Rilis v2607.0.0", "tagName": "v2607.0.0", @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 355, + "openIssues": 350, "openPullRequests": 7, "subscribers": 110, "communityHealth": 50, @@ -424,7 +424,7 @@ "homepage": "", "language": "Python", "stars": 154, - "forks": 36, + "forks": 37, "topics": [], "updatedAt": "2026-07-22T06:40:34Z", "pushedAt": "2026-06-26T05:38:51Z", @@ -490,8 +490,8 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-22T23:20:14Z", - "pushedAt": "2026-07-21T23:43:24Z", + "updatedAt": "2026-07-23T03:40:07Z", + "pushedAt": "2026-07-23T03:39:52Z", "latestRelease": { "name": "Release v0.10.0", "tagName": "v0.10.0", @@ -788,13 +788,13 @@ "tauri", "terminal" ], - "updatedAt": "2026-07-21T12:58:32Z", - "pushedAt": "2026-07-21T12:58:04Z", + "updatedAt": "2026-07-23T01:16:57Z", + "pushedAt": "2026-07-23T01:16:54Z", "latestRelease": { - "name": "TEDI v0.3.93", - "tagName": "v0.3.93", - "url": "https://github.com/IlhamriSKY/TEDI/releases/tag/v0.3.93", - "publishedAt": "2026-07-21T13:18:57Z" + "name": "TEDI v0.3.94", + "tagName": "v0.3.94", + "url": "https://github.com/IlhamriSKY/TEDI/releases/tag/v0.3.94", + "publishedAt": "2026-07-23T01:34:36Z" }, "archived": false, "licenseSpdx": "Apache-2.0", @@ -1298,8 +1298,8 @@ "stars": 24, "forks": 2, "topics": [], - "updatedAt": "2026-07-19T05:48:50Z", - "pushedAt": "2026-07-19T05:48:46Z", + "updatedAt": "2026-07-23T03:47:44Z", + "pushedAt": "2026-07-23T03:47:25Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", @@ -1850,7 +1850,7 @@ "semantic-search" ], "updatedAt": "2026-07-03T02:36:07Z", - "pushedAt": "2026-07-14T09:11:34Z", + "pushedAt": "2026-07-23T02:39:54Z", "latestRelease": { "name": "OpenEmpiric v1.0.5", "tagName": "v1.0.5", @@ -2309,17 +2309,22 @@ "skills-sh", "tailscale" ], - "updatedAt": "2026-06-25T07:10:50Z", - "pushedAt": "2026-07-22T18:04:09Z", - "latestRelease": null, + "updatedAt": "2026-07-23T02:37:26Z", + "pushedAt": "2026-07-23T02:37:49Z", + "latestRelease": { + "name": "v0.1.0", + "tagName": "v0.1.0", + "url": "https://github.com/wauputr4/agent-proxmox/releases/tag/v0.1.0", + "publishedAt": "2026-07-23T02:37:49Z" + }, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-06-06T16:32:11Z", "openIssues": 0, - "openPullRequests": 2, + "openPullRequests": 1, "subscribers": 0, "communityHealth": 100, - "readmeHtml": "

Proxmox Host Operator Skill

\n

\"skills.sh\"\n\"Validate\"

\n

Reusable AI agent skill for safe Proxmox VE host operations, LXC service handling, incident response, and maintenance logging.

\n

This repository packages proxmox-host-operator, a portable SKILL.md workflow for agents that operate small to medium Proxmox hosts with LXC containers, Docker Compose services, Cloudflare Tunnel, Tailscale, backups, and LVM thin storage.

\n

The skill is based on roughly two months of hands-on best practices from managing a homelab Proxmox environment that runs production workloads: public websites, staging apps, shared databases, automation, AI tools, tunnels, backups, security hardening, and incident recovery. The source lessons were generalized so the skill is not tied to any one organization, domain, IP address, or service name.

\n

Feature Summary

\n
    \n
  • Host and LXC operations: Proxmox host inspection, LXC inventory, resource scaling, guest startup/shutdown order, Docker-in-LXC handling, and service persistence.
  • \n
  • Production service management: Docker Compose, PM2, systemd, user systemd, reverse proxy, Cloudflare Tunnel, Tailscale, and public/private endpoint verification.
  • \n
  • Incident response: Thin-pool exhaustion, read-only guests, disk-full events, crash loops, 502/1033 tunnel failures, DNS breakage, runaway processes, and high CPU or IO wait.
  • \n
  • Backup and disaster recovery: Snapshot backup guardrails, Google Drive/rclone offsite backup, local cleanup, retention, backup-size interpretation, restore awareness, and storage safety checks.
  • \n
  • Security hardening: SSH, Proxmox RBAC, scoped sudoers, secret-safe documentation, WordPress/PHP web-layer protections, Fail2Ban, Cloudflare WAF, and alerting hygiene.
  • \n
  • Migration planning: Physical host relocation, subnet changes, internal bridge strategy, hardcoded IP discovery, NAT/Tailscale rebuild, Cloudflare recovery, validation, and rollback.
  • \n
  • AI agent activity logging: Root changelog index, weekly changelog detail, per-LXC maintenance logs, incident notes, verification evidence, and reusable lessons.
  • \n
\n

What It Helps Agents Do

\n
    \n
  • Inspect a Proxmox VE host before making changes.
  • \n
  • Manage LXC, Docker Compose, PM2, systemd, user systemd, Cloudflare Tunnel, and Tailscale workflows safely.
  • \n
  • Diagnose common Proxmox incidents such as thin-pool exhaustion, read-only LXC filesystems, crash loops, runaway agent processes, tunnel 502/1033 errors, security incidents, and IP migration failures.
  • \n
  • Apply reusable security hardening patterns for SSH, RBAC, sudoers, web-layer attacks, Fail2Ban, Cloudflare WAF, and secret-safe documentation.
  • \n
  • Design offsite backup routines with Google Drive or another rclone-compatible cloud target.
  • \n
  • Plan physical server relocation, subnet changes, internal bridge migration, DNS recovery, NAT rebuilds, and rollback.
  • \n
  • Keep AI agent activity logs with scope, problem, cause, action, verification, rollback, follow-up, and per-LXC documentation updates.
  • \n
  • Avoid leaking secrets while still documenting useful infrastructure state.
  • \n
  • Turn incident lessons into reusable runbooks and best practices.
  • \n
\n

Install

\n

After publishing this repository on GitHub, install it with the skills CLI:

\n
npx skills add wauputr4/agent-proxmox\n
\n

skills.sh lists GitHub-hosted skills automatically after users install them with the CLI.

\n

Repository Layout

\n
skills/\n  proxmox-host-operator/\n    SKILL.md\n    agents/openai.yaml\n    references/\n      incident-patterns.md\n      activity-logging.md\n      migration-playbook.md\n      ops-logbook.md\n      proxmox-runbooks.md\n      security-hardening.md\n    scripts/\n      collect-proxmox-triage.sh\n      new-log-entry.py\nskills.sh.json\nREADME.md\nCONTRIBUTING.md\nCODE_OF_CONDUCT.md\nSECURITY.md\nLICENSE\n
\n

Who This Is For

\n

Use this skill if your AI agent helps with:

\n
    \n
  • Proxmox VE home labs, edge servers, agency infrastructure, internal staging servers, or small production nodes.
  • \n
  • LXC-first deployments with Docker inside containers.
  • \n
  • Shared database containers, reverse proxies, tunnels, and VPN-only admin surfaces.
  • \n
  • Daily or weekly operational logs that need to stay accurate.
  • \n
\n

Design Principles

\n
    \n
  • Read before changing.
  • \n
  • Prefer read-only diagnostics first.
  • \n
  • Keep changes scoped to one host, one LXC, or one service at a time.
  • \n
  • Record verification evidence, not vibes.
  • \n
  • Never log credential values, tokens, private keys, or full secret-bearing .env files.
  • \n
  • Treat storage, backups, networking, and tunnels as first-class operational surfaces.
  • \n
  • Convert every painful incident into a reusable prevention rule.
  • \n
\n

Contributing

\n

Contributions are welcome. Good additions include generalized incident patterns, safer diagnostics, better rollback checklists, and examples from other Proxmox environments.

\n

Please avoid organization-specific hostnames, public IPs, credentials, or private service names in contributions. See CONTRIBUTING.md for the contribution workflow.

\n

License

\n

MIT. See LICENSE.

\n" + "readmeHtml": "

Proxmox Host Operator Skill

\n

\"skills.sh\"\n\"Validate\"

\n

Reusable AI agent skill for safe Proxmox VE host operations, LXC service handling, incident response, and maintenance logging.

\n

This repository packages proxmox-host-operator, a portable SKILL.md workflow for agents that operate small to medium Proxmox hosts with LXC containers, Docker Compose services, Cloudflare Tunnel, Tailscale, backups, and LVM thin storage.

\n

The skill is based on roughly two months of hands-on best practices from managing a homelab Proxmox environment that runs production workloads: public websites, staging apps, shared databases, automation, AI tools, tunnels, backups, security hardening, and incident recovery. The source lessons were generalized so the skill is not tied to any one organization, domain, IP address, or service name.

\n

Feature Summary

\n
    \n
  • Host and LXC operations: Proxmox host inspection, LXC inventory, resource scaling, guest startup/shutdown order, Docker-in-LXC handling, and service persistence.
  • \n
  • Production service management: Docker Compose, PM2, systemd, user systemd, reverse proxy, Cloudflare Tunnel, Tailscale, and public/private endpoint verification.
  • \n
  • Runtime-safe releases: Off-host serial builds, checksummed artifacts, inactive-port validation, blue-green cutover, singleton workers, and runnable rollback generations.
  • \n
  • Incident response: Thin-pool exhaustion, read-only guests, disk-full events, crash loops, 502/1033 tunnel failures, DNS breakage, runaway processes, and high CPU or IO wait.
  • \n
  • Backup and disaster recovery: Snapshot backup guardrails, Google Drive/rclone offsite backup, local cleanup, retention, backup-size interpretation, restore awareness, and storage safety checks.
  • \n
  • Security hardening: SSH, Proxmox RBAC, scoped sudoers, secret-safe documentation, WordPress/PHP web-layer protections, Fail2Ban, Cloudflare WAF, and alerting hygiene.
  • \n
  • Migration planning: Physical host relocation, subnet changes, internal bridge strategy, hardcoded IP discovery, NAT/Tailscale rebuild, Cloudflare recovery, validation, and rollback.
  • \n
  • AI agent activity logging: Root changelog index, weekly changelog detail, per-LXC maintenance logs, incident notes, verification evidence, and reusable lessons.
  • \n
  • Monitoring safety: Dry-run defaults, maintenance windows, deduplicated and batched alerts, fail-closed backups, and delivery retry semantics.
  • \n
\n

What It Helps Agents Do

\n
    \n
  • Inspect a Proxmox VE host before making changes.
  • \n
  • Manage LXC, Docker Compose, PM2, systemd, user systemd, Cloudflare Tunnel, and Tailscale workflows safely.
  • \n
  • Diagnose common Proxmox incidents such as thin-pool exhaustion, read-only LXC filesystems, crash loops, runaway agent processes, tunnel 502/1033 errors, security incidents, and IP migration failures.
  • \n
  • Apply reusable security hardening patterns for SSH, RBAC, sudoers, web-layer attacks, Fail2Ban, Cloudflare WAF, and secret-safe documentation.
  • \n
  • Design offsite backup routines with Google Drive or another rclone-compatible cloud target.
  • \n
  • Plan physical server relocation, subnet changes, internal bridge migration, DNS recovery, NAT rebuilds, and rollback.
  • \n
  • Keep AI agent activity logs with scope, problem, cause, action, verification, rollback, follow-up, and per-LXC documentation updates.
  • \n
  • Avoid leaking secrets while still documenting useful infrastructure state.
  • \n
  • Turn incident lessons into reusable runbooks and best practices.
  • \n
\n

Install

\n

After publishing this repository on GitHub, install it with the skills CLI:

\n
npx skills add wauputr4/agent-proxmox\n
\n

skills.sh lists GitHub-hosted skills automatically after users install them with the CLI.

\n

Repository Layout

\n
skills/\n  proxmox-host-operator/\n    SKILL.md\n    agents/openai.yaml\n    references/\n      incident-patterns.md\n      activity-logging.md\n      migration-playbook.md\n      ops-logbook.md\n      proxmox-runbooks.md\n      security-hardening.md\n    scripts/\n      collect-proxmox-triage.sh\n      new-log-entry.py\nskills.sh.json\nREADME.md\nCONTRIBUTING.md\nCODE_OF_CONDUCT.md\nSECURITY.md\nLICENSE\n
\n

Who This Is For

\n

Use this skill if your AI agent helps with:

\n
    \n
  • Proxmox VE home labs, edge servers, agency infrastructure, internal staging servers, or small production nodes.
  • \n
  • LXC-first deployments with Docker inside containers.
  • \n
  • Shared database containers, reverse proxies, tunnels, and VPN-only admin surfaces.
  • \n
  • Daily or weekly operational logs that need to stay accurate.
  • \n
\n

Design Principles

\n
    \n
  • Read before changing.
  • \n
  • Prefer read-only diagnostics first.
  • \n
  • Keep changes scoped to one host, one LXC, or one service at a time.
  • \n
  • Record verification evidence, not vibes.
  • \n
  • Never log credential values, tokens, private keys, or full secret-bearing .env files.
  • \n
  • Treat storage, backups, networking, and tunnels as first-class operational surfaces.
  • \n
  • Convert every painful incident into a reusable prevention rule.
  • \n
\n

Contributing

\n

Contributions are welcome. Good additions include generalized incident patterns, safer diagnostics, better rollback checklists, and examples from other Proxmox environments.

\n

Please avoid organization-specific hostnames, public IPs, credentials, or private service names in contributions. See CONTRIBUTING.md for the contribution workflow.

\n

License

\n

MIT. See LICENSE.

\n" }, { "fullName": "faisalaffan/ragi-instant", From 708c13c5f0305cc2d5fc8f34ed72eb96f63a3364 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:33:19 +0000 Subject: [PATCH 25/25] Sync content data --- src/data/projects.json | 98 +++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 423e024..ab8f07d 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -130,7 +130,7 @@ "sistem-informasi-desa" ], "updatedAt": "2026-07-22T13:40:31Z", - "pushedAt": "2026-07-23T03:19:25Z", + "pushedAt": "2026-07-23T05:30:50Z", "latestRelease": { "name": "Rilis v2607.0.0", "tagName": "v2607.0.0", @@ -186,10 +186,10 @@ "url": "https://github.com/laravolt/indonesia", "homepage": "", "language": "PHP", - "stars": 670, + "stars": 671, "forks": 210, "topics": [], - "updatedAt": "2026-07-19T09:32:55Z", + "updatedAt": "2026-07-23T04:25:33Z", "pushedAt": "2026-03-03T06:32:45Z", "latestRelease": { "name": "v0.41", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-22T17:36:51Z", - "pushedAt": "2026-07-22T17:58:39Z", + "updatedAt": "2026-07-23T05:00:52Z", + "pushedAt": "2026-07-23T05:00:38Z", "latestRelease": { "name": "v0.6.3", "tagName": "v0.6.3", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 21, - "openPullRequests": 2, + "openIssues": 20, + "openPullRequests": 1, "subscribers": 4, "communityHealth": 71, "readmeHtml": "
\n \"OMNI

OMNI

\n

\n Noise-canceling context and long-term memory for your AI agent โ€” lossy, but always reversible, and it never fabricates a result. Stop paying Claude to read 10,000 lines of terminal noise.\n

๐Ÿ‡บ๐Ÿ‡ธ English | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ | ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia | ๐Ÿ‡ป๐Ÿ‡ณ Tiแบฟng Viแป‡t | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด

\n

\"CI\"\n\"Release\"\n \"Rust\"\n \"MCP\"\n \"License:\n \"Hits\"\n

\n\n58.9% fewer tokens on a real command mix ยท Cross-Session Memory ยท Format-safe ยท Always reversible ยท Fails open, never fabricates ยท Numbers you can reproduce

\n



\n\"OMNI

\n

\n

Every AI coding assistant has two massive problems.

\n

1. They read everything.
Build logs.
Docker logs.
CI logs.
Progress bars.
ANSI colors.
Thousands of tokens... to find one line. Claude isn't expensive. Your terminal is.

\n

2. They forget everything.
Every time you restart Cursor, or switch from Claude Code to Windsurf, your agent gets amnesia. You have to re-explain the project goal. You have to remind them of the same framework gotchas over and over again.

\n

OMNI fixes both.

\n
\n

The Difference

\n

Problem 1: Your terminal drowns out the signal

\n

Real numbers, measured on tests/fixtures/ and replayed traces โ€” not aspirations:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandWithout OMNIWith OMNISaved
cargo test (490 passed, 10 failed)16.5 KB of per-test outputthe runner's own pass/fail summary93%
kubectl get pods (35 pods, 5 crashing)the full table35 pods | 30 running, 5 error + the 5 failing pods namedโ€”
git diff (multi-file)lockfiles, whitespace, generated churnthe code that actually changed45%
docker build (heavy cache noise)9.2 KB of layer hashes and progress barsthe build result, cache hits folded37%
\n
\n

The honest caveat: OMNI compresses noisy successful output. A command that fails is passed through verbatim โ€” a hidden error is worse than an uncompressed one โ€” and structured output (JSON/YAML/CSV) is never touched. It earns its keep on repetitive tool chatter and gets out of the way everywhere else.

\n
\n

Why you can trust a lossy tool

\n

Every other compressor asks you to trust that what it cut didn't matter. OMNI doesn't ask โ€” it guarantees, and each guarantee is backed by code you can read:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
GuaranteeHowProof
Get the original back, byte-for-byteeverything cut is archived in a local SQLite RewindStore (SHA-256 โ†’ content); the agent gets a hash and calls omni_retrieveHow it works
Never fabricates a resulta distiller that parsed no signal returns the raw output, never a green no errors / passed string#143
Failures are never maskeda command that exits non-zero passes through verbatim#120
Structured data is never touchedJSON / YAML / NDJSON / CSV pass through byte-for-bytepipeline::format
Numbers are measured, not aspirational1,810 real traces replayed on the release binary โ€” and 63.6% of calls net zero, which we publish tooBenchmarks
\n

That is the one thing a bigger compression number can't buy: you can always recover the original, and it will never lie to your agent.

\n

Problem 2: Your agent forgets everything overnight

\n

Starting a new session

\n

Without OMNI: \"Please re-explain the project structure, the auth module is broken, and we use Postgres not MySQL.\"
With OMNI: The agent already knows. It picks up where you left off.

\n

Fixing the same bug twice

\n

Without OMNI: Agent hits the same framework gotcha it already solved yesterday because it has no memory.
With OMNI: The fix is already stored. The agent surfaces it through the omni_recall MCP tool before it repeats the mistake.

\n

Multi-IDE workflows (Cursor โ†’ Claude Code)

\n

Without OMNI: New IDE, new agent, zero context. You're starting from scratch.
With OMNI: Session summary is injected automatically. New agent is immediately up to speed.

\n
\n

Why This Matters

\n

The code you don't send to the AI is just as important as the code you do.

\n

When you feed an AI megabytes of terminal noise, it suffers from context bloatโ€”hallucinating fixes for the wrong warnings and burning your API budget on irrelevant output.

\n

When you restart an agent and it has no memory, you lose hours re-establishing context that should have been preserved automatically.

\n

OMNI solves both, invisibly:

\n
    \n
  • Less noise โ†’ lower cost, and less irrelevant output for the model to trip over.
  • \n
  • Format-safe by design โ†’ JSON, YAML, NDJSON and CSV pass through byte-for-byte; a distiller that can't parse its input stays quiet instead of fabricating a summary.
  • \n
  • Persistent memory โ†’ no more re-explaining your project, no more repeating fixes.
  • \n
  • One install โ†’ works silently with every agent you already use.
  • \n
\n
\n

Benchmarks

\n

The honest headline, measured on the release binary against 1,810 real command\nexecutions replayed from one developer's actual usage:

\n
    \n
  • 58.9% fewer bytes reaching the model across the whole mix (15.0 MB โ†’ 6.2 MB).
  • \n
  • 63.6% of those calls saved nothing at all. OMNI handed the output straight\nback, adding zero bytes. Every byte of the saving comes from the other 36.4%,\nwhere there was real noise to cut.
  • \n
  • Structured output is never touched. JSON, YAML, NDJSON and CSV pass through\nbyte-for-byte, because a corrupted payload costs more than a missed compression.
  • \n
\n

That second bullet is the number most tools in this category do not print. A tool\nthat claims to save 90% of every command is telling you it summarises output you\nneeded.

\n
\n\"OMNI\"\n

Where the saving actually comes from, over the same 1,810 executions:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandCallsInputOutputSaved
cargo29424 KB13 KB96.8%
git2565.9 MB509 KB91.3%
ls5271 KB29 KB59.5%
kubectl2124.4 MB2.3 MB48.0%
find3983 KB53 KB36.2%
grep184534 KB385 KB27.8%
cat85515 KB468 KB9.1%
\n

git and cargo carry the result; cat and grep are close to a no-op. OMNI\nearns its place on noisy, repetitive tooling output and gets out of the way\neverywhere else.

\n

Single fixtures from tests/fixtures/, if you want to reproduce one by hand:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Command / ContextInputOutputSaved
cargo build (large, successful)3,220 B9 B99.7%
cargo test (490 passed, 10 failed)16.5 KB1,100 B93.3%
pytest (failures)730 B136 B81.4%
git status (dirty)496 B113 B77.2%
git diff (multi-file)397 B220 B44.6%
docker build (heavy noise)9.2 KB5.8 KB37.2%
kubectl get pods (mixed)840 B762 B9.3%
\n

Latency is a real cost, not zero. OMNI runs on every hooked command, and the\nprice grows with your history: a 496-byte git status takes ~82 ms against a\nfresh database and ~308 ms against a 97 MB one. A 16.5 KB cargo test takes\n~276 ms. Budget for it.

\n

To see your own actual token savings, just run omni stats after a few days of usage.

\n
\n

Quick Start & Installation

\n

Omni is incredibly easy to set up. It natively integrates into your terminal.

\n

macOS / Linux:

\n
# 1. Install via Homebrew\nbrew install fajarhide/tap/omni\n\n# 2. Setup Omni (Interactive Menu for Claude, VS Code, OpenCode, Codex, Antigravity)\nomni init\n\n# 3. Verify it's working\nomni doctor\n\n# 4. Or auto-fix any issues\nomni doctor --fix\n\n# 5. Check Current Status\nomni init --status\n
\n

Universal Installer (macOS / Linux / WSL):

\n
curl -fsSL omni.weekndlabs.com/install | bash\n
\n

Windows (PowerShell):

\n
irm omni.weekndlabs.com/install.ps1 | iex\n
\n
\n

Integrations

\n

OMNI works seamlessly with the agentic tools you already use. It intercepts their terminal executions automatically.

\n
    \n
  • Claude Code
  • \n
  • Cursor
  • \n
  • Windsurf
  • \n
  • Roo Code
  • \n
  • OpenAI Codex
  • \n
  • Antigravity CLI
  • \n
\n
\n

Adaptive Memory OS

\n

OMNI isn't just a terminal filterโ€”it's a cure for AI amnesia.

\n

If you've ever worked with an AI agent for more than an hour, you know the pain of context loss. You restart the agent, and suddenly it forgets what you were working on. It forgets the project goal. It starts making the exact same mistakes it made yesterday because it forgot the repository's undocumented quirks.

\n

OMNI's Memory OS runs silently in the background to solve this:

\n
    \n
  • Stop Re-Explaining the Goal (omni goal): Set your North Star objective once. OMNI will relentlessly remind the agent of this exact priority on every single prompt, preventing it from drifting off-task.
  • \n
  • Never Lose Your Train of Thought (Session Continuity): If Cursor crashes or you switch to Claude Code, OMNI instantly injects a compressed summary of your last session. The new agent knows exactly which files were hot and what the last active error was, picking up right where you left off.
  • \n
  • Teach It Once (omni remember): Stop fixing the same hallucination. Agents can save project-specific rules, gotchas, and architecture decisions directly into OMNI's local SQLite backend. When they get stuck later, they automatically pull the exact answer back out via semantic search.
  • \n
\n

Your agent gets smarter about your codebase every single day, and you never have to repeat yourself again.

\n
\n

How it works

\n

Omni operates purely locally using a deterministic Read โ†’ Guard โ†’ Score โ†’ Collapse โ†’ Distill โ†’ Persist pipeline.

\n
flowchart LR\n    Command[Raw Tool Output] --> Hook[Omni Hook]\n    Hook --> Score[Scorer Engine]\n    Score -->|Critical=1.0, Noise=0.1| Distill[Content Distiller]\n    Distill --> Clean[Clean Context]\n    Command --> SQLite[(RewindStore SQLite)]\n
\n

If the AI really needs the dropped noise, OMNI's local SQLite RewindStore keeps the full uncompressed log safely hashed, allowing the agent to retrieve it anytime.

\n
\n

Architecture

\n
\n \"OMNI\n

Built in Rust, though the end-to-end cost is not zero.

\n
    \n
  • Distillation: the scoring and collapsing pipeline itself runs in single-digit milliseconds.
  • \n
  • End to end: what you actually wait for is that plus the RewindStore write, and it grows with your history โ€” roughly 82 ms against a fresh database and ~308 ms against a 97 MB one. See Benchmarks before you assume it is free.
  • \n
  • Memory: Operates via efficient streams, keeping memory usage flat even on 20,000-line logs.
  • \n
  • Fail Open: If OMNI panics, it fails silently and passes the raw output through. It will never crash your host agent.
  • \n
\n
# Development\ncargo build --release\ncargo test --all\nmake fmt && make clippy\n
\n
\n

FAQ

\n

Does Omni permanently delete my logs?
No. The raw logs are compressed and stored locally in the SQLite RewindStore. The AI receives a hash and can retrieve the full log if needed.

\n

Will this slow down my terminal?
Yes, measurably, and the cost grows with your history. The distillation pipeline itself runs in single-digit milliseconds, but every hooked command also writes to the local RewindStore: a 496-byte git status takes ~82 ms against a fresh database and ~308 ms against a 97 MB one, and a 16.5 KB cargo test takes ~276 ms. Budget for it. OMNI_PASSTHROUGH=1 skips the pipeline entirely when you need the raw output back.

\n

Can I add my own filters?
Yes. You can teach OMNI to strip noise specific to your internal tools using TOML:

\n
# ~/.omni/signals/custom.toml\n[filters.my_tool]\nmatch_command = \"^internal-tool\\\\b\"\nstrip_lines_matching = [\"^DEBUG\", \"syncing...\"]\n
\n

Contributing & License

\n

This is a passion project built for the era of Agentic AI. Whether you're here to save money on tokens, test out free models, or help build the ultimate agentic toolbelt, contributions are always welcome!

\n
    \n
  • Development: Want to build from source? Run make ci and cargo build. Read our CONTRIBUTING.md for details.
  • \n
  • License: MIT License
  • \n
\n\n

\n \n \n \n \n \"Star\n \n \n

\n\nBuild with โค๏ธ by [Fajar Hidayat](https://github.com/fajarhide)\n" @@ -1379,43 +1379,6 @@ "communityHealth": 28, "readmeHtml": "

YNTK-TS

\n

You Need This Kit - Type-safe Starter!

\n

TypeScript/Express REST API starter kit that ships with User Management, Role Management, and Authentication with JWTs, Prisma ORM, and PostgreSQL. The project is organized by feature with explicit service/repository layers so business logic stays separated from transport concerns.

\n

Tech Stack

\n
    \n
  • Runtime: Node.js 22+, pnpm
  • \n
  • Framework: Express 5 with middleware-based architecture
  • \n
  • Database/ORM: PostgreSQL + Prisma
  • \n
  • Auth: bcrypt for password hashing, jsonwebtoken for JWT-based authentication
  • \n
  • Email: Nodemailer for password reset emails
  • \n
  • Logging: Pino for structured JSON logging and audit trails
  • \n
  • Security: express-rate-limit for API protection
  • \n
  • Validation: Zod for request validation with custom schemas
  • \n
  • Testing: Vitest for unit and integration testing
  • \n
  • Language/Tooling: TypeScript (strict mode), tsx for development with hot reload
  • \n
\n

Project Structure

\n
src/\nโ”œโ”€โ”€ app.ts                # Express app bootstrap\nโ”œโ”€โ”€ server.ts             # Starts HTTP server\nโ”œโ”€โ”€ config/               # Environment loader & Prisma client wrapper\nโ”œโ”€โ”€ controllers/          # HTTP handlers grouped by module + shared helpers\nโ”œโ”€โ”€ services/             # Business logic (auth/user) & mappers\nโ”œโ”€โ”€ repositories/         # Prisma data access per module\nโ”œโ”€โ”€ middleware/           # Cross-cutting middleware (auth, validation)\nโ”œโ”€โ”€ routes/               # Express routers mounted under /auth and /users\nโ”œโ”€โ”€ validations/          # Zod schemas for request validation\nโ”œโ”€โ”€ views/                # Email templates\nโ”œโ”€โ”€ errors/               # Custom AppError type & error utilities\nโ”œโ”€โ”€ utils/                # Shared utilities (password, string, Zod helpers)\nโ””โ”€โ”€ types/                # Shared TS types & Express module augmentation\n
\n

Getting Started

\n

1. Clone & Install

\n
pnpm install\n
\n

2. Environment Variables

\n

Create .env (never commit it) with the required settings:

\n
# Server Configuration\nNODE_ENV=development\nFRONTEND_URL=http://localhost:8080\nPORT=5050\nLOG_LEVEL=info\n\n# Database\nDATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE\n\n# JWT Configuration\nJWT_SECRET=super-secret\n\n# Bcrypt Configuration\nSALT_ROUNDS=10\n\n# Email Configuration\nEMAIL_HOST=smtp.gmail.com\nEMAIL_PORT=587\nEMAIL_USER=your-email@gmail.com\nEMAIL_PASSWORD=your-app-password\nEMAIL_FROM=noreply@yourapp.com\n\n# Token Configuration\nACCESS_TOKEN_EXPIRY=\"1h\"\nENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nREFRESH_TOKEN_EXPIRY=7 * 24 * 60 * 60 * 1000 # 7 days in miliseconds\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nRESET_PASSWORD_TOKEN_EXPIRY=1 * 60 * 60 * 1000 # 1 hour in miliseconds\nEMAIL_VERIFICATION_TOKEN_EXPIRY=24 * 60 * 60 * 10000 # 24 hours in miliseconds\n\n# CORS Configuration\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\nCORS_CREDENTIALS=true\n
\n
\n

Note for Gmail: Use an App Password instead of your regular password. Enable 2FA and generate an App Password in Google Account Settings โ†’ Security โ†’ App passwords.

\n
\n

3. Database & Prisma

\n
    \n
  1. Model updates live in prisma/schema.prisma.
  2. \n
  3. Apply migrations: pnpm prisma migrate dev (for local) or pnpm prisma db push for quick sync.
  4. \n
  5. Generate the Prisma client (needed whenever the schema changes): pnpm prisma generate. Output lands in src/generated/prisma.
  6. \n
  7. Seed the database: pnpm prisma db seed
  8. \n
\n

4. Development

\n
pnpm dev\n
\n

Runs tsx in watch mode, recompiling on changes. The API listens on PORT from the env file (defaults to 5050).

\n

Available Scripts

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandPurpose
pnpm devStart the API in watch mode with tsx
pnpm prisma migrate devCreate/apply migrations and regenerate Prisma client
pnpm prisma generateRegenerate Prisma client manually
pnpm prisma db pushQuick sync schema to database without migrations
pnpm prisma db seedSeed the database
pnpm buildBuild the API for production (bundles with tsup)
pnpm startStart the production server from dist/
pnpm testRun all tests in watch mode
pnpm test:unitRun unit tests only
pnpm test:integrationRun integration tests only (sequential)
\n
\n

โ— Production build: The repo currently runs via tsx; add a tsc build + start script before deploying to production environments like Vercel/Node runtime functions.

\n
\n

API Documentation

\n

The API includes interactive documentation powered by Swagger UI and OpenAPI 3.0 (swagger-jsdoc and swagger-ui-express).

\n
    \n
  • URL: /api-docs (accessible when the server is running)
  • \n
  • Features:
      \n
    • Interactive API explorer to test endpoints directly from the browser.
    • \n
    • Comprehensive schemas for request bodies, parameters, and responses.
    • \n
    • Read-only in production: The \"Try it out\" functionality is disabled in production environments for security.
    • \n
    \n
  • \n
\n

API Endpoints

\n

All endpoints respond with { status, message, data? } JSON payloads.\nFor paginated endpoints (like GET /users and GET /roles), the response also includes meta and links objects containing paging data and HATEOAS navigational URLs. They optionally accept query parameters: ?page=1&limit=10&sortBy=createdAt&sortOrder=asc&search=value.

\n

Authentication Routes (/auth)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/auth/registerRegister a new user and send verification emailPublicregisterUserSchema
POST/auth/loginVerify credentials and return JWT tokenPublic-
POST/auth/logoutLogout and revoke refresh tokenRequiredlogoutSchema
POST/auth/refresh-tokenRefresh access token using refresh tokenPublicrefreshTokenSchema
POST/auth/verify-emailVerify email address using token from emailPublicverifyEmailSchema
POST/auth/resend-verificationResend verification email (rate limited: 3/10min)PublicresendVerificationSchema
POST/auth/forgot-passwordRequest password reset email (rate limited: 3/15min)PublicforgotPasswordSchema
POST/auth/reset-passwordReset password using token from emailPublicresetPasswordSchema
\n

User Routes (/users)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
POST/usersCreate a user (admin-style)Required (users:create)createUserSchema
GET/usersList all usersRequired (users:read)-
GET/users/:idFetch a user by IDRequired (users:read)-
PUT/users/:idUpdate user fields (username, email, displayName)Required (users:update)updateUserSchema
PUT/users/:id/rolesAssign roles to a userRequired (roles:assign)assignRolesSchema
PATCH/users/passwordUpdate current user's passwordRequired (users:update)updatePasswordSchema
DELETE/users/:idRemove a userRequired (users:delete)-
\n

Role & Permission Routes (/roles & /permissions)

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathDescriptionAuthValidation
GET/rolesList all rolesRequired (roles:read)-
GET/roles/:idFetch a role by IDRequired (roles:read)-
POST/rolesCreate a new roleRequired (roles:create)createRoleSchema
PUT/roles/:idUpdate an existing roleRequired (roles:update)updateRoleSchema
DELETE/roles/:idRemove a roleRequired (roles:delete)-
GET/permissionsList all system permissionsRequired (roles:read)-
\n

Auth Required: Endpoints require Authorization: Bearer <token> header.

\n

Validation Schemas

\n

The API uses Zod for request validation with the following schemas:

\n
    \n
  • registerUserSchema: Validates user registration (username, email, displayName, password)
  • \n
  • createUserSchema: Validates user creation (username, email, displayName)
  • \n
  • updateUserSchema: Validates user updates (partial fields)
  • \n
  • assignRolesSchema: Validates assigning role IDs to a user
  • \n
  • updatePasswordSchema: Validates password changes (currentPassword, newPassword, confirmPassword)
  • \n
  • createRoleSchema: Validates new role details and array of permission IDs
  • \n
  • updateRoleSchema: Validates partial updates to a role
  • \n
  • verifyEmailSchema: Validates email verification token
  • \n
  • resendVerificationSchema: Validates email for resending verification
  • \n
  • forgotPasswordSchema: Validates email for password reset requests
  • \n
  • resetPasswordSchema: Validates reset token and new password (min 8 chars, uppercase, lowercase, number)
  • \n
  • refreshTokenSchema: Validates refresh token from body or cookies
  • \n
  • logoutSchema: Validates optional refresh token for revocation on logout
  • \n
\n

All schemas include:

\n
    \n
  • Email format validation
  • \n
  • Username length constraints (3-30 chars)
  • \n
  • Display name length constraints (3-100 chars)
  • \n
  • Password length constraints (6-100 chars for regular, 8+ for reset with strength requirements)
  • \n
  • Automatic lowercase transformation for usernames and emails
  • \n
\n

Middleware

\n
    \n
  • authMiddleware (src/middleware/auth.middleware.ts): JWT verification and user authentication
  • \n
  • requireVerified (src/middleware/require-verified.middleware.ts): Ensures user email is verified before access
  • \n
  • validate (src/middleware/validation.middleware.ts): Zod schema validation for request body/params/query
  • \n
  • forgotPasswordLimiter (src/middleware/rate-limit.middleware.ts): Rate limiting for password reset (3 requests per 15 minutes)
  • \n
  • resendVerificationLimiter (src/middleware/rate-limit.middleware.ts): Rate limiting for resending verification emails (3 requests per 10 minutes)
  • \n
\n

Adding New Modules

\n
    \n
  1. Plan the data shape (Prisma model, DTOs, response contract).
  2. \n
  3. Create Zod schemas in src/validations/<module>.validation.ts for request validation.
  4. \n
  5. Create routes under src/routes/<module>.routes.ts and mount them in src/routes/index.ts.
  6. \n
  7. Implement controllers (validation + DTO parsing) in src/controllers/<module>.controller.ts.
  8. \n
  9. Add services in src/services/<module>.service.ts and reuse AppError for controlled failures.
  10. \n
  11. Create repositories talking to Prisma in src/repositories/<module>.repository.ts.
  12. \n
  13. Add middleware/types if you need new guards or request data.
  14. \n
  15. Update docs/tests and run the dev server to smoke-test.
  16. \n
\n

Error Handling

\n

The API uses a custom AppError class for controlled error handling:

\n
    \n
  • Consistent error responses across all endpoints
  • \n
  • HTTP status code mapping
  • \n
  • Detailed error messages for debugging
  • \n
\n

Security Features

\n
    \n
  • โœ… Granular Role-Based Access Control (RBAC) with capability-driven tokens
  • \n
  • โœ… Password hashing with bcrypt (configurable salt rounds)
  • \n
  • โœ… JWT-based authentication with configurable expiration
  • \n
  • โœ… Email verification with secure token generation (24-hour expiry by default)
  • \n
  • โœ… Password reset with secure token generation (SHA-256 hashing, 1-hour expiry)
  • \n
  • โœ… Rate limiting on password reset and email verification endpoints
  • \n
  • โœ… Email enumeration prevention (same response for existing/non-existing emails)
  • \n
  • โœ… Comprehensive audit logging with Pino (15+ event types tracked)
  • \n
  • โœ… Request validation with Zod
  • \n
  • โœ… Environment variable configuration
  • \n
  • โœ… Refresh token rotation with configurable delivery (JSON body / HTTP-Only Cookie)
  • \n
  • โœ… Unique constraints on username and email
  • \n
  • โœ… CORS with origin whitelisting and credentials support
  • \n
\n

Refresh Token Configuration

\n

The API implements a robust, secure Refresh Token Rotation mechanism to safely extend user sessions without compromising security.

\n

Configuration

\n

Refresh tokens are configured via environment variables in .env:

\n
ENABLE_REFRESH_TOKEN=true\nREFRESH_TOKEN_IN_JSON=true\nREFRESH_TOKEN_IN_COOKIE=true\nCOOKIE_SAME_SITE=\"strict\" # strict, lax, none\nREFRESH_TOKEN_EXPIRY=604800000 # 7 days in milliseconds\n
\n

Features

\n
    \n
  • Token Rotation: Every time a user requests a new access token via /auth/refresh-token, their old refresh token is immediately revoked and a new pair is issued. This provides Replay Protection.
  • \n
  • Stolen Token Detection: (Implicit via Rotation) If a stolen token is reused, the API will reject it since it was already rotated.
  • \n
  • Flexible Delivery: You can choose to deliver the refresh token via a secure HTTP-Only cookie (for web clients to prevent XSS) and/or directly in the JSON response body (for mobile apps or specialized clients).
  • \n
  • Cross-Site Request Forgery (CSRF) Protection: When using cookies, adjust the COOKIE_SAME_SITE variable. Use strict when the frontend and backend are on the exact same domain, or lax/none (along with secure: true) if operating across subdomains or entirely different domains.
  • \n
  • Single-Session By Default: Logging into a new device automatically clears all older refresh tokens for that user, ensuring only one active session at a time.
  • \n
  • Auto-Cleanup: Expired tokens are automatically purged from the database during any refresh request, functioning as a lazy-cleanup job.
  • \n
\n

CORS Configuration

\n

The API includes Cross-Origin Resource Sharing (CORS) support to allow requests from different origins (e.g., frontend applications).

\n

Configuration

\n

CORS is configured via environment variables in .env:

\n
# Comma-separated list of allowed origins\nALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080,https://yourdomain.com\n\n# Allow credentials (cookies, authorization headers)\nCORS_CREDENTIALS=true\n
\n

Features

\n
    \n
  • Origin Whitelisting: Only specified origins can access the API
  • \n
  • Dynamic Validation: Origins are validated against the whitelist on each request
  • \n
  • Credentials Support: Allows sending cookies and authorization headers when enabled
  • \n
  • Preflight Caching: OPTIONS requests are cached for 24 hours to improve performance
  • \n
  • Comprehensive Headers: Supports common headers like Content-Type, Authorization, X-Requested-With
  • \n
\n

Security Best Practices

\n
\n

[!WARNING]\nProduction Security

\n
    \n
  • Never use * (wildcard) for ALLOWED_ORIGINS in production
  • \n
  • Only add trusted domains to the whitelist
  • \n
  • Use HTTPS for production origins (e.g., https://yourdomain.com)
  • \n
  • Regularly audit the allowed origins list
  • \n
\n
\n
\n

[!IMPORTANT]\nCredentials Configuration

\n
    \n
  • Set CORS_CREDENTIALS=true only if you're using cookies or need to send authorization headers
  • \n
  • When credentials are enabled, you cannot use wildcard origins
  • \n
  • Frontend must include credentials: 'include' (fetch) or withCredentials: true (axios)
  • \n
\n
\n

Environment-Specific Setup

\n

Development:

\n
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:8080\nCORS_CREDENTIALS=true\n
\n

Production:

\n
ALLOWED_ORIGINS=https://yourdomain.com,https://admin.yourdomain.com\nCORS_CREDENTIALS=true\n
\n

Troubleshooting

\n

CORS Error: \"No 'Access-Control-Allow-Origin' header\"

\n
    \n
  • Verify the origin is in ALLOWED_ORIGINS
  • \n
  • Check that CORS middleware is applied before routes in src/app.ts
  • \n
  • Ensure environment variables are loaded correctly
  • \n
\n

Credentials Not Working:

\n
    \n
  • Set CORS_CREDENTIALS=true in .env
  • \n
  • Frontend must send credentials: 'include' or withCredentials: true
  • \n
  • Origin must be specific (not *)
  • \n
\n

Audit Logging

\n

The API uses Pino for structured JSON logging with comprehensive audit trails:

\n

Logged Events:

\n
    \n
  • User registration (success/failure)
  • \n
  • Login attempts (success/failure with reasons)
  • \n
  • Logout events
  • \n
  • Email verification (success/failure)
  • \n
  • Resend verification requests
  • \n
  • Password reset requests
  • \n
  • Password reset completions
  • \n
  • Profile updates
  • \n
  • User deletions
  • \n
  • Password changes
  • \n
\n

Log Format:

\n
    \n
  • Development: Pretty-printed colored output
  • \n
  • Production: Structured JSON for log aggregation services (Axiom, Logtail, Datadog)
  • \n
\n

Example Log:

\n
{\n  \"level\": 30,\n  \"time\": 1702890637123,\n  \"action\": \"user_login\",\n  \"userId\": \"5ba52d7e-07f9-4b15-998f-fb1bf0885e7d\",\n  \"email\": \"user@example.com\",\n  \"msg\": \"User logged in successfully\"\n}\n
\n

Deployment

\n

Production Build

\n

The project is configured to use tsup for efficient bundling.

\n
    \n
  1. Build: pnpm build
      \n
    • Cleans dist/
    • \n
    • Bundles src/server.ts and dependencies to dist/server.js
    • \n
    • Copies email templates to dist/views/emails
    • \n
    \n
  2. \n
  3. Start: pnpm start
      \n
    • Runs node dist/server.js
    • \n
    \n
  4. \n
\n

Hosting Recommendations

\n
    \n
  • Railway/Render: Ideal for this Node.js setup. They will automatically detect the build and start scripts in package.json.
  • \n
  • VPS (Coolify/Docker): Full control over the environment. Ensure DATABASE_URL is set and migrations are run.
  • \n
\n

Database Migrations

\n

Always run migrations in production before starting the app:

\n
pnpm prisma migrate deploy\n
\n

Testing

\n

The project uses Vitest for unit and integration testing.

\n

Running Tests

\n
# Run all tests (watch mode)\npnpm test\n\n# Run unit tests only\npnpm test:unit\n\n# Run integration tests only\npnpm test:integration\n\n# Run with coverage\npnpm exec vitest run --coverage\n
\n

Test Structure

\n

Tests are organized in tests/ with separate directories for unit and integration tests:

\n
tests/\nโ”œโ”€โ”€ unit/                    # Unit tests (mocked dependencies)\nโ”‚   โ”œโ”€โ”€ controllers/\nโ”‚   โ”œโ”€โ”€ services/\nโ”‚   โ”œโ”€โ”€ middleware/\nโ”‚   โ””โ”€โ”€ utils/\nโ””โ”€โ”€ integration/             # Integration tests (real database)\n    โ”œโ”€โ”€ helpers/             # Test utilities (DB reset)\n    โ”œโ”€โ”€ repositories/        # Repository tests\n    โ””โ”€โ”€ routes/              # Route/endpoint tests\n
\n

Integration Tests

\n

Integration tests run against a real PostgreSQL database. Ensure your DATABASE_URL points to a test database that can be safely cleared between tests.

\n
\n

[!WARNING]\nIntegration tests truncate all tables before each test. Do not run against a production database.

\n
\n" }, - { - "fullName": "rizukirr/hyprsimple", - "name": "hyprsimple", - "owner": "rizukirr", - "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/230007457?v=4", - "description": "Minimal aesthetic arch linux + hyprland dotfiles", - "metaDescription": "Minimal aesthetic arch linux + hyprland dotfiles", - "url": "https://github.com/rizukirr/hyprsimple", - "homepage": "", - "language": "Shell", - "stars": 19, - "forks": 2, - "topics": [ - "arch-linux", - "dotfiles", - "hyprland", - "hyprland-config", - "linux", - "omarchy" - ], - "updatedAt": "2026-07-21T12:07:06Z", - "pushedAt": "2026-07-21T12:06:23Z", - "latestRelease": { - "name": "v0.2.2", - "tagName": "v0.2.2", - "url": "https://github.com/rizukirr/hyprsimple/releases/tag/v0.2.2", - "publishedAt": "2026-06-29T12:37:11Z" - }, - "archived": false, - "licenseSpdx": "", - "createdAt": "2025-10-04T10:27:45Z", - "openIssues": 0, - "openPullRequests": 0, - "subscribers": 1, - "communityHealth": 28, - "readmeHtml": "

hyprsimple

\n

Minimal Hyprland dotfiles for Arch Linux. Clean, functional, no bloat.

\n
\n

[!Note]\nThis dotfile have builtin muslimtify. A prayer time notification daemon for Linux. Run muslimtify-remove to uninstall it (package, daemon, waybar module, and CSS). Run muslimtify-add to re-enable it later. Both commands are idempotent and back up your waybar config to .bak before editing.

\n
\n

\"Home

\n\n\n\n\n\n\n\n\n\n\n\n
Power MenuTerminal
\"Power\"Terminal\"
\n\n\n\n\n\n\n\n\n\n\n\n
Menu LauncherTheme Switcher
\"Menu\"Theme
\n

Features

\n
    \n
  • 17 themes with one-key switching, all apps update at once (waybar, rofi, ghostty, hyprlock, dunst, btop)
  • \n
  • Per-theme wallpapers with picker and cycle support
  • \n
  • Per-theme backgrounds for app launcher and power menu
  • \n
  • Hardware auto-detection at install (NVIDIA, Vulkan, Intel iGPU, WiFi, battery)
  • \n
  • Wayland-native session via uwsm, no X11 dependencies
  • \n
  • Modular Hyprland config split into focused files
  • \n
  • GTK/QT theming with auto light/dark mode per theme
  • \n
  • Smart battery with auto brightness and power profiles
  • \n
  • Screen recording with mic, system audio, or silent modes
  • \n
  • Screenshot for monitor, window, region, or clipboard
  • \n
  • Clipboard history via cliphist + rofi
  • \n
  • Nightlight toggle for warm screen temperature
  • \n
  • Audio output switching with one key
  • \n
  • Prayer times on waybar via muslimtify
  • \n
  • Firewall (UFW) configured out of the box
  • \n
\n

Install

\n
git clone https://github.com/rizukirr/hyprsimple.git\ncd hyprsimple\n./install.sh\n
\n
\n

[!WARNING]\nThese dotfiles have only been tested on a fresh Arch Linux install where Hyprland was selected\nas the desktop during installation. Coming from another desktop environment or compositor\n(KDE, GNOME, etc.) is untested and may require manual cleanup.

\n
\n

If you run into a problem installing hyprsimple, please open an issue โ€” thank you!

\n

Network

\n

To see the available network interfaces, run wifi. To connect to a network, run wifi <network name> for example wifi \"MY NETWORK\"

\n

Keybindings

\n

Press SUPER + / for interactive viewer with fuzzy search.

\n

Applications

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + TOpen terminal (Ghostty)
SUPER + BOpen browser (Brave)
SUPER + AApp launcher (Rofi)
SUPER + FFile manager (Nautilus)
SUPER + ONotes (Obsidian)
SUPER + SAndroid Studio
SUPER + EEmoji picker
SUPER + VClipboard history
SUPER + MColor picker
\n

Window Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + QKill active window
SUPER + WToggle floating
SUPER + SHIFT + JToggle split (dwindle)
SUPER + H / J / K / LMove focus left / down / up / right
SUPER + SHIFT + ArrowResize window
SUPER + LMB dragMove window
SUPER + RMB dragResize window
\n

Workspaces

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + [1-9, 0]Switch to workspace 1-10
SUPER + SHIFT + [1-9, 0]Move window to workspace 1-10
SUPER + SHIFT + SMove window to scratchpad
SUPER + ScrollCycle through workspaces
\n

Theming & Wallpaper

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + SHIFT + TSwitch theme
SUPER + SHIFT + WPick wallpaper from current theme
SUPER + ALT + WCycle to next wallpaper
\n

Screenshot

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
PrintScreenshot current monitor
SUPER + PrintScreenshot active window
SUPER + ALT + PrintScreenshot selected region
SUPER + CTRL + PrintScreenshot region to clipboard
\n

Screen Recording

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + RRecord region with mic audio
SUPER + SHIFT + RRecord fullscreen with mic audio
SUPER + ALT + RRecord region with system audio
SUPER + SHIFT + ALT + RRecord fullscreen with system audio
SUPER + CTRL + RRecord region without audio
SUPER + CTRL + SHIFT + RRecord fullscreen without audio
\n

Media & Brightness

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
Volume Up / DownAdjust volume
MuteToggle mute
Mic MuteToggle microphone mute
Play / PauseMedia play/pause
Next / PrevMedia next/previous track
Brightness Up / DownAdjust screen brightness
Kbd Brightness Up / DownAdjust keyboard backlight
\n

System

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + ESCPower menu
SUPER + SHIFT + LLock screen
SUPER + XExit Hyprland
CTRL + ESCToggle waybar
SUPER + NToggle nightlight
SUPER + DDismiss notifications
SUPER + SHIFT + IToggle idle lock
SUPER + F10Switch audio output
SUPER + SHIFT + MToggle monitor mirroring
SUPER + CTRL + VToggle virtual mirror
SUPER + /Show all keybindings
\n

Scripts

\n

Helper scripts live in .local/bin (installed to ~/.local/bin, which is on PATH).\nMost are wired to keybindings or waybar; all can also be run directly from a terminal.

\n

Audio

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
audio-switch.shCycle through available audio output devices
volume-notify.shShow the current PipeWire volume via a dunst notification
record-audio.shRecord audio from the default input to ~/Music
\n

Display, Theme & Wallpaper

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
brightness-notify.shShow the current screen brightness via a dunst notification
keyboard-brightness.shControl the keyboard backlight (up / down / cycle)
toggle-nightlight.shToggle a warm screen temperature via hyprsunset
theme-switcher.shSwitch theme via rofi picker, or apply one directly by name
theme-apply-templates.shGenerate themed app configs from a theme's colors.toml
wallpaper-switcher.shSwitch or cycle wallpaper within the current theme
live-wallpaper-toggle.shToggle live wallpaper (cycle backgrounds vs. static)
monitor-mirror-toggle.shToggle extend vs. mirror mode for an external monitor
virtual-mirror-toggle.shMirror a monitor into a window (via wl-mirror) for screen sharing
\n

Screenshot & Recording

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
screenshot.shTake a screenshot (clipboard / window / region / monitor)
screen-record.shStart/stop screen recording (region or output; mic, internal, or no audio)
screen-record-active.shReport whether a screen recording is currently running
\n

Network

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
wifi.shList and connect to WiFi networks
wifi-powersave.shToggle WiFi power saving (on / off)
hotspot.shCreate a WiFi hotspot with internet sharing
setup-dns.shConfigure the DNS provider (Cloudflare / Google / DHCP)
\n

System & Power

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
battery-monitor.shLow-battery notifications and automatic brightness reduction
bluetooth-toggle.shToggle Bluetooth adapter power
toggle_cpu_mode.shSwitch CPU governor between performance and powersave
toggle-idle.shToggle hypridle (lock-on-idle) on/off
hypr-logout.shGracefully close all windows and stop the Hyprland session
\n

Input & Notifications

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
capslock-notify.shNotify on Caps Lock state changes
notification-dismiss.shDismiss all dunst notifications
\n

Search & Keybindings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
search.shFuzzy file finder (ripgrep + fzf) that opens the result in nvim
search_by_keyword.shFuzzy content search (ripgrep + fzf) that opens the match in nvim
show-keybindings.shShow all Hyprland keybindings in a rofi fuzzy-search menu
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
hyprsimple-muslimtify.shAdd or remove the muslimtify prayer-times integration
waybar-muslimtify.shProvide the waybar module output (next prayer + tooltip) for muslimtify
\n

Shell init & internal helpers

\n

These are sourced by other files rather than run directly.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
bashrc.sh / zsh.sh / fish.fishPer-shell init (zoxide, fzf, starship, aliases) sourced from your shell's rc file
terminal.shDetect your login shell and wire the matching init script into its rc file
hypr-helpers.shShared hyprpaper helper functions used by the wallpaper scripts
\n

FAQ

\n

Troubleshooting and known issues (NVIDIA boot hang, Plymouth blank-screen splash, and\nmore) are documented in FAQ.md.

\n

License

\n

MIT

\n" - }, { "fullName": "rahmanef63/open-silong", "name": "open-silong", @@ -1426,7 +1389,7 @@ "url": "https://github.com/rahmanef63/open-silong", "homepage": "https://silong-os.vercel.app/", "language": "TypeScript", - "stars": 18, + "stars": 19, "forks": 4, "topics": [ "block-editor", @@ -1440,7 +1403,7 @@ "self-hosted", "workspace" ], - "updatedAt": "2026-07-18T02:50:07Z", + "updatedAt": "2026-07-23T04:22:49Z", "pushedAt": "2026-07-17T09:32:16Z", "latestRelease": { "name": "v1.0.0 โ€” First public release", @@ -1457,6 +1420,43 @@ "communityHealth": 100, "readmeHtml": "

open-silong

\n

Open-source, self-hostable collaborative workspace โ€” inspired by Notion & Obsidian.

\n

\"Release\"\n\"License:\n\"Stack\"\n\"React\"\n\"Convex\"\n\"Tailwind\"\n\"PRs

\n

Live demo ยท\nDocs ยท\nContributing ยท\nSecurity

\n

\n

A block-based workspace for notes, docs, and lightweight databases,\nwith an Obsidian-style knowledge graph on top. Built for teams that\nwant to own their data: self-host the full stack with Docker\nCompose, or run on Convex Cloud free tier. MIT licensed. No vendor\nlock-in.

\n
\n

Inspired by Notion & Obsidian.\nopen-silong is an independent, clean-room project โ€” not affiliated with,\nendorsed by, or connected to Notion Labs, Inc. or Dynalist Inc. It borrows\nideas (the block editor, the knowledge graph), never code or brand assets.\nSee TRADEMARKS.md.

\n
\n

Screenshots

\n

\"open-silong

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Block editorDatabase โ€” TableDatabase โ€” Board
\"Block\"Database\"Database
Template galleryAdmin panelCommand palette
\"Template\"Admin\"Command
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Dark modeMobileFirst-run setup
\"Dashboard\"Mobile\"First-run
\n
\n

Captured live on silong-os.vercel.app,\nsigned in as the workspace superadmin (demo workspace seeded from the\n/setup wizard).

\n
\n

Features

\n
    \n
  • Block editor. Slash-menu, drag-handle reorder, nested children,\ninline markdown decorator (bold/italic/strike/code/links), cover\nimage, 30+ block types (paragraph, headings, todo, bullet/numbered\nlists, toggle, callout, quote, code, equation, table, image,\nvideo, embed, columns, divider, synced, โ€ฆ).
  • \n
  • Databases. Eleven views (Table ยท Board ยท List ยท Gallery ยท Calendar\nยท Feed ยท Timeline ยท Chart ยท Map ยท Form ยท Dashboard). Filter, sort,\nsearch, group, hide. Ten property types. Inline embed in any page OR\nopen as full page.
  • \n
  • Knowledge graph. Obsidian-style interactive graph of every page,\n[[wikilink]], @mention, #tag, and database row โ€” with backlinks\nand unresolved \"ghost\" nodes. Live d3-force layout with tunable\nforces, cluster tinting, and focus/neighbourhood highlighting.
  • \n
  • Multi-workspace. Per-user workspaces, member roles, invites.\nWorkspace switcher in sidebar.
  • \n
  • Sharing. Public read-only share links (custom slug +\nsearch-indexable toggle). Wiki mode. Per-page grants โ€” share one\npage with a specific member as viewer or editor.
  • \n
  • Collaboration. Threaded comments per block, @page mentions,\npresence indicators, version snapshots.
  • \n
  • Import / export. JSON round-trip preserves blocks + databases
      \n
    • sharing state. Markdown export per page. ZIP bundle export.
    • \n
    \n
  • \n
  • MCP-ready. First-class Notion-canonical JSON HTTP surface for\nAI agents and integrations (/mcp/v1).
  • \n
  • Self-host friendly. Docker Compose template for Convex backend +\nPostgres. Traefik-frontable. Dokploy-tested.
  • \n
\n

Quick start (pick a lane)

\n

Lane 1 โ€” Convex Cloud (fastest, free tier)

\n

One-click: Deploy with Vercel โ€”\nonly asks for CONVEX_DEPLOY_KEY (create a project at\ndashboard.convex.dev โ†’ Settings โ†’ Deploy\nKeys). The build deploys the Convex functions, provisions the auth keys,\nand injects NEXT_PUBLIC_CONVEX_URL automatically. Your first visit\nlands on the /setup wizard: claim the owner (superadmin) account and\nseed the template gallery + demo workspace in one click.

\n

Local development:

\n
git clone https://github.com/rahmanef63/open-silong.git\ncd open-silong\npnpm install\ncp .env.example .env.local        # fill NEXT_PUBLIC_CONVEX_URL after step 4\nnpx convex dev                    # creates Convex Cloud project, prints URL\npnpm dev                          # http://localhost:3000\n
\n

Convex Cloud free tier covers small teams. Full walk-through in\nDEPLOY.md.

\n

Lane 2 โ€” Self-hosted (Docker Compose, full control)

\n
git clone https://github.com/rahmanef63/open-silong.git\ncd open-silong\ncp .env.example .env.local        # fill INSTANCE_*, JWT_*, POSTGRES_URL\ndocker compose up -d              # Convex backend on port 3210\npnpm install\npnpm exec convex deploy --yes     # push schema + functions\npnpm dev                          # http://localhost:3000\n
\n

Full Dokploy + Traefik + Postgres + S3 setup in\nDEPLOY.md.

\n

Google OAuth sign-in (any lane)

\n

convex/auth.ts already wires Google โ€” just provide credentials:

\n
# 1. Google Cloud Console โ†’ APIs & Services โ†’ Credentials โ†’ Create OAuth 2.0\n#    client (Web app). Authorized redirect URI:\n#    https://<your-CONVEX_SITE_ORIGIN>/api/auth/callback/google\n# 2. Set on Convex backend\npnpm exec convex env set AUTH_GOOGLE_ID <client-id>.apps.googleusercontent.com\npnpm exec convex env set AUTH_GOOGLE_SECRET <client-secret>\n
\n

The \"Sign in with Google\" button in /auth activates automatically\nonce those two env vars are set. Step-by-step including consent screen\nsetup + adding GitHub/Apple/Discord providers:\nDEPLOY.md#google-oauth-sign-in-optional.

\n

Lane 3 โ€” Try without installing

\n

silong-os.vercel.app โ€” public demo.\nLands you straight in a guest workspace (no sign-up needed), or create\nan email + password account to keep your data. Instance is shared.

\n

Lane 4 โ€” Template only (no backend)

\n

Looking for the UI as a localStorage-only starter? The same editor\nships as notion-page-clone-os in the\nrahman-resources template\nmarketplace:

\n
npx rahman-resources@latest add notion-page-clone-os\n
\n

Stack

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LayerChoiceWhy
FrontendNext 16 (App Router) + React 19RSC, streaming, file-based routing
StylingTailwind v4 + shadcn/uiTheme tokens, primitives, dark mode
BackendConvex 1.36 (self-hostable)Realtime, optimistic, typed end-to-end
Auth@convex-dev/authMagic-link, OAuth-ready, no Clerk
StorageConvex file storage OR S3 adapterPluggable per slice
SearchConvex full-text indexNo external search service
DeployDocker Compose + Traefik (self-host) OR Convex CloudPick your trade-off
\n

Architecture

\n

A one-screen system view. The full set โ€” data model, auth/authz flow, slice\ngraph, and the memory-graph pipeline โ€” lives in\ndocs/architecture/diagrams.md.

\n
flowchart LR\n    B[\"Browser<br/>Next 16 ยท React 19\"] --> P[\"proxy.ts<br/>optimistic auth gate\"]\n    B -- \"reactive queries\" --> C[\"Convex backend<br/>queries ยท mutations<br/>in-handler authz\"]\n    P --> C\n    C --> S[\"schema.ts ยท 32 tables\"]\n    S --> DB[(\"Postgres / Convex Cloud\")]\n    C --> F[(\"Files: Convex blob / S3\")]\n    A[\"AI agents\"] -- \"Notion-canonical JSON\" --> H[\"MCP HTTP surface\"] --> C\n
\n

Repository layout:

\n
app/                  Next 16 App Router routes\n  dashboard/*         Authenticated surfaces (pages, db, settings, โ€ฆ)\n  share/[id]          Public read-only share surface\n  preview/*           Marketing + sandbox\n\nfrontend/\n  slices/<name>/      Vertical feature slices โ€” see docs/api/slices.md\n  shared/             Cross-slice primitives, providers, store hooks\nproxy.ts              Convex auth optimistic gate (not the security boundary)\n\nconvex/\n  features/<name>/    Per-feature backend (schema + queries + mutations)\n  _shared/            Auth helpers, rate limit, workspace gates\n  http.ts             Public HTTP routes (share, MCP)\n  mcp/                MCP HTTP surface (Notion-canonical JSON)\n\ndocker-compose.yml    Convex self-hosted (port 3210, Traefik-frontable)\n
\n

The codebase follows a slice architecture: each feature lives in\nfrontend/slices/<name>/ with optional convex/features/<name>/\nmirror. Cross-slice imports go through the barrel only. See\nCONTRIBUTING.md for the rules.

\n

Documentation

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TopicWhere
Per-slice API + UX docsdocs/api/
Architecture diagrams (system ยท data model ยท flows)docs/architecture/diagrams.md
Deploy walkthroughs (cloud + self-host + Dokploy)DEPLOY.md
Slice catalog (every feature in one page)docs/api/slices.md
Architecture decisions + audit notesdocs/audit/
Contributing guideCONTRIBUTING.md
Security policySECURITY.md
Code of ConductCODE_OF_CONDUCT.md
Trademarks + inspiration + legal notesTRADEMARKS.md
ChangelogCHANGELOG.md
\n

Roadmap

\n
    \n
  • Block editor + 6 database views
  • \n
  • Multi-workspace + invites
  • \n
  • Public share links + wiki mode
  • \n
  • Comments + mentions + snapshots
  • \n
  • JSON import/export
  • \n
  • MCP HTTP surface
  • \n
  • Per-page share grants (viewer / editor)
  • \n
  • Partial Prerendering (Cache Components)
  • \n
  • Google OAuth sign-in (opt-in)
  • \n
  • More OAuth providers (GitHub, Apple)
  • \n
  • Real-time multiplayer cursors
  • \n
  • PWA + offline mode
  • \n
\n

See docs/notion-clone/ROADMAP.md\nfor the full backlog.

\n

Contributing

\n

Bug reports, feature ideas, doc fixes, and code PRs are all welcome.\nRead CONTRIBUTING.md for dev setup, slice\narchitecture, and PR conventions.

\n

By participating, you agree to the\nCode of Conduct.

\n

Security

\n

Found a vulnerability? Please don't open a public issue. Email\nsecurity@rahmanef.com or use a private GitHub Security Advisory โ€”\nsee SECURITY.md for SLAs and scope.

\n

License

\n

MIT ยฉ 2026 Rahman Effendi and open-silong contributors.

\n
\n

Trademark + inspiration notice

\n

open-silong is an independent open-source project. It is not\naffiliated with, sponsored by, endorsed by, or associated with Notion\nLabs, Inc. or Dynalist Inc. (the maker of Obsidian) in any way.

\n

It is inspired by Notion (the block editor +\nlightweight databases) and Obsidian (the\nlocal-first knowledge graph). \"Notion\" and \"Obsidian\" are trademarks of\ntheir respective owners, used here only in a nominative / descriptive\nsense to identify familiar UI patterns โ€” analogous to how an \"iPhone\ncase\" advertises compatibility without claiming any link to Apple.

\n

open-silong is a clean-room implementation built independently on\nConvex, Next.js,\nshadcn/ui, and the open-source\nd3-force layout. No proprietary Notion or\nObsidian code, design files, brand assets, or trade secrets are used.\nImport/export adapters target documented public file formats purely for\ninteroperability.

\n

A full plain-language explanation โ€” the idea/expression distinction,\nnominative fair use, and international (EU/CJEU) anchors โ€” is in\nTRADEMARKS.md. If you represent a rights holder\nand have a good-faith concern, reach us via the email in\nSECURITY.md โ€” we will adjust naming, disclaimers, or\nsurfaces in good faith.

\n
\n

This notice is not legal advice; consult a qualified attorney for\nguidance specific to your jurisdiction and use.

\n
\n" }, + { + "fullName": "rizukirr/hyprsimple", + "name": "hyprsimple", + "owner": "rizukirr", + "ownerAvatarUrl": "https://avatars.githubusercontent.com/u/230007457?v=4", + "description": "Minimal aesthetic arch linux + hyprland dotfiles", + "metaDescription": "Minimal aesthetic arch linux + hyprland dotfiles", + "url": "https://github.com/rizukirr/hyprsimple", + "homepage": "", + "language": "Shell", + "stars": 19, + "forks": 2, + "topics": [ + "arch-linux", + "dotfiles", + "hyprland", + "hyprland-config", + "linux", + "omarchy" + ], + "updatedAt": "2026-07-21T12:07:06Z", + "pushedAt": "2026-07-21T12:06:23Z", + "latestRelease": { + "name": "v0.2.2", + "tagName": "v0.2.2", + "url": "https://github.com/rizukirr/hyprsimple/releases/tag/v0.2.2", + "publishedAt": "2026-06-29T12:37:11Z" + }, + "archived": false, + "licenseSpdx": "", + "createdAt": "2025-10-04T10:27:45Z", + "openIssues": 0, + "openPullRequests": 0, + "subscribers": 1, + "communityHealth": 28, + "readmeHtml": "

hyprsimple

\n

Minimal Hyprland dotfiles for Arch Linux. Clean, functional, no bloat.

\n
\n

[!Note]\nThis dotfile have builtin muslimtify. A prayer time notification daemon for Linux. Run muslimtify-remove to uninstall it (package, daemon, waybar module, and CSS). Run muslimtify-add to re-enable it later. Both commands are idempotent and back up your waybar config to .bak before editing.

\n
\n

\"Home

\n\n\n\n\n\n\n\n\n\n\n\n
Power MenuTerminal
\"Power\"Terminal\"
\n\n\n\n\n\n\n\n\n\n\n\n
Menu LauncherTheme Switcher
\"Menu\"Theme
\n

Features

\n
    \n
  • 17 themes with one-key switching, all apps update at once (waybar, rofi, ghostty, hyprlock, dunst, btop)
  • \n
  • Per-theme wallpapers with picker and cycle support
  • \n
  • Per-theme backgrounds for app launcher and power menu
  • \n
  • Hardware auto-detection at install (NVIDIA, Vulkan, Intel iGPU, WiFi, battery)
  • \n
  • Wayland-native session via uwsm, no X11 dependencies
  • \n
  • Modular Hyprland config split into focused files
  • \n
  • GTK/QT theming with auto light/dark mode per theme
  • \n
  • Smart battery with auto brightness and power profiles
  • \n
  • Screen recording with mic, system audio, or silent modes
  • \n
  • Screenshot for monitor, window, region, or clipboard
  • \n
  • Clipboard history via cliphist + rofi
  • \n
  • Nightlight toggle for warm screen temperature
  • \n
  • Audio output switching with one key
  • \n
  • Prayer times on waybar via muslimtify
  • \n
  • Firewall (UFW) configured out of the box
  • \n
\n

Install

\n
git clone https://github.com/rizukirr/hyprsimple.git\ncd hyprsimple\n./install.sh\n
\n
\n

[!WARNING]\nThese dotfiles have only been tested on a fresh Arch Linux install where Hyprland was selected\nas the desktop during installation. Coming from another desktop environment or compositor\n(KDE, GNOME, etc.) is untested and may require manual cleanup.

\n
\n

If you run into a problem installing hyprsimple, please open an issue โ€” thank you!

\n

Network

\n

To see the available network interfaces, run wifi. To connect to a network, run wifi <network name> for example wifi \"MY NETWORK\"

\n

Keybindings

\n

Press SUPER + / for interactive viewer with fuzzy search.

\n

Applications

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + TOpen terminal (Ghostty)
SUPER + BOpen browser (Brave)
SUPER + AApp launcher (Rofi)
SUPER + FFile manager (Nautilus)
SUPER + ONotes (Obsidian)
SUPER + SAndroid Studio
SUPER + EEmoji picker
SUPER + VClipboard history
SUPER + MColor picker
\n

Window Management

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + QKill active window
SUPER + WToggle floating
SUPER + SHIFT + JToggle split (dwindle)
SUPER + H / J / K / LMove focus left / down / up / right
SUPER + SHIFT + ArrowResize window
SUPER + LMB dragMove window
SUPER + RMB dragResize window
\n

Workspaces

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + [1-9, 0]Switch to workspace 1-10
SUPER + SHIFT + [1-9, 0]Move window to workspace 1-10
SUPER + SHIFT + SMove window to scratchpad
SUPER + ScrollCycle through workspaces
\n

Theming & Wallpaper

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + SHIFT + TSwitch theme
SUPER + SHIFT + WPick wallpaper from current theme
SUPER + ALT + WCycle to next wallpaper
\n

Screenshot

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
PrintScreenshot current monitor
SUPER + PrintScreenshot active window
SUPER + ALT + PrintScreenshot selected region
SUPER + CTRL + PrintScreenshot region to clipboard
\n

Screen Recording

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + RRecord region with mic audio
SUPER + SHIFT + RRecord fullscreen with mic audio
SUPER + ALT + RRecord region with system audio
SUPER + SHIFT + ALT + RRecord fullscreen with system audio
SUPER + CTRL + RRecord region without audio
SUPER + CTRL + SHIFT + RRecord fullscreen without audio
\n

Media & Brightness

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
Volume Up / DownAdjust volume
MuteToggle mute
Mic MuteToggle microphone mute
Play / PauseMedia play/pause
Next / PrevMedia next/previous track
Brightness Up / DownAdjust screen brightness
Kbd Brightness Up / DownAdjust keyboard backlight
\n

System

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyAction
SUPER + ESCPower menu
SUPER + SHIFT + LLock screen
SUPER + XExit Hyprland
CTRL + ESCToggle waybar
SUPER + NToggle nightlight
SUPER + DDismiss notifications
SUPER + SHIFT + IToggle idle lock
SUPER + F10Switch audio output
SUPER + SHIFT + MToggle monitor mirroring
SUPER + CTRL + VToggle virtual mirror
SUPER + /Show all keybindings
\n

Scripts

\n

Helper scripts live in .local/bin (installed to ~/.local/bin, which is on PATH).\nMost are wired to keybindings or waybar; all can also be run directly from a terminal.

\n

Audio

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
audio-switch.shCycle through available audio output devices
volume-notify.shShow the current PipeWire volume via a dunst notification
record-audio.shRecord audio from the default input to ~/Music
\n

Display, Theme & Wallpaper

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
brightness-notify.shShow the current screen brightness via a dunst notification
keyboard-brightness.shControl the keyboard backlight (up / down / cycle)
toggle-nightlight.shToggle a warm screen temperature via hyprsunset
theme-switcher.shSwitch theme via rofi picker, or apply one directly by name
theme-apply-templates.shGenerate themed app configs from a theme's colors.toml
wallpaper-switcher.shSwitch or cycle wallpaper within the current theme
live-wallpaper-toggle.shToggle live wallpaper (cycle backgrounds vs. static)
monitor-mirror-toggle.shToggle extend vs. mirror mode for an external monitor
virtual-mirror-toggle.shMirror a monitor into a window (via wl-mirror) for screen sharing
\n

Screenshot & Recording

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
screenshot.shTake a screenshot (clipboard / window / region / monitor)
screen-record.shStart/stop screen recording (region or output; mic, internal, or no audio)
screen-record-active.shReport whether a screen recording is currently running
\n

Network

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
wifi.shList and connect to WiFi networks
wifi-powersave.shToggle WiFi power saving (on / off)
hotspot.shCreate a WiFi hotspot with internet sharing
setup-dns.shConfigure the DNS provider (Cloudflare / Google / DHCP)
\n

System & Power

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
battery-monitor.shLow-battery notifications and automatic brightness reduction
bluetooth-toggle.shToggle Bluetooth adapter power
toggle_cpu_mode.shSwitch CPU governor between performance and powersave
toggle-idle.shToggle hypridle (lock-on-idle) on/off
hypr-logout.shGracefully close all windows and stop the Hyprland session
\n

Input & Notifications

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
capslock-notify.shNotify on Caps Lock state changes
notification-dismiss.shDismiss all dunst notifications
\n

Search & Keybindings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
search.shFuzzy file finder (ripgrep + fzf) that opens the result in nvim
search_by_keyword.shFuzzy content search (ripgrep + fzf) that opens the match in nvim
show-keybindings.shShow all Hyprland keybindings in a rofi fuzzy-search menu
\n

Integrations

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
hyprsimple-muslimtify.shAdd or remove the muslimtify prayer-times integration
waybar-muslimtify.shProvide the waybar module output (next prayer + tooltip) for muslimtify
\n

Shell init & internal helpers

\n

These are sourced by other files rather than run directly.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScriptDescription
bashrc.sh / zsh.sh / fish.fishPer-shell init (zoxide, fzf, starship, aliases) sourced from your shell's rc file
terminal.shDetect your login shell and wire the matching init script into its rc file
hypr-helpers.shShared hyprpaper helper functions used by the wallpaper scripts
\n

FAQ

\n

Troubleshooting and known issues (NVIDIA boot hang, Plymouth blank-screen splash, and\nmore) are documented in FAQ.md.

\n

License

\n

MIT

\n" + }, { "fullName": "RafiulM/warungos", "name": "warungos", @@ -1591,8 +1591,8 @@ "stars": 14, "forks": 2, "topics": [], - "updatedAt": "2026-07-22T12:27:39Z", - "pushedAt": "2026-07-22T12:26:04Z", + "updatedAt": "2026-07-23T05:17:32Z", + "pushedAt": "2026-07-23T05:17:02Z", "latestRelease": { "name": "v1.2.54", "tagName": "v1.2.54", @@ -1850,7 +1850,7 @@ "semantic-search" ], "updatedAt": "2026-07-03T02:36:07Z", - "pushedAt": "2026-07-23T02:39:54Z", + "pushedAt": "2026-07-23T04:31:41Z", "latestRelease": { "name": "OpenEmpiric v1.0.5", "tagName": "v1.0.5",