Feedbacks — Capture + Ticket-Takeaway Integration
This skill handles everything: first-time setup, launching the capture app, and analyzing sessions.
It works from any project directory — the feedbacks tool lives at /home/user/projects/feedbacks.
When ticket-takeaway is installed, this skill adds:
- Ticket-linked output directories (
/feedbacks start {ticket-id})
- Context push after analysis (session path + summary available to the agent)
FEEDBACKS_HOME: /home/user/projects/feedbacks
Determine what to do
Check $ARGUMENTS.command:
- If
setup → go to Setup
- If
start (with or without ticket-id) → go to Start
- If
analyze or a file/directory path → go to Analyze
- If omitted → Auto-detect:
Auto-detect logic
- Check if FEEDBACKS_HOME exists:
ls /home/user/projects/feedbacks/start.sh
- Check if
whisper.cpp/build/bin/whisper-server exists in FEEDBACKS_HOME
- If not → tell the user: "First time? Running setup." → go to Setup
- Check if whisper-server is already running:
curl -sf http://localhost:8081/health
- If not running → go to Start
- If running → go to Analyze (app is already up, user probably has a session to review)
Setup
Install whisper.cpp and download a model. Run these commands:
cd /home/user/projects/feedbacks
# Clone and build whisper.cpp
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
cmake -B build
cmake --build build -j --config Release
cd ..
# Download the base English model
sh whisper.cpp/models/download-ggml-model.sh base.en
Run each step, check for errors between steps. If cmake or build tools are missing, install them:
sudo apt update && sudo apt install -y build-essential cmake
After setup completes, tell the user:
Setup complete! Run /feedbacks again to start the capture app.
Start
Launch the capture app and whisper server.
First, check if ports 8080/8081 are already in use:
curl -sf http://localhost:8081/health && echo "Whisper already running" || echo "Whisper not running"
curl -sf http://localhost:8080/ && echo "App already running" || echo "App not running"
Determine output directory based on context:
If a ticket-id was provided (e.g., /feedbacks start B-05):
- Resolve the current project root (check for
PRODUCT_BACKLOG.md in cwd or parents)
- Set output dir to:
{project_root}/.feedbacks/{ticket-id}/
- Include
?ticket={ticket-id} in the URL
If no ticket-id:
- If
FEEDBACKS_OUTPUT_DIR is already set in the environment, use it
- Otherwise, use the feedbacks default (sessions save to
~/projects/feedbacks/sessions/)
If not running, start the server:
FEEDBACKS_OUTPUT_DIR=/path/to/output cd /home/user/projects/feedbacks && ./start.sh
Run this in the background so the user can continue using Claude Code.
Tell the user:
With ticket context:
Feedbacks is running at http://localhost:8080/?ticket={ticket-id}
Sessions will save to: {project_root}/.feedbacks/{ticket-id}/
Open it in Chrome, capture your session, then come back.
Without ticket context:
Feedbacks is running at http://localhost:8080
Sessions will save to the default location.
Open it in Chrome, capture your session, then run /feedbacks to analyze it.
Analyze
Ingest and analyze a captured feedback session.
Finding the session
If a path was provided in $ARGUMENTS.command, use it directly. Otherwise:
Check server output directory first — query the running server for its config:
curl -sf http://localhost:8080/config
If it returns an outputDir, use Glob to find the latest feedbacks-*/session.md in that directory.
Sessions are saved as extracted directories (not ZIPs) with this structure:
{outputDir}/feedbacks-{timestamp}/
session.md
player.html
images/001.png, 002.png, ...
Check project-specific .feedbacks/ directory — if running from a project context:
ls -dt {project_root}/.feedbacks/*/feedbacks-*/session.md 2>/dev/null | head -1
Fallback to Downloads — check the user's download directory for ZIP files:
Processing the session
Read session.md from the session directory
Parse each section — they follow this pattern:
## TIMESTAMP

