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/data/blog-posts.json b/src/data/blog-posts.json index 49c9ae0..b940063 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": "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: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", + "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", 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 4e52e47..ab8f07d 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -9,8 +9,8 @@ "url": "https://github.com/faisalman/ua-parser-js", "homepage": "https://uaparser.dev/", "language": "JavaScript", - "stars": 10166, - "forks": 1220, + "stars": 10168, + "forks": 1219, "topics": [ "analytics", "bot-detection", @@ -21,7 +21,7 @@ "user-agent", "user-agent-parser" ], - "updatedAt": "2026-07-20T20:25:02Z", + "updatedAt": "2026-07-22T01:49:00Z", "pushedAt": "2026-07-20T18:03:11Z", "latestRelease": { "name": "v2.0.10", @@ -57,22 +57,22 @@ "php", "php-library" ], - "updatedAt": "2026-07-15T07:13:39Z", - "pushedAt": "2026-07-10T11:30:02Z", + "updatedAt": "2026-07-21T15:58:34Z", + "pushedAt": "2026-07-21T15:58:49Z", "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": "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": 4, - "openPullRequests": 2, + "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", @@ -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, @@ -124,13 +124,13 @@ "homepage": "", "language": "PHP", "stars": 1213, - "forks": 1165, + "forks": 1168, "topics": [ "opensid", "sistem-informasi-desa" ], - "updatedAt": "2026-07-18T07:46:28Z", - "pushedAt": "2026-07-18T13:09:40Z", + "updatedAt": "2026-07-22T13:40:31Z", + "pushedAt": "2026-07-23T05:30:50Z", "latestRelease": { "name": "Rilis v2607.0.0", "tagName": "v2607.0.0", @@ -140,9 +140,9 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 351, - "openPullRequests": 6, - "subscribers": 109, + "openIssues": 350, + "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" }, @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 897, + "stars": 900, "forks": 279, "topics": [], - "updatedAt": "2026-07-21T01:48:51Z", + "updatedAt": "2026-07-22T22:15:38Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -170,8 +170,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-01-15T09:55:34Z", - "openIssues": 5, - "openPullRequests": 0, + "openIssues": 6, + "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

🏗️ 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

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

2. Highlight Detection

\n\n

3. Portrait Conversion

\n\n

4. Hook Generation

\n\n

5. Caption Generation

\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
\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

🙏 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" @@ -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", @@ -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", @@ -291,8 +291,8 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 311, - "forks": 29, + "stars": 314, + "forks": 30, "topics": [ "ai-agents", "antigravity", @@ -313,22 +313,22 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-21T03:08:12Z", - "pushedAt": "2026-07-21T03:08:08Z", + "updatedAt": "2026-07-23T05:00:52Z", + "pushedAt": "2026-07-23T05:00:38Z", "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", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 10, - "openPullRequests": 0, + "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. 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 — 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
\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, though the end-to-end cost is not zero.

\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\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": 169, - "forks": 31, + "stars": 174, + "forks": 33, "topics": [ "coding", "developer-tools", @@ -352,13 +352,13 @@ "productivity", "tiptap-editor" ], - "updatedAt": "2026-07-20T09:52:59Z", - "pushedAt": "2026-07-21T00:48:22Z", + "updatedAt": "2026-07-22T14:50:59Z", + "pushedAt": "2026-07-22T07:01:42Z", "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.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,8 +379,8 @@ "url": "https://github.com/gnoviawan/termul", "homepage": "https://termul.dev", "language": "TypeScript", - "stars": 164, - "forks": 33, + "stars": 166, + "forks": 34, "topics": [ "cross-platform", "desktop-app", @@ -396,8 +396,8 @@ "terminal-emulator", "workspace-manager" ], - "updatedAt": "2026-07-20T13:04:18Z", - "pushedAt": "2026-07-20T02:15:44Z", + "updatedAt": "2026-07-22T15:41:25Z", + "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": 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" @@ -423,10 +423,10 @@ "url": "https://github.com/mallexibra-dev/clipforge", "homepage": "", "language": "Python", - "stars": 153, - "forks": 36, + "stars": 154, + "forks": 37, "topics": [], - "updatedAt": "2026-07-19T20:26:42Z", + "updatedAt": "2026-07-22T06:40:34Z", "pushedAt": "2026-06-26T05:38:51Z", "latestRelease": null, "archived": false, @@ -473,7 +473,7 @@ "url": "https://github.com/codecoradev/uteke", "homepage": "https://codecora.dev", "language": "Rust", - "stars": 121, + "stars": 127, "forks": 15, "topics": [ "ai", @@ -490,47 +490,22 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-21T03:10:39Z", - "pushedAt": "2026-07-21T03:17:27Z", + "updatedAt": "2026-07-23T03:40:07Z", + "pushedAt": "2026-07-23T03:39:52Z", "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": 3, - "openPullRequests": 0, + "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" - }, - { - "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
\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

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

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
\n

