From 6646d7ebaf3e143658fd8ae03de0eba1d0bd9a4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:57:43 +0000 Subject: [PATCH 1/4] Sync content data --- src/data/legacy.json | 4 +- src/data/projects.json | 118 ++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/data/legacy.json b/src/data/legacy.json index 9143d05..1bb3c5b 100644 --- a/src/data/legacy.json +++ b/src/data/legacy.json @@ -24,7 +24,7 @@ "description": "List of All Programming Telegram Group", "url": "https://github.com/hendisantika/List-All-Programming-Telegram-Group", "homepage": "", - "stars": 1484, + "stars": 1483, "forks": 364, "language": "Crystal", "topics": [ @@ -44,7 +44,7 @@ ], "license": "CC0-1.0", "createdAt": "2017-04-06T23:39:58Z", - "updatedAt": "2026-07-13T09:56:32Z", + "updatedAt": "2026-07-20T18:42:02Z", "pushedAt": "2025-08-03T03:05:42Z", "archived": false, "disabled": false diff --git a/src/data/projects.json b/src/data/projects.json index 8178ea3..65a7186 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -9,7 +9,7 @@ "url": "https://github.com/faisalman/ua-parser-js", "homepage": "https://uaparser.dev/", "language": "JavaScript", - "stars": 10167, + "stars": 10168, "forks": 1220, "topics": [ "analytics", @@ -21,8 +21,8 @@ "user-agent", "user-agent-parser" ], - "updatedAt": "2026-07-19T06:28:00Z", - "pushedAt": "2026-06-27T13:14:27Z", + "updatedAt": "2026-07-20T18:04:52Z", + "pushedAt": "2026-07-20T18:03:11Z", "latestRelease": { "name": "v2.0.10", "tagName": "2.0.10", @@ -32,7 +32,7 @@ "archived": false, "licenseSpdx": "AGPL-3.0", "createdAt": "2012-02-01T01:11:49Z", - "openIssues": 15, + "openIssues": 12, "openPullRequests": 2, "subscribers": 130, "communityHealth": 100, @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 351, + "openIssues": 352, "openPullRequests": 6, "subscribers": 109, "communityHealth": 50, @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 896, - "forks": 279, + "stars": 895, + "forks": 278, "topics": [], - "updatedAt": "2026-07-20T13:29:52Z", + "updatedAt": "2026-07-20T18:42:13Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -216,7 +216,7 @@ "url": "https://github.com/rayasabari/joko-ui", "homepage": "https://jokoui.web.id", "language": "TypeScript", - "stars": 415, + "stars": 416, "forks": 27, "topics": [ "css", @@ -226,7 +226,7 @@ "ui-framework", "uikit" ], - "updatedAt": "2026-07-20T03:51:39Z", + "updatedAt": "2026-07-20T14:40:26Z", "pushedAt": "2026-06-06T06:51:25Z", "latestRelease": { "name": "v0.8.0", @@ -291,7 +291,7 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 309, + "stars": 310, "forks": 29, "topics": [ "ai-agents", @@ -313,7 +313,7 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-20T12:02:08Z", + "updatedAt": "2026-07-20T15:15:59Z", "pushedAt": "2026-07-20T13:01:34Z", "latestRelease": { "name": "v0.6.2", @@ -324,7 +324,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 13, + "openIssues": 14, "openPullRequests": 2, "subscribers": 4, "communityHealth": 71, @@ -341,7 +341,7 @@ "homepage": "https://www.erdbuilderpro.com", "language": "TypeScript", "stars": 169, - "forks": 32, + "forks": 31, "topics": [ "coding", "developer-tools", @@ -380,7 +380,7 @@ "homepage": "https://termul.dev", "language": "TypeScript", "stars": 164, - "forks": 34, + "forks": 33, "topics": [ "cross-platform", "desktop-app", @@ -408,7 +408,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-01-13T04:36:02Z", "openIssues": 39, - "openPullRequests": 13, + "openPullRequests": 11, "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" @@ -518,7 +518,7 @@ "homepage": "", "language": "TypeScript", "stars": 112, - "forks": 57, + "forks": 56, "topics": [], "updatedAt": "2026-07-20T04:58:20Z", "pushedAt": "2026-07-13T00:57:27Z", @@ -887,7 +887,7 @@ "homepage": "", "language": "Python", "stars": 47, - "forks": 8, + "forks": 6, "topics": [], "updatedAt": "2026-07-18T14:00:00Z", "pushedAt": "2026-06-20T14:24:38Z", @@ -1043,7 +1043,7 @@ "homepage": "", "language": "TypeScript", "stars": 41, - "forks": 7, + "forks": 6, "topics": [ "browser-shell", "control-plane", @@ -1152,7 +1152,7 @@ "homepage": "", "language": "C#", "stars": 34, - "forks": 14, + "forks": 13, "topics": [ "desktop-app", "printer", @@ -1379,6 +1379,43 @@ "communityHealth": 85, "readmeHtml": "

Mandum Rimba

\n

\n \"Mandum\n

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

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

Prefer to scan directly? QRIS & GoPay

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

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

\n

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

\n

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

\n
\n

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

\n
\n

What's on the map

\n

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

\n\n

Shareable cards (browser-only)

\n

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

\n

Data & sources

\n

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

\n\n

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

\n

How it's built

\n

A pnpm + Turborepo monorepo:

\n\n

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

\n

Local development

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

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

\n

Editorial principles (non-negotiable)

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

License & brand

\n

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

\n\n

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

\n" }, + { + "fullName": "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-20T17:18:00Z", + "pushedAt": "2026-07-10T12:37:02Z", + "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": "rahmanef63/open-silong", "name": "open-silong", @@ -1390,7 +1427,7 @@ "homepage": "https://silong-os.vercel.app/", "language": "TypeScript", "stars": 18, - "forks": 5, + "forks": 4, "topics": [ "block-editor", "convex", @@ -1420,43 +1457,6 @@ "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": 18, - "forks": 1, - "topics": [ - "arch-linux", - "dotfiles", - "hyprland", - "hyprland-config", - "linux", - "omarchy" - ], - "updatedAt": "2026-07-20T06:57:09Z", - "pushedAt": "2026-07-10T12:37:02Z", - "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", @@ -1697,7 +1697,7 @@ "homepage": "", "language": "JavaScript", "stars": 12, - "forks": 2, + "forks": 1, "topics": [ "ai-agent", "claude-code", From e568554e1a896fd9ed68c91b528026f1b8ab6394 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 03:46:46 +0000 Subject: [PATCH 2/4] Sync content data --- src/data/projects.json | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/data/projects.json b/src/data/projects.json index 65a7186..4e52e47 100644 --- a/src/data/projects.json +++ b/src/data/projects.json @@ -9,7 +9,7 @@ "url": "https://github.com/faisalman/ua-parser-js", "homepage": "https://uaparser.dev/", "language": "JavaScript", - "stars": 10168, + "stars": 10166, "forks": 1220, "topics": [ "analytics", @@ -21,7 +21,7 @@ "user-agent", "user-agent-parser" ], - "updatedAt": "2026-07-20T18:04:52Z", + "updatedAt": "2026-07-20T20:25:02Z", "pushedAt": "2026-07-20T18:03:11Z", "latestRelease": { "name": "v2.0.10", @@ -140,7 +140,7 @@ "archived": false, "licenseSpdx": "", "createdAt": "2016-05-21T10:55:38Z", - "openIssues": 352, + "openIssues": 351, "openPullRequests": 6, "subscribers": 109, "communityHealth": 50, @@ -156,10 +156,10 @@ "url": "https://github.com/jipraks/yt-short-clipper", "homepage": "", "language": "Python", - "stars": 895, - "forks": 278, + "stars": 897, + "forks": 279, "topics": [], - "updatedAt": "2026-07-20T18:42:13Z", + "updatedAt": "2026-07-21T01:48:51Z", "pushedAt": "2026-07-18T02:05:39Z", "latestRelease": { "name": "YT Short Clipper v2.0.5-beta", @@ -170,7 +170,7 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-01-15T09:55:34Z", - "openIssues": 4, + "openIssues": 5, "openPullRequests": 0, "subscribers": 15, "communityHealth": 57, @@ -291,7 +291,7 @@ "url": "https://github.com/fajarhide/omni", "homepage": "https://omni.weekndlabs.com", "language": "Rust", - "stars": 310, + "stars": 311, "forks": 29, "topics": [ "ai-agents", @@ -313,8 +313,8 @@ "token-reduction", "token-savings" ], - "updatedAt": "2026-07-20T15:15:59Z", - "pushedAt": "2026-07-20T13:01:34Z", + "updatedAt": "2026-07-21T03:08:12Z", + "pushedAt": "2026-07-21T03:08:08Z", "latestRelease": { "name": "v0.6.2", "tagName": "v0.6.2", @@ -324,8 +324,8 @@ "archived": false, "licenseSpdx": "MIT", "createdAt": "2026-03-15T03:38:04Z", - "openIssues": 14, - "openPullRequests": 2, + "openIssues": 10, + "openPullRequests": 0, "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" @@ -353,7 +353,7 @@ "tiptap-editor" ], "updatedAt": "2026-07-20T09:52:59Z", - "pushedAt": "2026-07-20T13:51:15Z", + "pushedAt": "2026-07-21T00:48:22Z", "latestRelease": { "name": "v3.1.3", "tagName": "v3.1.3", @@ -449,7 +449,7 @@ "homepage": "", "language": "Java", "stars": 132, - "forks": 98, + "forks": 97, "topics": [], "updatedAt": "2026-07-13T09:56:33Z", "pushedAt": "2026-07-01T22:57:27Z", @@ -474,7 +474,7 @@ "homepage": "https://codecora.dev", "language": "Rust", "stars": 121, - "forks": 14, + "forks": 15, "topics": [ "ai", "cli", @@ -490,19 +490,19 @@ "sqlite", "vector-database" ], - "updatedAt": "2026-07-20T09:55:38Z", - "pushedAt": "2026-07-20T01:24:13Z", + "updatedAt": "2026-07-21T03:10:39Z", + "pushedAt": "2026-07-21T03:17:27Z", "latestRelease": { - "name": "Release v0.8.0", - "tagName": "v0.8.0", - "url": "https://github.com/codecoradev/uteke/releases/tag/v0.8.0", - "publishedAt": "2026-07-17T14:43:32Z" + "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" }, "archived": false, "licenseSpdx": "Apache-2.0", "createdAt": "2026-05-29T00:27:31Z", "openIssues": 3, - "openPullRequests": 1, + "openPullRequests": 0, "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" @@ -631,7 +631,7 @@ "hacktoberfest2023" ], "updatedAt": "2026-07-13T09:56:46Z", - "pushedAt": "2026-07-10T03:05:57Z", + "pushedAt": "2026-07-20T20:43:27Z", "latestRelease": { "name": "v1.0.0", "tagName": "v1.0.0", @@ -642,7 +642,7 @@ "licenseSpdx": "MIT", "createdAt": "2023-09-05T12:35:21Z", "openIssues": 8, - "openPullRequests": 1, + "openPullRequests": 2, "subscribers": 1, "communityHealth": 57, "readmeHtml": "

๐Ÿ† IndoGitHubers

\n
\n www.indogithubers.com โ†—๏ธ\n

\n
\n \"E2E\n \"Playwright\n \"Website\n

\n\n\n\n\n\n\n\n\n\n\n\n
DesktopMobile
\"IndoGitHubers_latest\"\"IndoGitHubers_latest\"
\n

๐Ÿ“‹ Description

\n

IndoGitHubers is an application that displays the GitHub rank of users in Indonesia. It provides detailed information about each user, including their number of followers and contributions.\nThe IndoGitHubers app fetches data from the GitHub API and displays it in a user-friendly format. The app allows users to sort the list of users by different criteria and search for specific users.

\n

๐Ÿ’ก Features

\n\n

๐Ÿ–ผ๏ธ Showcases

\n

Check out the GitHub users who are standing out with the IndoGitHubers-badge on their public profiles:

\n\nClick to expand!\n

๐Ÿง‘โ€๐Ÿ’ป Running Locally

\n

Prerequisites

\n\n

Clone the repo

\n
git clone https://github.com/depapp/indogithubers.git\n
\n

Then navigate to the project directory

\n
cd indogithubers\n
\n

Install the dependencies

\n
npm run install\n
\n

Run the app

\n
npm run dev\n
\n

Run E2E Test

\n

We have several command to working with E2E:

\n\n

E2E for Visual Test

\n

When developing E2E test that is require visual test snapshot, we need to run in the exact same operating system with the CIs. Since our CI using Ubuntu, we need to run our E2E inside Docker to mimick the same system.

\n\n

Deploy

\n

\"Deploy

\n

Stats

\n

\"IndoGitHubers

\n

๐Ÿ‘ฅ Contributors

\n

If you'd like to contribute to the IndoGitHubers app, you can fork the repository, make your changes, and submit a pull request. Please make sure to follow the existing code style and add tests for any new functionality.

\n

\"All

\n

๐Ÿ’ช Support me

\n

\"Nih

\n

\n

\n
\n

ยฉ 2023-present

\n" @@ -718,7 +718,7 @@ "sveltekit" ], "updatedAt": "2026-07-20T01:33:20Z", - "pushedAt": "2026-06-23T03:45:48Z", + "pushedAt": "2026-07-20T23:57:22Z", "latestRelease": { "name": "svelte-audio-ui@1.0.1", "tagName": "v1.0.1", @@ -729,7 +729,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-03-17T12:55:21Z", "openIssues": 0, - "openPullRequests": 8, + "openPullRequests": 9, "subscribers": 3, "communityHealth": 100, "readmeHtml": "
\n \"Svelte\n
\n

A set of accessible, composable audio UI components for Svelte.
Built on top of shadcn-svelte. Copy, paste, and own.

\n Docs ยท\n Particles ยท\n Issues\n

\"License\"\n \"Stars\"\n \"Svelte\n \"SvelteKit\"\n \"TypeScript\"\n \"shadcn-svelte\"\n \"Copy\n \"AI\n

\n

What is this?

\n

Svelte Audio UI is a collection of audio-focused UI components that you install via the shadcn-svelte CLI. No npm package โ€” you own the code.

\n

Components include: AudioPlayer, AudioQueue, AudioTrack, AudioProvider, Knob, Fader, Slider, XYPad, SortableList, and more.

\n

Quick Start

\n

Make sure you have shadcn-svelte initialized, then:

\n
npx shadcn-svelte@latest add https://svelte-audio-ui.vercel.app/r/player.json\n
\n

Add AudioProvider to your root layout:

\n
<script lang=\"ts\">\n  import { AudioProvider } from \"$lib/components/ui/audio/provider/index.js\";\n  let { children } = $props();\n</script>\n\n<AudioProvider>{@render children()}</AudioProvider>\n
\n

Use a component:

\n
<script lang=\"ts\">\n  import * as AudioPlayer from \"$lib/components/ui/audio/player/index.js\";\n</script>\n\n<AudioPlayer.Root>\n  <AudioPlayer.ControlBar>\n    <AudioPlayer.Play />\n    <AudioPlayer.SeekBar />\n    <AudioPlayer.Volume />\n  </AudioPlayer.ControlBar>\n</AudioPlayer.Root>\n
\n

Tech Stack

\n\n

Contributing

\n

See CONTRIBUTING.md.

\n

Acknowledgements

\n

Inspired by audio-ui, a composable audio UI system for React.

\n

This project brings similar ideas into the Svelte ecosystem, adapting the original headless and provider-based architecture for Svelte.

\n

If you're working with React, check out the original project:\naudio-ui

\n

License

\n

MIT ยฉ ddtamn

\n" @@ -816,7 +816,7 @@ "homepage": "https://bansos.dev", "language": "Svelte", "stars": 49, - "forks": 6, + "forks": 7, "topics": [ "bansos", "cli", @@ -841,7 +841,7 @@ "licenseSpdx": "MIT", "createdAt": "2026-06-11T13:28:54Z", "openIssues": 3, - "openPullRequests": 2, + "openPullRequests": 3, "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" @@ -1399,8 +1399,8 @@ "linux", "omarchy" ], - "updatedAt": "2026-07-20T17:18:00Z", - "pushedAt": "2026-07-10T12:37:02Z", + "updatedAt": "2026-07-21T02:40:15Z", + "pushedAt": "2026-07-21T02:40:10Z", "latestRelease": { "name": "v0.2.2", "tagName": "v0.2.2", From 0b1ba0a9d882d15d7d3013047421cfad28a4253a Mon Sep 17 00:00:00 2001 From: Wauputra <103489788+wauputr4@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:50:28 +0700 Subject: [PATCH 3/4] Publish IT Camp article and add custom 404 (#45) * Sync blog content hourly * Publish IT Camp article and add custom 404 * Unify blog article cards * Sync corrected blog copy --- .github/workflows/sync-content.yml | 2 +- README.md | 2 +- src/components/PageHeader.astro | 9 +-- src/data/blog-posts.json | 46 ++++++++++-- src/pages/404.astro | 19 +++++ src/pages/blog.astro | 110 ++++++++++++----------------- src/pages/blog/[...slug].astro | 6 +- wrangler.jsonc | 3 +- 8 files changed, 119 insertions(+), 78 deletions(-) create mode 100644 src/pages/404.astro diff --git a/.github/workflows/sync-content.yml b/.github/workflows/sync-content.yml index 9183bb3..d1b9598 100644 --- a/.github/workflows/sync-content.yml +++ b/.github/workflows/sync-content.yml @@ -14,7 +14,7 @@ on: - blog - legacy-revival schedule: - - cron: "17 */6 * * *" + - cron: "17 * * * *" repository_dispatch: types: - sync-projects diff --git a/README.md b/README.md index 07453ef..0caef45 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ tetapi tidak ditampilkan di indeks blog, tidak masuk sitemap, dan memakai Workflow `.github/workflows/sync-content.yml` memperbarui data secara otomatis. - Manual: jalankan workflow `Sync content data`. -- Schedule: berjalan setiap 6 jam. +- Schedule: berjalan setiap jam pada menit ke-17. - Dispatch dari repo lain: - `sync-projects` - `sync-blog` diff --git a/src/components/PageHeader.astro b/src/components/PageHeader.astro index 9b2a3dd..b7a34be 100644 --- a/src/components/PageHeader.astro +++ b/src/components/PageHeader.astro @@ -2,18 +2,19 @@ interface Props { eyebrow: string; title: string; + centered?: boolean; } -const { eyebrow, title } = Astro.props; +const { eyebrow, title, centered = false } = Astro.props; ---
-
+
{eyebrow}
-

{title}

-
+

{title}

+
diff --git a/src/data/blog-posts.json b/src/data/blog-posts.json index 82752bc..49c9ae0 100644 --- a/src/data/blog-posts.json +++ b/src/data/blog-posts.json @@ -1,4 +1,42 @@ [ + { + "slug": "it-camp-2026-open-source-ai-lokal", + "path": "content/2026/07/it-camp-2026-open-source-ai-lokal.md", + "year": "2026", + "month": "07", + "title": "IT Camp 2026: Open Source dan AI Lokal Dipelajari lewat Praktik Langsung", + "description": "Catatan dari IT Camp 2026 tentang AI lokal, SymbiotOS, keamanan siber, dan pentingnya belajar teknologi secara mandiri.", + "date": "2026-07-21", + "tags": [ + "event", + "open-source", + "artificial-intelligence", + "teknologi-lokal" + ], + "status": "published", + "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/it-camp-2026.jpg", + "content": "Sebanyak 122 peserta mengikuti IT Camp 2026 pada 18โ€“19 Juli 2026 di Villa\nZanara, Bogor. Peserta termudanya berusia 15 tahun. Penyelenggaraan tahun ini\nsekaligus menandai 17 tahun IT Camp digelar setiap tahun.\n\nAcara diselenggarakan oleh [Yayasan Onno Center\nInternational](https://onnocenter.or.id/) bersama Pusat Siber TNI Angkatan\nDarat (Pussiberad). Sebagai peserta, saya melihat satu pola yang terasa kuat\nsepanjang acara: teknologi tidak berhenti sebagai bahan presentasi. Para\npemateri memperlihatkan hasil kerja mereka dan mempraktikkannya di hadapan\npeserta.\n\n> โ€œKalau kalian sadar, pemateri-pemateri ini tidak hanya berteori. Mereka semua\n> langsung demo dan praktik, sesuatu yang jarang sekali kalian temukan di\n> tempat lain.โ€ โ€” Prof. Onno W. Purbo, pendiri Onno Center\n\nPendekatan tersebut membuat peserta tidak hanya mengenal istilah baru, tetapi\njuga melihat bahwa teknologi dapat dipelajari, dibongkar, dan dikembangkan\nsecara mandiri.\n\n## AI lokal sebagai jalan untuk belajar mandiri\n\nSalah satu pokok pembahasan IT Camp 2026 adalah membangun AI yang dapat\ndijalankan pada perangkat dan infrastruktur sendiri. Dzaq R. Purbo\nmempraktikkan penggunaan Ollama, Open WebUI, dan *Retrieval-Augmented\nGeneration* (RAG) untuk mengolah pengetahuan dari dokumen lokal.\n\nAI lokal memberi ruang belajar yang berbeda dari layanan siap pakai. Peserta\ndapat memahami bagaimana model dijalankan, bagaimana data diberikan, serta\nbagaimana sebuah jawaban dihasilkan. Data juga tidak harus dikirim ke layanan\neksternal, sehingga pengguna memiliki kontrol lebih besar atas prosesnya.\n\nSemangat ini dekat dengan open source, di mana alat dapat dipelajari dari dalam,\ndisesuaikan dengan kebutuhan, dan dikembangkan bersama. Kemandirian bukan\nberarti mengerjakan semuanya sendirian, melainkan memiliki kemampuan untuk\nmemahami dan menentukan teknologi yang digunakan.\n\n## SymbiotOS dan sistem operasi yang dekat dengan pengguna\n\nPada 19 Juli, Ahmad Haris memperkenalkan SymbiotOS, sistem operasi *mobile*\nberbasis open source yang dirancang tanpa aplikasi bawaan berlebihan dan\nmemberi perhatian pada privasi pengguna.\n\nBagian yang paling menarik adalah dukungan bahasa dan aksara Jawa. Contoh ini\nmenunjukkan bahwa sistem operasi lokal bukan hanya mengganti nama atau\ntampilan. Teknologi dapat disesuaikan dengan bahasa, kebiasaan, dan kebutuhan\nmasyarakat yang sering tidak menjadi prioritas produk global.\n\nKarena kode dan perkakasnya dapat dipelajari, pengembangan sistem seperti\nSymbiotOS juga membuka peluang bagi pelajar dan pengembang Indonesia untuk\nmemahami sistem operasi melalui praktik nyata.\n\n## AI untuk Infrastruktur dan keamanan siber\n\nDimaz Arno, yang juga tampil pada 19 Juli, mendemonstrasikan bagaimana *AI\nagent* dapat membantu proses *penetration testing*. Dalam salah satu\ndemonstrasi, AI digunakan untuk menguji keamanan sebuah aplikasi permainan\nAndroid.\n\nDemo tersebut memperlihatkan bahwa AI dapat menjalankan tahapan teknis dengan\ncepat. Namun, kemudahan itu juga menegaskan pentingnya etika, izin, dan\npemahaman keamanan. Perkakas keamanan seharusnya dipakai pada sistem yang\nmemang memberi izin untuk diuji.\n\nProf. Onno W. Purbo turut membahas penggunaan AI untuk *Security Operation\nCenter* dan *Open Source Intelligence*. Wilson Lisan CEO Efison juga menjelaskan kebutuhan\ninfrastruktur *high-performance computing* dan menjelaskan bagaimana pengalamannya\nmembangun oprek hardware sampai membangun HPC di Indonesia, sementara sesi-sesi lain\nmemperlihatkan penerapan AI pada pengolahan informasi dan pekerjaan teknis.\n\n## Lebih penting dari mengikuti tren\n\nIT Camp 2026 menunjukkan bahwa pembicaraan mengenai AI di Indonesia tidak\nharus berhenti pada pemakaian produk dari luar. Model AI dapat dijalankan\nsecara lokal, sistem operasi dapat disesuaikan dengan bahasa daerah, dan\nsoftware open source dapat menjadi tempat belajar yang bermanfaat.\n\nBagi saya, kekuatan acara ini bukan hanya banyaknya teknologi yang\ndiperlihatkan. Hal yang lebih penting adalah keberanian para pemateri untuk\nmembuka proses kerja mereka. Peserta dapat melihat kegagalan, penyesuaian, dan\ncara sebuah sistem dibangun dengan pengalaman yang sulit diperoleh bila teknologi\nhanya diperkenalkan melalui teori.\n\nOpen source menyediakan jalur untuk melanjutkan pembelajaran tersebut setelah\nacara selesai. Peserta dapat mencoba alat-alat yang sama, membaca dokumentasi,\nmempelajari kode, lalu membagikan kembali temuannya kepada orang lain.", + "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/it-camp-2026-open-source-ai-lokal.md", + "releasedAt": "2026-07-21", + "lastModifiedAt": "2026-07-21T07:39:04Z", + "latestCommitSha": "74105f370296b39ff8423c0fc93ed4bd71cabef0", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/74105f370296b39ff8423c0fc93ed4bd71cabef0", + "author": { + "name": "wauputr4", + "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", + "url": "https://github.com/wauputr4", + "committedAt": "2026-07-21T06:39:04Z" + }, + "authors": [ + { + "name": "wauputr4", + "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", + "url": "https://github.com/wauputr4", + "committedAt": "2026-07-21T06:39:04Z" + } + ], + "authorFromFrontmatter": false + }, { "slug": "bagaimana-open-source-mampu-bertahan", "path": "content/2026/07/bagaimana-open-source-mampu-bertahan.md", @@ -15,12 +53,12 @@ ], "status": "published", "thumbnail": "https://raw.githubusercontent.com/IndopenSource/Blog-IndopenSource/main/content/2026/07/assets/model-ekonomi-pusat-yayasan-it.jpg", - "content": "Open source bukan sekadar kode yang dapat di-*clone*. Ia adalah infrastruktur\ndigital yang dipakai bersama, lalu dirawat oleh organisasi, perusahaan, dan\nkomunitas. Linux, misalnya, menjalankan seluruh sistem dalam daftar TOP500\nsuperkomputer pada November 2025.\n\nLantas, bila kode dapat disalin dan digunakan bebas, mengapa ekosistem ini\nmampu bertahan puluhan tahun?\n\n## Arsitektur finansial: membiayai operasi bersama\n\nYayasan seperti Linux Foundation, Apache, dan Eclipse tidak menjual akses ke\n*source code*. Mereka membantu menata pekerjaan yang membuat proyek dapat\ndipakai jangka panjang: tata kelola, infrastruktur *CI/CD*, audit keamanan,\nperlindungan hukum, dokumentasi, serta koordinasi komunitas.\n\nPendanaan datang dari beragam sumber, antara lain keanggotaan perusahaan,\npelatihan dan sertifikasi, acara, hibah, donasi, serta dukungan *in-kind*\nseperti komputasi dan *bandwidth*. Model ini membuat biaya pemeliharaan\ninfrastruktur inti menjadi tanggung jawab bersama, bukan beban satu vendor.\n\n## Menghindari private fork yang mahal\n\nBagi organisasi, memakai open source juga merupakan strategi mitigasi risiko.\nKode yang terbuka mengurangi ketergantungan pada roadmap dan harga dari satu\nvendor. Namun kebebasan itu tidak berarti setiap organisasi sebaiknya membuat\nsalinan sendiri lalu berjalan terpisah.\n\n*Private fork* dapat menjadi utang teknis: setiap rilis upstream memunculkan\npatch, konflik, dan pekerjaan keamanan yang harus dipelihara sendiri. Riset\nLinux Foundation 2026 mencatat rata-rata biaya pemeliharaan private fork\nmencapai 5.160 jam kerja atau sekitar US$258.000 per siklus rilis.\n\nKarena itu, kontribusi ke *upstream* sering menjadi keputusan bisnis yang lebih\nbaik daripada memelihara perubahan secara tertutup. Perbaikan keamanan dan\nfitur yang diterima proyek utama dapat dipakai kembali oleh semua pengguna,\ntermasuk organisasi yang menyumbangkannya.\n\n## Mesin ekonomi di sekitar kode\n\nEkosistem open source memonetisasi layanan dan koordinasi di sekeliling kode,\nbukan membatasi salinan kodenya. Perusahaan membayar keanggotaan untuk ikut\nmenentukan arah proyek dan bekerja dalam kelompok standar. Banyak yayasan juga\nmenjalankan sertifikasi, pelatihan, serta konferensi.\n\nDi sisi lain, proyek *community-first* dapat memakai *fiscal host* untuk\nmenerima donasi dan hibah. Bentuknya berbeda-beda, tetapi prinsipnya sama:\norang yang mendapat nilai dari proyek ikut menanggung pemeliharaan proyek.\n\n## Kontribusi sebagai investasi\n\nKontribusi tidak harus berupa kode. Ia dapat berupa pelaporan bug, pengujian,\ndokumentasi, dukungan komunitas, pendanaan, atau keanggotaan yayasan. Dalam\nsurvei Linux Foundation terhadap lebih dari 500 pemimpin TI, kontribusi kode\nmemiliki rasio manfaat-biaya 3,6x, sementara keanggotaan yayasan mencapai 4,8x.\n\nAngka tersebut bukan janji bagi setiap organisasi, tetapi menguatkan satu\npelajaran: kontribusi aktif dapat mengurangi biaya pemeliharaan sekaligus\nmempercepat respons keamanan dan pengembangan produk.\n\n## Tantangan: keamanan dan regulasi\n\nOpen source tetap membutuhkan pemeliharaan yang disiplin. Ketergantungan harus\ndipantau, kerentanan perlu ditangani, dan pengguna perlu mengetahui siapa yang\nbertanggung jawab atas sebuah komponen.\n\nCyber Resilience Act Uni Eropa menunjukkan arah tuntutan ini. Mulai 11\nSeptember 2026, produsen harus memberi peringatan awal atas kerentanan yang\ndieksploitasi aktif atau insiden berat dalam 24 jam setelah mengetahuinya.\nKewajiban ini bukan alasan untuk menjauhi open source; justru ini alasan untuk\nmembangun proses pemeliharaan, koordinasi disclosure, dan kontribusi upstream\nyang sehat.\n\nPada akhirnya, daya tahan open source datang dari gotong royong R&D. Kode yang\nterbuka memperbolehkan banyak pihak berbagi biaya, memperbaiki masalah yang\nsama, dan membangun layanan bernilai di atas fondasi bersama. Kolaborasi itu\nyang membuatnya lebih adaptif daripada model perangkat lunak tertutup semata.\n\n## Referensi\n\n- [TOP500: Linux operating system family](https://www.top500.org/statistics/details/osfam/1/)\n- [Linux Foundation: ROI for Open Source Software Contribution](https://www.linuxfoundation.org/research/contribution-roi)\n- [Linux Foundation: laporan tentang biaya private fork dan ROI kontribusi](https://www.linuxfoundation.org/press/new-linux-foundation-report-shows-active-open-source-contribution-delivers-2-5x-roi-while-passive-consumption-increases-costly-technical-debt)\n- [Komisi Eropa: kewajiban pelaporan Cyber Resilience Act](https://digital-strategy.ec.europa.eu/en/policies/cra-reporting)", + "content": "Open source bukan cuma kumpulan kode yang bisa di-*clone*. Melainkan infrastruktur\ndigital yang dipakai bersama, lalu dirawat oleh organisasi, perusahaan, dan\nkomunitas. Contoh paling populer adalah Linux, yang menjalankan seluruh sistem dalam daftar TOP500\nsuperkomputer pada November 2025.\n\nLantas, bila kode dapat disalin dan digunakan bebas, mengapa ekosistem ini\nmampu bertahan puluhan tahun?\n\n## Arsitektur finansial: membiayai operasi bersama\n\nYayasan seperti Linux Foundation, Apache, dan Eclipse tidak menjual akses ke\n*source code*. Mereka membantu menata pekerjaan yang membuat proyek dapat\ndipakai jangka panjang: tata kelola, infrastruktur *CI/CD*, audit keamanan,\nperlindungan hukum, dokumentasi, serta koordinasi komunitas.\n\nPendanaan datang dari beragam sumber, antara lain keanggotaan perusahaan,\npelatihan dan sertifikasi, acara, hibah, donasi, serta dukungan *in-kind*\nseperti komputasi dan *bandwidth*. Model ini membuat biaya pemeliharaan\ninfrastruktur inti menjadi tanggung jawab bersama, bukan beban satu vendor.\n\n## Menghindari private fork yang mahal\n\nBagi organisasi, memakai open source juga merupakan strategi mitigasi risiko.\nKode yang terbuka mengurangi ketergantungan pada roadmap dan harga dari satu\nvendor. Namun kebebasan itu tidak berarti setiap organisasi sebaiknya membuat\nsalinan sendiri lalu berjalan terpisah.\n\n*Private fork* dapat menjadi utang teknis: setiap rilis upstream memunculkan\npatch, konflik, dan pekerjaan keamanan yang harus dipelihara sendiri. Riset\nLinux Foundation 2026 mencatat rata-rata biaya pemeliharaan private fork\nmencapai 5.160 jam kerja atau sekitar US$258.000 per siklus rilis.\n\nKarena itu, kontribusi ke *upstream* sering menjadi keputusan bisnis yang lebih\nbaik daripada memelihara perubahan secara tertutup. Perbaikan keamanan dan\nfitur yang diterima proyek utama dapat dipakai kembali oleh semua pengguna,\ntermasuk organisasi yang menyumbangkannya.\n\n## Mesin ekonomi di sekitar kode\n\nEkosistem open source memonetisasi layanan dan koordinasi di sekeliling kode,\nbukan membatasi salinan kodenya. Perusahaan membayar keanggotaan untuk ikut\nmenentukan arah proyek dan bekerja dalam kelompok standar. Banyak yayasan juga\nmenjalankan sertifikasi, pelatihan, serta konferensi.\n\nDi sisi lain, proyek *community-first* dapat memakai *fiscal host* untuk\nmenerima donasi dan hibah. Bentuknya berbeda-beda, tetapi prinsipnya sama:\norang yang mendapat nilai dari proyek ikut menanggung pemeliharaan proyek.\n\n## Kontribusi sebagai investasi\n\nKontribusi tidak harus berupa kode. Bisa juga berupa pelaporan bug, pengujian,\ndokumentasi, dukungan komunitas, pendanaan, atau keanggotaan yayasan. Dalam\nsurvei Linux Foundation terhadap lebih dari 500 pemimpin TI, kontribusi kode\nmemiliki rasio manfaat-biaya 3,6x, sementara keanggotaan yayasan mencapai 4,8x.\n\nAngka tersebut bukan janji bagi setiap organisasi, tetapi memberikan satu\npelajaran: kontribusi aktif dapat mengurangi biaya pemeliharaan sekaligus\nmempercepat respons keamanan dan pengembangan produk.\n\n## Tantangan: keamanan dan regulasi\n\nOpen source tetap membutuhkan pemeliharaan yang disiplin. Ketergantungan harus\ndipantau, kerentanan perlu ditangani, dan pengguna perlu mengetahui siapa yang\nbertanggung jawab atas sebuah komponen.\n\nCyber Resilience Act Uni Eropa menunjukkan arah tuntutan ini. Mulai 11\nSeptember 2026, produsen harus memberi peringatan awal atas kerentanan yang\ndieksploitasi aktif atau insiden berat dalam 24 jam setelah mengetahuinya.\nKewajiban ini bukan alasan untuk menjauhi open source, justru ini alasan untuk\nmembangun proses pemeliharaan, koordinasi disclosure, dan kontribusi\nyang sehat.\n\nPada akhirnya, daya tahan open source datang dari gotong royong R&D. Kode yang\nterbuka memperbolehkan banyak pihak berbagi biaya, memperbaiki masalah yang\nsama, dan membangun layanan bernilai di atas fondasi bersama. Kolaborasi itu\nyang membuatnya lebih adaptif daripada model perangkat lunak tertutup semata.\n\n## Referensi\n\n- [TOP500: Linux operating system family](https://www.top500.org/statistics/details/osfam/1/)\n- [Linux Foundation: ROI for Open Source Software Contribution](https://www.linuxfoundation.org/research/contribution-roi)\n- [Linux Foundation: laporan tentang biaya private fork dan ROI kontribusi](https://www.linuxfoundation.org/press/new-linux-foundation-report-shows-active-open-source-contribution-delivers-2-5x-roi-while-passive-consumption-increases-costly-technical-debt)\n- [Komisi Eropa: kewajiban pelaporan Cyber Resilience Act](https://digital-strategy.ec.europa.eu/en/policies/cra-reporting)", "sourceUrl": "https://github.com/IndopenSource/Blog-IndopenSource/blob/main/content/2026/07/bagaimana-open-source-mampu-bertahan.md", "releasedAt": "2026-07-16", - "lastModifiedAt": "2026-07-16T11:08:44Z", - "latestCommitSha": "95d3147d541c05b1ab6f683ccddd6b84d816aabd", - "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/95d3147d541c05b1ab6f683ccddd6b84d816aabd", + "lastModifiedAt": "2026-07-21T07:39:04Z", + "latestCommitSha": "74105f370296b39ff8423c0fc93ed4bd71cabef0", + "latestCommitUrl": "https://github.com/IndopenSource/Blog-IndopenSource/commit/74105f370296b39ff8423c0fc93ed4bd71cabef0", "author": { "name": "wauputr4", "avatarUrl": "https://avatars.githubusercontent.com/u/103489788?v=4", diff --git a/src/pages/404.astro b/src/pages/404.astro new file mode 100644 index 0000000..9ece4b4 --- /dev/null +++ b/src/pages/404.astro @@ -0,0 +1,19 @@ +--- +import BaseButton from '../components/BaseButton.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import PageHeader from '../components/PageHeader.astro'; +--- + + + +

Alamatnya mungkin berubah, salah ketik, atau halaman tersebut sudah tidak tersedia.

+
+ Kembali ke beranda + Lihat proyek +
+
+
diff --git a/src/pages/blog.astro b/src/pages/blog.astro index a0087f7..c7fe2ca 100644 --- a/src/pages/blog.astro +++ b/src/pages/blog.astro @@ -6,18 +6,7 @@ import blogPosts from '../data/blog-posts.json'; import { withBase } from '../lib/urls'; import { isPublished, type BlogPost } from '../lib/content'; -// Feature the first *published* post, never a draft (index 0 may be a draft). const publishedPosts = (blogPosts as BlogPost[]).filter(isPublished); -const featuredPost = publishedPosts[0]; -const otherPosts = publishedPosts.slice(1); -const featuredThumbnail = featuredPost?.thumbnail || '/brand/indopensource-hero.jpg'; -const featuredThumbnailUrl = /^https?:\/\//.test(featuredThumbnail) ? featuredThumbnail : withBase(featuredThumbnail); -const featuredAlt = featuredPost - ? `Thumbnail artikel: ${featuredPost.title}` - : 'Ilustrasi sampul Blog IndopenSource'; -const featuredDate = featuredPost?.releasedAt - ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long' }).format(new Date(featuredPost.releasedAt)) - : ''; const contributionSteps = [ { @@ -68,69 +57,62 @@ const statusLegend = [
- {featuredPost && ( + {publishedPosts.length > 0 && (
- Artikel utama -

Artikel terbaru

+ Artikel +

Terbaru lebih dulu

-
-
-
- /blog/{featuredPost.slug} - {featuredDate && <>{featuredDate}} - {featuredPost.author?.name && <>oleh {featuredPost.author.name}} -
-

{featuredPost.title}

-

{featuredPost.description}

- {featuredPost.tags?.length > 0 && ( -
- {featuredPost.tags.map((tag) => {tag})} -
- )} -
- - Baca artikel - -
-
-
- {featuredAlt} -
-
-
-
- )} +
+ {publishedPosts.map((post) => { + const articleUrl = `/blog/${post.slug}/`; + const thumbnail = post.thumbnail || '/brand/indopensource-hero.jpg'; + const thumbnailUrl = /^https?:\/\//.test(thumbnail) ? thumbnail : withBase(thumbnail); + const publishedDate = post.releasedAt + ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long' }).format(new Date(post.releasedAt)) + : ''; - {otherPosts.length > 0 && ( -
-
-
Artikel lainnya
-
- {otherPosts.map((post) => ( - - /blog/{post.slug} -

{post.title}

-

{post.description}

- {post.author?.name && ( -

oleh {post.author.name}

- )} -
- ))} + return ( +
+
+
+ /blog/{post.slug} + {publishedDate && <>{publishedDate}} + {post.author?.name && <>oleh {post.author.name}} +
+

+ {post.title} +

+

{post.description}

+ {post.tags?.length > 0 && ( +
+ {post.tags.map((tag) => {tag})} +
+ )} +
+ Baca artikel +
+
+ + {`Thumbnail + +
+ ); + })}
diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index 8717ff2..8cb9803 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -58,19 +58,19 @@ const jsonLd = { --- - + {!published && (
Preview draf. Artikel ini masih ditinjau, belum diterbitkan, dan tidak diindeks mesin pencari.
)}

{post.description}

-
+
{articlePath} {releaseDate && <>{published ? 'Rilis' : 'Tanggal draf'} {releaseDate}} {authors.length > 0 && <>oleh {authors.map((author) => author.name).join(' & ')}}
-
+
{post.status} {post.tags.map((tag) => {tag})}
diff --git a/wrangler.jsonc b/wrangler.jsonc index 31cc569..e9ff868 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -2,6 +2,7 @@ "name": "indopensource-org", "compatibility_date": "2026-07-20", "assets": { - "directory": "./dist" + "directory": "./dist", + "not_found_handling": "404-page" } } From 36a22adfed79f915f6abedd7f3caab9780535262 Mon Sep 17 00:00:00 2001 From: wauputr4 <103489788+wauputr4@users.noreply.github.com> Date: Tue, 21 Jul 2026 15:04:59 +0700 Subject: [PATCH 4/4] Keep blog dates timezone-stable --- src/pages/blog.astro | 2 +- src/pages/blog/[...slug].astro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/blog.astro b/src/pages/blog.astro index c7fe2ca..be33da9 100644 --- a/src/pages/blog.astro +++ b/src/pages/blog.astro @@ -75,7 +75,7 @@ const statusLegend = [ const thumbnail = post.thumbnail || '/brand/indopensource-hero.jpg'; const thumbnailUrl = /^https?:\/\//.test(thumbnail) ? thumbnail : withBase(thumbnail); const publishedDate = post.releasedAt - ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long' }).format(new Date(post.releasedAt)) + ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long', timeZone: 'UTC' }).format(new Date(post.releasedAt)) : ''; return ( diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index 8cb9803..d0d6895 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -30,7 +30,7 @@ const seoTitle = post.slug === 'bagaimana-open-source-mampu-bertahan' ? 'Mengapa Open Source Bertahan Puluhan Tahun - IndopenSource' : `${post.title} - IndopenSource`; const releaseDate = post.releasedAt - ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long' }).format(new Date(post.releasedAt)) + ? new Intl.DateTimeFormat('id-ID', { dateStyle: 'long', timeZone: 'UTC' }).format(new Date(post.releasedAt)) : ''; const thumbnail = post.thumbnail || '/brand/indopensource-hero.jpg'; const thumbnailUrl = /^https?:\/\//.test(thumbnail) ? thumbnail : withBase(thumbnail);