**[Marker N — user clicked at (x, y)]**
> Transcript text...
Coherence pass: The transcript was progressively transcribed in ~10s chunks. Quickly scan it for:
- Obvious chunk-boundary artifacts (cut-off sentences between sections)
- Repeated words at boundaries
- If you spot issues, silently smooth them in your interpretation — don't flag minor STT artifacts to the user
For each section, read the referenced screenshot image using the Read tool (it supports images)
Correlate markers with speech: When the transcript says "this", "here", "that area" etc., map those deictic references to the numbered markers visible in the screenshot. The marker number tells you exactly what the user was pointing at.
Describe each screenshot using this structured format. Extract as much context as possible from the image itself — the user's voice only tells half the story.
For each screenshot, produce:
### Screenshot N · {timestamp}
**Screen:** {what app/page is shown}
**URL:** {visible URL from browser address bar, or "not visible"}
**Page title:** {tab title or page heading if readable}
**Cursor:** {where the cursor is}
**Marker {N}:** {what the marker is pointing at}
**Interaction:** {what the user did — click, drag-select, hover}
**Visible state:** {anything notable about the current UI state}
**User said:** "{transcript text}"
**Interpretation:** {one sentence combining what the user pointed at with what they said}
Field rules:
- Screen: Identify the app from visual cues. Be specific.
- URL: Read literally from address bar. "not visible" if cropped.
- Cursor: Describe relative to UI elements, not pixel coordinates.
- Marker: Describe what marker is on top of, not the marker itself.
- Visible state: Only note what's relevant.
- Interpretation: Fuse visual + verbal evidence. One clear sentence.
If a screenshot has no marker and no transcript (auto-captured context frame):
### Screenshot N · {timestamp}
**Screen:** {app/page}
**Context frame** — no user interaction. {Brief note.}
After presenting all sections, provide a summary analysis:
- Feedback points: Each issue raised, with screenshot number, marker, one-line description
- Navigation path: Sequence of screens/pages visited
- UI/UX issues: Problems visible that user may or may not have mentioned
- Suggested action items: Concrete fixes, each linked to a specific screenshot
Context push (ticket-takeaway integration)
After the analysis is complete, push session context for the agent:
Determine the session path (the directory that was analyzed)
Check if summary.json exists in the session — if yes, read the summary. Otherwise, use the summary from the analysis above.
Output to the agent context:
Feedback session: {session_path}
Summary: {summary text}
This is informational. The agent can act on it as appropriate — create a ticket, link to an existing one, or just note it. Do not prompt for ticket creation.
Important
- Read images with their full path:
<session-dir>/images/NNN.png
- The transcript comes from Whisper (local or cloud) and may have minor errors — interpret charitably
- Screenshots contain numbered red circle markers or red selection boxes — these show exactly where the user clicked/selected
- Focus on understanding the user's intent by combining the visual markers with the spoken context
1---2name: feedbacks3description: Screen+voice capture for visual feedback. Setup whisper.cpp, launch the capture app, or analyze a session. When ticket-takeaway is installed, adds SDLC context (ticket-linked output, context push after analysis).4---56# Feedbacks — Capture + Ticket-Takeaway Integration78This skill handles everything: first-time setup, launching the capture app, and analyzing sessions.9It works from **any project directory** — the feedbacks tool lives at `/home/user/projects/feedbacks`.1011When ticket-takeaway is installed, this skill adds:12- Ticket-linked output directories (`/feedbacks start {ticket-id}`)13- Context push after analysis (session path + summary available to the agent)1415**FEEDBACKS_HOME:** `/home/user/projects/feedbacks`1617## Determine what to do1819Check `$ARGUMENTS.command`:2021- If `setup` → go to **Setup**22- If `start` (with or without ticket-id) → go to **Start**23- If `analyze` or a file/directory path → go to **Analyze**24- If omitted → **Auto-detect**:2526### Auto-detect logic27281. Check if FEEDBACKS_HOME exists: `ls /home/user/projects/feedbacks/start.sh`29 - If not → tell the user: "Feedbacks is not installed. Install from https://github.com/ytubecoder/feedbacks for screen+voice capture."302. Check if `whisper.cpp/build/bin/whisper-server` exists in FEEDBACKS_HOME31 - If not → tell the user: "First time? Running setup." → go to **Setup**323. Check if whisper-server is already running: `curl -sf http://localhost:8081/health`33 - If not running → go to **Start**34 - If running → go to **Analyze** (app is already up, user probably has a session to review)3536---3738## Setup3940Install whisper.cpp and download a model. Run these commands:4142```bash43cd /home/user/projects/feedbacks4445# Clone and build whisper.cpp46git clone https://github.com/ggerganov/whisper.cpp47cd whisper.cpp48cmake -B build49cmake --build build -j --config Release50cd ..5152# Download the base English model53sh whisper.cpp/models/download-ggml-model.sh base.en54```5556Run each step, check for errors between steps. If `cmake` or build tools are missing, install them:57```bash58sudo apt update && sudo apt install -y build-essential cmake59```6061After setup completes, tell the user:62> Setup complete! Run `/feedbacks` again to start the capture app.6364---6566## Start6768Launch the capture app and whisper server.69701. First, check if ports 8080/8081 are already in use:71 ```bash72 curl -sf http://localhost:8081/health && echo "Whisper already running" || echo "Whisper not running"73 curl -sf http://localhost:8080/ && echo "App already running" || echo "App not running"74 ```75762. **Determine output directory** based on context:7778 **If a ticket-id was provided** (e.g., `/feedbacks start B-05`):79 - Resolve the current project root (check for `PRODUCT_BACKLOG.md` in cwd or parents)80 - Set output dir to: `{project_root}/.feedbacks/{ticket-id}/`81 - Include `?ticket={ticket-id}` in the URL8283 **If no ticket-id:**84 - If `FEEDBACKS_OUTPUT_DIR` is already set in the environment, use it85 - Otherwise, use the feedbacks default (sessions save to `~/projects/feedbacks/sessions/`)86873. If not running, start the server:88 ```bash89 FEEDBACKS_OUTPUT_DIR=/path/to/output cd /home/user/projects/feedbacks && ./start.sh90 ```91 Run this in the background so the user can continue using Claude Code.92934. Tell the user:9495 **With ticket context:**96 > Feedbacks is running at **http://localhost:8080/?ticket={ticket-id}**97 > Sessions will save to: `{project_root}/.feedbacks/{ticket-id}/`98 > Open it in Chrome, capture your session, then come back.99100 **Without ticket context:**101 > Feedbacks is running at **http://localhost:8080**102 > Sessions will save to the default location.103 > Open it in Chrome, capture your session, then run `/feedbacks` to analyze it.104105---106107## Analyze108109Ingest and analyze a captured feedback session.110111### Finding the session112113If a path was provided in `$ARGUMENTS.command`, use it directly. Otherwise:1141151. **Check server output directory first** — query the running server for its config:116 ```bash117 curl -sf http://localhost:8080/config118 ```119 If it returns an `outputDir`, use Glob to find the latest `feedbacks-*/session.md` in that directory.120 Sessions are saved as extracted directories (not ZIPs) with this structure:121 ```122 {outputDir}/feedbacks-{timestamp}/123 session.md124 player.html125 images/001.png, 002.png, ...126 ```1271282. **Check project-specific `.feedbacks/` directory** — if running from a project context:129 ```bash130 ls -dt {project_root}/.feedbacks/*/feedbacks-*/session.md 2>/dev/null | head -1131 ```1321333. **Fallback to Downloads** — check the user's download directory for ZIP files:134 - Check `~/.claude/memory/feedbacks_download_dir.md` for saved download path135 - Use Glob to find the latest `feedbacks-*.zip`136 - If no memory exists, ask the user for their download directory and save it to memory137 - If the path points to a `.zip` file, extract it:138 ```bash139 unzip -o <path-to-zip> -d /tmp/feedbacks-session140 ```141 Then use the extracted directory.142143### Processing the session1441451. Read `session.md` from the session directory1462. Parse each section — they follow this pattern:147 ```148 ## TIMESTAMP149 150 **[Marker N — user clicked at (x, y)]**151 > Transcript text...152 ```1533. **Coherence pass**: The transcript was progressively transcribed in ~10s chunks. Quickly scan it for:154 - Obvious chunk-boundary artifacts (cut-off sentences between sections)155 - Repeated words at boundaries156 - If you spot issues, silently smooth them in your interpretation — don't flag minor STT artifacts to the user1574. For each section, read the referenced screenshot image using the Read tool (it supports images)1585. **Correlate markers with speech**: When the transcript says "this", "here", "that area" etc., map those deictic references to the numbered markers visible in the screenshot. The marker number tells you exactly what the user was pointing at.1596. **Describe each screenshot** using this structured format. Extract as much context as possible from the image itself — the user's voice only tells half the story.160161 For each screenshot, produce:162163 ```164 ### Screenshot N · {timestamp}165166 **Screen:** {what app/page is shown}167 **URL:** {visible URL from browser address bar, or "not visible"}168 **Page title:** {tab title or page heading if readable}169 **Cursor:** {where the cursor is}170 **Marker {N}:** {what the marker is pointing at}171 **Interaction:** {what the user did — click, drag-select, hover}172 **Visible state:** {anything notable about the current UI state}173174 **User said:** "{transcript text}"175176 **Interpretation:** {one sentence combining what the user pointed at with what they said}177 ```178179 **Field rules:**180 - **Screen**: Identify the app from visual cues. Be specific.181 - **URL**: Read literally from address bar. "not visible" if cropped.182 - **Cursor**: Describe relative to UI elements, not pixel coordinates.183 - **Marker**: Describe what marker is *on top of*, not the marker itself.184 - **Visible state**: Only note what's relevant.185 - **Interpretation**: Fuse visual + verbal evidence. One clear sentence.186187 If a screenshot has no marker and no transcript (auto-captured context frame):188 ```189 ### Screenshot N · {timestamp}190 **Screen:** {app/page}191 **Context frame** — no user interaction. {Brief note.}192 ```1931947. After presenting all sections, provide a **summary analysis**:195 - **Feedback points**: Each issue raised, with screenshot number, marker, one-line description196 - **Navigation path**: Sequence of screens/pages visited197 - **UI/UX issues**: Problems visible that user may or may not have mentioned198 - **Suggested action items**: Concrete fixes, each linked to a specific screenshot199200### Context push (ticket-takeaway integration)201202After the analysis is complete, push session context for the agent:2032041. Determine the session path (the directory that was analyzed)2052. Check if `summary.json` exists in the session — if yes, read the summary. Otherwise, use the summary from the analysis above.2063. Output to the agent context:207208 > **Feedback session:** `{session_path}`209 > **Summary:** {summary text}210211 This is informational. The agent can act on it as appropriate — create a ticket, link to an existing one, or just note it. Do not prompt for ticket creation.212213### Important214215- Read images with their full path: `<session-dir>/images/NNN.png`216- The transcript comes from Whisper (local or cloud) and may have minor errors — interpret charitably217- Screenshots contain numbered red circle markers or red selection boxes — these show exactly where the user clicked/selected218- Focus on understanding the user's intent by combining the visual markers with the spoken context