Skip to content

Instantly share code, notes, and snippets.

@samkeen
Created April 10, 2026 17:54
Show Gist options
  • Select an option

  • Save samkeen/a734e4ba71b8206501d4adb8e39906fc to your computer and use it in GitHub Desktop.

Select an option

Save samkeen/a734e4ba71b8206501d4adb8e39906fc to your computer and use it in GitHub Desktop.
The session output of Claude Code (Opus 4.6) one shot'ing a Tauri 2 RSS feed reader
╭─── Claude Code v2.1.100 ─────────────────────────────────────────────────────╮
│ │ Tips for getting │
│ Welcome back Sam! │ started │
│ │ Run /init to create a … │
│ ▐▛███▜▌ │ ─────────────────────── │
│ ▝▜█████▛▘ │ Recent activity │
│ ▘▘ ▝▝ │ No recent activity │
│ Opus 4.6 (1M context) · Claude Max · │ │
│ ~/Projects/rss-reader/src-tauri │ │
╰──────────────────────────────────────────────────────────────────────────────╯
❯ use Tauri 2 to build an RSS reader
(https://code.claude.com/docs/en/changelog/rss.xml)\
for the UI, use a classic WinAmp look and feel\
use context7
⏺ Bash(date '+%Y-%m-%d %H:%M:%S %z')
⎿  2026-04-10 10:32:59 -0700
⏺ Bash(ls -la /Users/sam/Projects/rss-reader/ 2>&1; which cargo rustc node npm
2>&1; cargo tauri --version 2>&1 || echo "no tauri cli")
⎿  total 0
drwxr-xr-x 2 sam staff 64 Apr 10 10:29 .
drwxr-xr-x 221 sam staff 7072 Apr 10 10:29 ..
… +5 lines (ctrl+o to expand)
⏺ context7 - resolve-library-id (MCP)(libraryName: "Tauri", query: "Tauri 2
create app with vanilla HTML/CSS/JS
frontend, HTTP fetch from Rust, invoke
commands")
⏺ Fetch(https://code.claude.com/docs/en/changelog/rss.xml)
⎿  Received 63.3KB (200 OK)
⏺ context7 - query-docs (MCP)(libraryId: "/websites/v2_tauri_app", query:
"Create new Tauri 2 app with vanilla JS frontend
manually (no create-tauri-app). How to set up
src-tauri/Cargo.toml, tauri.conf.json, main.rs,
capabilities, invoke commands, and enable HTTP
plugin (tauri-plugin-http) for fetching external
URLs. Include full example of tauri.conf.json v2
schema and capabilities/default.json.")
⏺ context7 - query-docs (MCP)(libraryId: "/websites/v2_tauri_app", query:
"Complete tauri.conf.json v2 file example with
productName, identifier, build.beforeDevCommand,
devUrl, frontendDist, app.windows, and bundle
section. Also show full Cargo.toml for src-tauri
with tauri = \"2\" build dependency and complete
src-tauri/src/main.rs with tauri::Builder::default(
).run(tauri::generate_context!()). Also the minimal
capabilities/default.json to allow core:default
and http:default for a specific URL.")
⏺ context7 - query-docs (MCP)(libraryId: "/websites/v2_tauri_app", query: "Tauri
2 src/main.rs example with #[tauri::command] async
function, invoke_handler, generate_handler,
tauri::Builder::default().plugin() pattern. Also
the exact structure of
src-tauri/capabilities/default.json file with
identifier, windows, permissions array. And whether
bundle.icon can be an empty array or is required
in tauri.conf.json.")
⎿  Error: The operation timed out.
⏺ context7 - query-docs (MCP)(libraryId: "/websites/v2_tauri_app", query: "Tauri
v2 capabilities default.json file structure with
identifier, windows, permissions. Example
src-tauri/src/main.rs using tauri::command and
generate_handler. Frameless window with
decorations:false and how to drag with
data-tauri-drag-region.")
⏺ I have enough context. Let me scaffold the project. I'll fetch the feed in
Rust (simpler than wiring up the HTTP plugin's allow-list), parse with the rss
crate, and run a frameless WinAmp-style UI.
⏺ Bash(mkdir -p /Users/sam/Projects/rss-reader/src
/Users/sam/Projects/rss-reader/src-tauri/src
/Users/sam/Projects/rss-reader/src-tauri/capabilities /Users/sam/Projec…)
⎿  src
src-tauri
⏺ Bash(python3 <<'PY'
import struct, zlib, os…)
⎿  32x32.png 310
128x128.png 802
128x128@2x.png 1433
… +8 lines (ctrl+o to expand)
⏺ Write(Cargo.toml)
⎿  Wrote 29 lines to Cargo.toml
1 [package]
2 name = "rss-reader"
3 version = "0.1.0"
4 description = "Classic WinAmp-style RSS reader for Claude Code c
hangelog"
5 authors = ["you"]
6 edition = "2021"
7 rust-version = "1.77"
8
9 [lib]
10 name = "rss_reader_lib"
… +19 lines (ctrl+o to expand)
⏺ Write(build.rs)
⎿  Wrote 3 lines to build.rs
1 fn main() {
2 tauri_build::build()
3 }
⏺ Write(src/main.rs)
⎿  Wrote 5 lines to src/main.rs
1 #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")
]
2
3 fn main() {
4 rss_reader_lib::run()
5 }
⏺ Write(src/lib.rs)
⎿  Wrote 82 lines to src/lib.rs
1 use serde::Serialize;
2
3 const FEED_URL: &str = "https://code.claude.com/docs/en/changelo
g/rss.xml";
4 const USER_AGENT: &str = "rss-reader-tauri/0.1 (+https://code.cl
aude.com)";
5
6 #[derive(Serialize, Clone)]
7 struct FeedItem {
8 title: String,
9 link: String,
10 guid: String,
… +72 lines (ctrl+o to expand)
⏺ Write(tauri.conf.json)
⎿  Wrote 39 lines to tauri.conf.json
1 {
2 "$schema": "https://schema.tauri.app/config/2",
3 "productName": "RSS Reader",
4 "version": "0.1.0",
5 "identifier": "com.altered.rssreader",
6 "build": {
7 "frontendDist": "../src"
8 },
9 "app": {
10 "security": {
… +29 lines (ctrl+o to expand)
⏺ Write(capabilities/default.json)
⎿  Wrote 14 lines to capabilities/default.json
1 {
2 "$schema": "../gen/schemas/desktop-schema.json",
3 "identifier": "default",
4 "description": "Default capability for the main window",
5 "windows": ["main"],
6 "permissions": [
7 "core:default",
8 "core:window:allow-close",
9 "core:window:allow-minimize",
10 "core:window:allow-start-dragging",
… +4 lines (ctrl+o to expand)
⏺ Write(~/Projects/rss-reader/src/index.html)
⎿  Wrote 70 lines to ../src/index.html
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8" />
5 <meta name="viewport" content="width=device-width, initial-sca
le=1.0" />
6 <title>RSS Reader</title>
7 <link rel="stylesheet" href="styles.css" />
8 </head>
9 <body>
10 <div class="app-frame">
… +60 lines (ctrl+o to expand)
⏺ Write(~/Projects/rss-reader/src/styles.css)
⎿  Wrote 434 lines to ../src/styles.css
1 /* =============================================================
===========
2 RSS Reader — Classic WinAmp skin
3 Palette based on WinAmp 2.x default skin (Base-2.91)
4 =============================================================
=========== */
5
6 :root {
7 --wa-black: #000000;
8 --wa-bg: #1b2436; /* panel dark blue */
9 --wa-bg-deep: #0f1624; /* inset interiors */
10 --wa-face: #2e3a55; /* beveled face */
… +424 lines (ctrl+o to expand)
⏺ I need withGlobalTauri enabled so vanilla JS can call
window.__TAURI__.core.invoke without a bundler. Let me update the config.
⏺ Update(tauri.conf.json)
⎿  Added 1 line
7 "frontendDist": "../src"
8 },
9 "app": {
10 + "withGlobalTauri": true,
11 "security": {
12 "csp": null
13 },
⏺ Write(~/Projects/rss-reader/src/main.js) ⎿  Wrote 243 lines to ../src/main.js
1 // RSS Reader — frontend logic
2 // Uses window.__TAURI__ globals (enabled via app.withGlobalTaur
i in tauri.conf.json)
3
4 const { invoke } = window.__TAURI__.core;
5 const currentWindow = window.__TAURI__.window.getCurrentWindow()
;
6
7 // ---------- State ----------
8 const state = {
9 feed: null,
10 index: -1,
… +233 lines (ctrl+o to expand)
⏺ Now let me verify the Rust code compiles. This will download and build Tauri 2
+ dependencies (takes a while on first run).
⏺ Bash(cd /Users/sam/Projects/rss-reader/src-tauri && cargo check 2>&1 | tail
-80)
⎿   Compiling block-buffer v0.10.4
Compiling fdeflate v0.3.7
Compiling foreign-types-macros v0.2.3
… +36 lines (ctrl+o to expand)
⎿  (timeout 10m)
⏺ Cargo check passed cleanly. Let me verify the generated schema files exist (so
the capabilities ACL is wired correctly).
Listed 1 directory (ctrl+o to expand)
⏺ Done. Everything compiles cleanly and tauri-build generated the ACL schemas
successfully.
What was built
/Users/sam/Projects/rss-reader/
src/ # Frontend (served as frontendDist, embedded at
compile time)
index.html # Frameless WinAmp layout
styles.css # Classic WinAmp skin (beveled panels, LCD, green
marquee)
main.js # invoke('fetch_feed'), playlist/content rendering,
keyboard nav
src-tauri/
Cargo.toml # tauri 2, reqwest (rustls), rss 2, tokio
build.rs # tauri_build::build()
tauri.conf.json # frameless 780×520 window, withGlobalTauri, bundle
icons
capabilities/default.json# core:default + window close/minimize/drag
src/main.rs # thin entry → rss_reader_lib::run()
src/lib.rs # #[tauri::command] fetch_feed(url?) → Feed {
items[] }
icons/ # 32/128/256/512 PNGs (generated WinAmp-blue
placeholders)
Design notes
- RSS fetch + parse is done in Rust (reqwest + rss crate) and returned via
invoke('fetch_feed'). This avoided wiring the tauri-plugin-http URL allow-list
and sidesteps any CORS issues from the webview.
- Frontend uses no build step, no npm deps — withGlobalTauri: true exposes
window.__TAURI__.core.invoke and window.__TAURI__.window.getCurrentWindow() so
plain <script type="module"> works.
- Window is frameless (decorations: false); drag via data-tauri-drag-region on
the titlebar; custom [-]/[×] buttons call currentWindow.minimize() / .close()
(permitted in capabilities/default.json).
- WinAmp skin details: green LCD marquee that auto-scrolls only when the title
overflows, amber status LEDs, beveled steel transport buttons (◀◀ ▶▶ ⟳
REFRESH), playlist in monospace with amber track numbers, dark navy→black
gradients, all via CSS.
- Keyboard: ↑/↓ or j/k navigate items, r / F5 refresh.
Context7 usage: Pulled Tauri 2 config schema (tauri.conf.json
build/app/bundle/windows shape) and the capabilities JSON format (identifier,
windows, permissions) from /websites/v2_tauri_app to make sure v2 structure
was correct (core:* namespacing, v2-only keys like devUrl/frontendDist,
identifier field, etc.).
To run it
You'll need the Tauri 2 CLI (your current tauri-cli is v1.5.9):
cargo install tauri-cli --version "^2.0"
cd /Users/sam/Projects/rss-reader
cargo tauri dev
Or run the binary directly without the CLI (works since there's no dev server
— frontend is embedded from ../src):
cd /Users/sam/Projects/rss-reader/src-tauri
cargo run
The app will fetch https://code.claude.com/docs/en/changelog/rss.xml on
launch, populate the playlist, and show the first item's HTML in the content
pane.
✻ Cooked for 9m 5s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment