RSS Reader using AT Protocol rssbase.io
feed atom rss reader atproto social
2

Configure Feed

Select the types of activity you want to include in your feed.

add rtk + move nix build in nix-xxx folders + improve readme

Romain Gautier (Jul 5, 2026, 12:56 AM +0200) f2066670 5fa7ff7e

+136 -13
+80
.pi/extensions/rtk.ts
··· 1 + // RTK Pi extension — rewrites bash commands to use rtk for token savings. 2 + // Requires: rtk >= 0.23.0 in PATH. 3 + // 4 + // This is a thin delegating extension: all rewrite logic lives in `rtk rewrite`, 5 + // which is the single source of truth (src/discover/registry.rs). 6 + // To add or change rewrite rules, edit the Rust registry — not this file. 7 + // 8 + // Exit code contract for `rtk rewrite`: 9 + // 0 + stdout Rewrite found → mutate command 10 + // 1 No RTK equivalent → pass through unchanged 11 + // 3 + stdout Rewrite (advisory) → mutate command 12 + 13 + import type { ExtensionAPI } from "@earendil-works/pi-coding-agent" 14 + import { isToolCallEventType } from "@earendil-works/pi-coding-agent" 15 + 16 + const REWRITE_TIMEOUT_MS = 2_000 17 + const MIN_SUPPORTED_RTK_MINOR = 23 18 + 19 + // Parse "X.Y.Z" semver, return [major, minor, patch] or null. 20 + function parseSemver(raw: string): [number, number, number] | null { 21 + const m = raw.trim().match(/(\d+)\.(\d+)\.(\d+)/) 22 + if (!m) return null 23 + return [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)] 24 + } 25 + 26 + // Calls `rtk rewrite`; returns the rewritten command or null (pass through). 27 + async function rewriteCommand( 28 + pi: ExtensionAPI, 29 + cmd: string, 30 + signal?: AbortSignal 31 + ): Promise<string | null> { 32 + const result = await pi.exec("rtk", ["rewrite", cmd], { 33 + timeout: REWRITE_TIMEOUT_MS, 34 + signal, 35 + }) 36 + if (result.killed) return null 37 + if (result.code !== 0 && result.code !== 3) return null 38 + return result.stdout.trim() || null 39 + } 40 + 41 + export default async function (pi: ExtensionAPI) { 42 + // Probe rtk version at load time; disables extension if missing or too old. 43 + const ver = await pi.exec("rtk", ["--version"], { timeout: REWRITE_TIMEOUT_MS }) 44 + if (ver.code !== 0) { 45 + console.warn("[rtk] rtk binary not found in PATH — extension disabled") 46 + return 47 + } 48 + 49 + // Warn and bail if rtk predates 0.23.0 (when `rtk rewrite` was introduced). 50 + const parsed = parseSemver(ver.stdout.replace(/^rtk\s+/, "")) 51 + if (parsed) { 52 + const [major, minor] = parsed 53 + if (major === 0 && minor < MIN_SUPPORTED_RTK_MINOR) { 54 + console.warn(`[rtk] rtk ${ver.stdout.trim()} is too old (need >= 0.23.0) — extension disabled`) 55 + return 56 + } 57 + } 58 + 59 + pi.on("tool_call", async (event, ctx) => { 60 + try { 61 + if (!isToolCallEventType("bash", event)) return 62 + 63 + const cmd = event.input.command 64 + if (typeof cmd !== "string" || cmd.trim() === "") return 65 + 66 + if (cmd.startsWith("rtk ")) return 67 + if (process.env.RTK_DISABLED === "1") return 68 + 69 + // Delegate to RTK. 70 + const rewritten = await rewriteCommand(pi, cmd, ctx.signal) 71 + if (rewritten && rewritten !== cmd) { 72 + event.input.command = rewritten 73 + } 74 + } catch (err) { 75 + // Fail open: never block execution on an unexpected error. 76 + console.warn("[rtk] unexpected error in tool_call handler; passing through command", err) 77 + return 78 + } 79 + }) 80 + }
+2
AGENTS.md
··· 1 1 # Monorepo of rssbase.io 2 2 > RSSBase is a RSS feed reader, using [atproto](https://atproto.com/) to store user data. 3 3 4 + @RTK.md 5 + 4 6 ## Convention 5 7 - name: RSSBase 6 8 - url: rssbase.io
+7 -2
README.md
··· 36 36 fi 37 37 38 38 # Get the codebase 39 - git clone git@tangled.org:mykiwi.dev/rssbase && cd rssbase 39 + git clone git@tangled.org:mykiwi.dev/rssbase.io && cd rssbase.io 40 40 devenv allow 41 41 42 42 # Your developer environment is ready 👨‍🚀🚀 ··· 50 50 ```bash 51 51 CACHIX_AUTH_TOKEN=... devenv shell cachix-push 52 52 ``` 53 - <details> 53 + </details> 54 + 55 + ## Roadmap (project in very early stages) 56 + - [ ] deployed 57 + - [ ] add feeds 58 + - [ ] list feeds 54 59 55 60 [devenv]: https://devenv.sh 56 61 [nix]: https://search.nixos.org/packages
+32
RTK.md
··· 1 + # RTK - Rust Token Killer (Codex CLI) 2 + 3 + **Usage**: Token-optimized CLI proxy for shell commands. 4 + 5 + ## Rule 6 + 7 + Always prefix shell commands with `rtk`. 8 + 9 + Examples: 10 + 11 + ```bash 12 + rtk git status 13 + rtk cargo test 14 + rtk npm run build 15 + rtk pytest -q 16 + ``` 17 + 18 + ## Meta Commands 19 + 20 + ```bash 21 + rtk gain # Token savings analytics 22 + rtk gain --history # Recent command savings history 23 + rtk proxy <cmd> # Run raw command without filtering 24 + ``` 25 + 26 + ## Verification 27 + 28 + ```bash 29 + rtk --version 30 + rtk gain 31 + which rtk 32 + ```
dagger/README.md nix-dagger/README.md
dagger/default.nix nix-dagger/default.nix
+9 -9
devenv.lock
··· 3 3 "devenv": { 4 4 "locked": { 5 5 "dir": "src/modules", 6 - "lastModified": 1782492839, 7 - "narHash": "sha256-j9wrcB4al5QhMelEghJ0Qs+RQPT+wyCcI4070NEgPLQ=", 6 + "lastModified": 1783109842, 7 + "narHash": "sha256-Fi7lW+sg1ChduOOQRBCK5JeA1cw4x5wSjIJcppRGGqQ=", 8 8 "owner": "cachix", 9 9 "repo": "devenv", 10 - "rev": "3d39d0817d62069f7b18821c34a617b5141cb278", 10 + "rev": "e30eb49258bee68353bd9c619823f635f4afa86c", 11 11 "type": "github" 12 12 }, 13 13 "original": { ··· 22 22 "nixpkgs-src": "nixpkgs-src" 23 23 }, 24 24 "locked": { 25 - "lastModified": 1782132010, 26 - "narHash": "sha256-ZnAVHdVrotp80iIMm5CSR1fdxPlw7Uwmwxb+O/wsgZ8=", 25 + "lastModified": 1782924808, 26 + "narHash": "sha256-tn2ahNv3ZNXyVHdPx/uw+N0xa7YSMtXUr6OEvu+s8ng=", 27 27 "owner": "cachix", 28 28 "repo": "devenv-nixpkgs", 29 - "rev": "12866ae2dddbc0ab8b329915f8072bb9c75bde89", 29 + "rev": "e2c881cb8d5f1cac6cef9d71f0d450a55691b999", 30 30 "type": "github" 31 31 }, 32 32 "original": { ··· 39 39 "nixpkgs-src": { 40 40 "flake": false, 41 41 "locked": { 42 - "lastModified": 1781607440, 43 - "narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=", 42 + "lastModified": 1782636521, 43 + "narHash": "sha256-OG8laCOGtkxlB1JH3XqOnXxnkGJme4mQdXo5hkhCQIY=", 44 44 "owner": "NixOS", 45 45 "repo": "nixpkgs", 46 - "rev": "3e41b24abd260e8f71dbe2f5737d24122f972158", 46 + "rev": "e1c1b84752fb0897897380a3cae9dc7fcab91ca3", 47 47 "type": "github" 48 48 }, 49 49 "original": {
+6 -2
devenv.nix
··· 4 4 }: 5 5 6 6 let 7 - dagger = pkgs.callPackage ./dagger { }; 8 - tang = pkgs.callPackage ./tangled-cli { }; 7 + dagger = pkgs.callPackage ./nix-dagger { }; 8 + tang = pkgs.callPackage ./nix-tangled-cli { }; 9 9 devenvSummary = pkgs.callPackage ./devenv.custom-code.nix { }; 10 10 in 11 11 { ··· 16 16 pkgs.docker-buildx # BuildKit builder for CI image builds 17 17 pkgs.docker-compose # used by application 18 18 dagger # dagger CLI dev build (until 1.0) 19 + pkgs.rtk # used by coding agent 19 20 pkgs.skills # used to manage .agents/skills 20 21 tang # tangled.org cli 21 22 ]; ··· 27 28 { pkg = pkgs.docker-buildx; } 28 29 { pkg = pkgs.docker-compose; } 29 30 { pkg = dagger; } 31 + { pkg = pkgs.rtk; } 30 32 { pkg = pkgs.skills; } 31 33 { pkg = tang; } 32 34 ]; ··· 36 38 37 39 # https://app.cachix.org/cache/rssbase#pull 38 40 cachix.pull = [ "rssbase" ]; 41 + 42 + env.RTK_TELEMETRY_DISABLED = 1; 39 43 40 44 # See full reference at https://devenv.sh/reference/options/ 41 45 }
tangled-cli/README.md nix-tangled-cli/README.md
tangled-cli/default.nix nix-tangled-cli/default.nix