📄 License

\n

MIT License

\n
\n

🙏 Credits

\n

Built with ❤️ for Indonesian small businesses.

\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": "IlhamriSKY/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": 113, "forks": 25, "topics": [ "api-wrapper", "package", "python3" ], - "updatedAt": "2026-07-19T12:43:17Z", + "updatedAt": "2026-07-22T17:59:08Z", "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

📦 Instalasi

\n
pip install pddiktipy\n
\n

Requirements:

\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

🧪 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
\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

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

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
\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", @@ -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", @@ -657,8 +657,8 @@ "url": "https://github.com/mydisha/keirouter", "homepage": "https://keirouter.app", "language": "Go", - "stars": 89, - "forks": 30, + "stars": 92, + "forks": 33, "topics": [ "ai", "ai-gateway", @@ -679,7 +679,7 @@ "rtk", "zai" ], - "updatedAt": "2026-07-20T02:21:27Z", + "updatedAt": "2026-07-22T15:09:52Z", "pushedAt": "2026-07-16T08:27:50Z", "latestRelease": { "name": "v0.1.26", @@ -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

Cost control

\n\n

Safety & governance

\n\n

Operations & UX

\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

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

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

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
\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

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" @@ -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,8 +717,8 @@ "svelte-components", "sveltekit" ], - "updatedAt": "2026-07-20T01:33:20Z", - "pushedAt": "2026-07-20T23:57:22Z", + "updatedAt": "2026-07-22T07:23:13Z", + "pushedAt": "2026-07-21T07:49:35Z", "latestRelease": { "name": "svelte-audio-ui@1.0.1", "tagName": "v1.0.1", @@ -788,13 +788,13 @@ "tauri", "terminal" ], - "updatedAt": "2026-07-20T01:29:59Z", - "pushedAt": "2026-07-20T01:29:54Z", + "updatedAt": "2026-07-23T01:16:57Z", + "pushedAt": "2026-07-23T01:16:54Z", "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.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", @@ -815,8 +815,8 @@ "url": "https://github.com/wauputr4/bansos", "homepage": "https://bansos.dev", "language": "Svelte", - "stars": 49, - "forks": 7, + "stars": 51, + "forks": 8, "topics": [ "bansos", "cli", @@ -829,8 +829,8 @@ "static-site", "sveltekit" ], - "updatedAt": "2026-07-20T09:11:40Z", - "pushedAt": "2026-07-20T09:10:23Z", + "updatedAt": "2026-07-22T12:18:56Z", + "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": 3, + "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

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" + "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

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
\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

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" }, { "fullName": "giosakti/duragent", @@ -983,8 +983,8 @@ "stars": 45, "forks": 10, "topics": [], - "updatedAt": "2026-07-18T17:14:35Z", - "pushedAt": "2026-07-18T17:14:32Z", + "updatedAt": "2026-07-22T09:59:47Z", + "pushedAt": "2026-07-22T09:59:29Z", "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 hookPreToolUse 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 + docsalwaysApply 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,13 +1090,13 @@ "stars": 39, "forks": 4, "topics": [], - "updatedAt": "2026-07-17T04:24:06Z", - "pushedAt": "2026-07-17T04:12:10Z", + "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", @@ -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

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

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
  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
  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

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
\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
\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

Performance & Stability

\n\n

Hardware Safety

\n

ShaPrint interacts with hardware exclusively through standard Windows APIs:

\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
  2. \n
  3. Coordinate with IT

    \n\n
  4. \n
  5. Use Only on Trusted 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
\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
\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

How it works

\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

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
\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
\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

Performance & Stability

\n\n

Hardware Safety

\n

ShaPrint interacts with hardware exclusively through standard Windows APIs:

\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
  2. \n
  3. Coordinate with IT

    \n\n
  4. \n
  5. Use Only on Trusted 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
\n
\n Developed by ardli-firman
\n Open Source Print Management\n
\n" + }, { "fullName": "pendig/rute-bayar", "name": "rute-bayar", @@ -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", @@ -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": 21, "forks": 5, "topics": [ "conservation", @@ -1362,7 +1337,7 @@ "pmtiles", "wildlife" ], - "updatedAt": "2026-07-20T10:31:49Z", + "updatedAt": "2026-07-22T13:53:51Z", "pushedAt": "2026-07-20T10:31:33Z", "latestRelease": { "name": "Mandum Rimba v1.0.0", @@ -1380,41 +1355,29 @@ "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": "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", + "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": "Shell", - "stars": 19, - "forks": 2, - "topics": [ - "arch-linux", - "dotfiles", - "hyprland", - "hyprland-config", - "linux", - "omarchy" - ], - "updatedAt": "2026-07-21T02:40:15Z", - "pushedAt": "2026-07-21T02:40:10Z", - "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" - }, + "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": "2025-10-04T10:27:45Z", + "createdAt": "2026-04-08T09:27:49Z", "openIssues": 0, "openPullRequests": 0, - "subscribers": 1, + "subscribers": 0, "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

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" + "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": "rahmanef63/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

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

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

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-19T13:15:57Z", - "pushedAt": "2026-07-19T13:15:50Z", + "updatedAt": "2026-07-23T05:17:32Z", + "pushedAt": "2026-07-23T05:17:02Z", "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
\n

🛠️ Tech Stack & Architecture

\n

Superagent is built on modern Node.js technologies for high performance and modular architecture:

\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

Advanced Orchestration Features:

\n\n

Standard subagent roles (single-agent mode):

\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

6. Safe Merge Strategy (v2)

\n

The merge system uses a safe-by-default strategy that prevents file corruption:

\n\n

7. Advanced Superagent Modes

\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

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
\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

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

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

4. Background Job Scheduling & Timers (schedule)

\n

Superagent implements a background scheduler supporting:

\n\n

5. Auto-Checkpoint Engine

\n

Built into the core agent loop (agent.ts), the auto-checkpoint system:

\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
\n

🚀 Getting Started & Configuration

\n

Prerequisites

\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

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
\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

State Checkpoints

\n\n

Automation & Tasks

\n\n

Terminal & Presets

\n\n

Skills & Plugins

\n\n

Internal Hooks

\n\n

Provider & Model Settings

\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
\n

🛠️ Tech Stack & Architecture

\n

Superagent is built on modern Node.js technologies for high performance and modular architecture:

\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

Advanced Orchestration Features:

\n\n

Standard subagent roles (single-agent mode):

\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

6. Safe Merge Strategy (v2)

\n

The merge system uses a safe-by-default strategy that prevents file corruption:

\n\n

7. Advanced Superagent Modes

\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

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
\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

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

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

4. Background Job Scheduling & Timers (schedule)

\n

Superagent implements a background scheduler supporting:

\n\n

5. Auto-Checkpoint Engine

\n

Built into the core agent loop (agent.ts), the auto-checkpoint system:

\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
\n

🚀 Getting Started & Configuration

\n

Prerequisites

\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

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
\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

State Checkpoints

\n\n

Automation & Tasks

\n\n

Terminal & Presets

\n\n

Skills & Plugins

\n\n

Internal Hooks

\n\n

Provider & Model Settings

\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", @@ -1633,22 +1633,22 @@ "windows-app", "windows-desktop" ], - "updatedAt": "2026-07-20T14:10:16Z", - "pushedAt": "2026-07-20T14:11:33Z", + "updatedAt": "2026-07-22T08:11:34Z", + "pushedAt": "2026-07-22T08:09:40Z", "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, + "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
\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" + "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
\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

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

Location detection is not working

\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

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", @@ -1850,7 +1850,7 @@ "semantic-search" ], "updatedAt": "2026-07-03T02:36:07Z", - "pushedAt": "2026-07-14T09:11:34Z", + "pushedAt": "2026-07-23T04:31:41Z", "latestRelease": { "name": "OpenEmpiric v1.0.5", "tagName": "v1.0.5", @@ -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" @@ -2094,13 +2094,13 @@ "stars": 6, "forks": 0, "topics": [], - "updatedAt": "2026-07-19T14:21:27Z", - "pushedAt": "2026-07-19T14:21:23Z", + "updatedAt": "2026-07-22T20:12:49Z", + "pushedAt": "2026-07-22T20:12:36Z", "latestRelease": null, "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-06-01T10:04:41Z", - "openIssues": 2, + "openIssues": 1, "openPullRequests": 0, "subscribers": 0, "communityHealth": 100, @@ -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

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

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", @@ -2309,9 +2309,14 @@ "skills-sh", "tailscale" ], - "updatedAt": "2026-06-25T07:10:50Z", - "pushedAt": "2026-06-06T17:33:55Z", - "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", @@ -2319,7 +2324,7 @@ "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

What It Helps Agents Do

\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

Design Principles

\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

What It Helps Agents Do

\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

Design Principles

\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", @@ -2429,8 +2434,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 +2444,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

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

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

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

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", @@ -2454,8 +2459,8 @@ "stars": 1, "forks": 0, "topics": [], - "updatedAt": "2026-07-20T13:35:57Z", - "pushedAt": "2026-07-20T13:35:09Z", + "updatedAt": "2026-07-22T02:39:52Z", + "pushedAt": "2026-07-22T02:39:48Z", "latestRelease": { "name": "v1.1.0", "tagName": "v1.1.0", diff --git a/src/data/revival.json b/src/data/revival.json index 65ddeef..23df244 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 @@ -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": 113, "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-22T17:59:08Z", "pushedAt": "2025-07-30T13:28:14Z", "archived": false, "disabled": false 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.

) : (