Skip to content
Agentmart
Submit a tool

demo-screenshots

Produce screenshots of the Ducko contacts list and chat window filled with made-up contacts and messages, using a local stub server and an isolated copy of…

Skill by ducko-im

IndexedGPL-3.0★ 7
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/ducko-im-demo-screenshots

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Produce screenshots of the Ducko contacts list and chat window filled with made-up contacts and messages, using a local stub server and an isolated copy of the debug app, so no real account, contact, or conversation appears. Also captures the website's reference set: every state in its manifest, in light and dark, unattended in the Lume VM. Use when the user asks for "demo screenshots", "screenshots with demo content", "a screenshot for the README", "screenshots for the website", "screenshots for slides", "marketing screenshots", "a screenshot without my real contacts", "website reference captures", or "capture the reference states".

Use cases: presentations, backend, writing, marketing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/demo-screenshots

What's inside

Skill name
demo-screenshots
Description
Produce screenshots of the Ducko contacts list and chat window filled with made-up contacts and messages, using a local stub server and an isolated copy of the debug app, so no real account, contact, or conversation appears. Also captures the website's reference set: every state in its manifest, in light and dark, unattended in the Lume VM. Use when the user asks for "demo screenshots", "screenshots with demo content", "a screenshot for the README", "screenshots for the website", "screenshots for slides", "marketing screenshots", "a screenshot without my real contacts", "website reference captures", or "capture the reference states".
License
GPL-3.0
Instructions
369 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts

Agent Skills spec issues

  • body: contains an absolute path from the author's machine

Files (9)

  • SKILL.md
  • content.json
  • avatars.swift · scripts/
  • compare.swift · scripts/
  • drive.swift · scripts/
  • reference.py · scripts/
  • seed_transcript.py · scripts/
  • stub.py · scripts/
  • windows.swift · scripts/

SKILL.md (first lines)

# Demo Screenshots

Steps 1–7 capture the Contacts window and the chat window at its default size, in light appearance, with made-up content from `content.json` served by a stub on `127.0.0.1`. [Reference Mode for the Website](#reference-mode-for-the-website) captures every state the website's manifest lists, in light and dark.

## Prerequisites

- Screen Recording and Accessibility permission for the terminal that runs these commands
- An unlocked GUI session

Run every Bash call in this workflow unsandboxed: the steps bind a local port, launch the app, read the window list, and write under `~/Library/Application Support`.

Shell variables do not carry between Bash calls, so start every snippet below with these lines:

```bash
WORK=<absolute path of this run's work folder, outside the repo, free of + * ? ^ \ $ | ( ) [ ] { }>
PROFILE=demo-screenshots
PORT=5299
APP="${WORK:?}/DuckoDemo.app"
SCRIPTS=Skills/demo-screenshots/scripts
STORE="$HOME/Library/Application Support/Ducko-Dev-${PROFILE:?}"
```

The `pgrep -fl` and `pkill` patterns are written out in full on purpose, so a snippet run without these lines can never match the installed app. Keep the `^${APP:?}` anchor in every `PID=` lookup: a launch command with the path spelled out leaves a shell that has the same path in its command line, and an unanchored lookup returns that shell's PID as well. The anchor matches only a launch by the absolute path, so never launch the copy by a relative one. With `APP` unset, the lookup stops with an error and `PID` stays empty.

Drive the demo instance only by its PID. Skip every tool that targets the app by name (System Events `process "DuckoApp"`, Peekaboo `--app`), because an installed Ducko that is running has the same process name. The scripts in `Skills/ducko-ui/scripts` drive only their own `DuckoUITest` copy, so they cannot reach the demo instance either. The installed app may keep running throughout.

## Step 1: Prepare

1. Tell the user that a second Ducko with demo content runs from Step 4 on: it adds a menu-bar icon, may ask for notification permission, may play a message sound, and its windows come to the front while capturing.
2. Confirm nothing is left from an earlier run. Each of these must print nothing or report that its target does not exist:

   ```bash
   ls -d "$STORE"; defaults read im.ducko.dev.$PROFILE; defaults read im.ducko.demo
   pgrep -fl "DuckoDemo.app/Contents/MacOS/DuckoApp"; lsof -iTCP:$PORT -sTCP:LISTEN
   ```

   Otherwise run Step 7 first, since saved window frames and saved tabs would carry into this run. When the port is held by something other than `stub.py`, pick another port.
3. Create the work folder: `mkdir -p "$WORK/avatars" "$WORK/shots"`.

## Step 2: Build the App Copy

A copy with its own bundle ID has no saved window frames, so the chat window opens at its default size and nothing is written to the `im.ducko` preferences. `NSRequiresAquaSystemAppearance` forces light appearance on a system set to Dark. The freshly built debug binary is what makes `DUCKO_PROFILE` take effect: a release binary ignores it and opens the real store, so the snippet stops at the first failing line.

When no `Ducko.app` exists at the repo root, run `SIGNING_MODE=adhoc ./Scripts/package_app.sh debug` first and remove that bundle again in Step 7. Then:

```bash
set -e
swift build
BIN=$(swift build --show-bin-path)
cp -R Ducko.app "$APP"
cp "$BIN/DuckoApp" "$APP/Contents/MacOS/DuckoApp"
install_name_tool -add_rpath "@executable_path/../Frameworks" "$APP/Contents/MacOS/DuckoApp"
cp "$BIN/DuckoCLI" "$APP/Contents/Resources/ducko"
/usr/libexec/PlistBuddy \
  -c "Set :CFBundleIdentifier im.ducko.demo" \
  -c "Add :NSRequiresAquaSystemAppearance bool true" \
  -c "Add :SUEnableAutomaticChecks bool false" \
  "$APP/Contents/Info.plist"
chmod -R u+w "$APP"; xattr -cr "$APP"
find "$APP/Contents/Frameworks" -type f -perm -111 -print0 | xargs -0 -n1 codesign --force --sign -
codesign --force --sign - "$APP/Contents/Frameworks/Sparkle.framework"
codesign --force --sign - "$APP/Contents/Resources/ducko"
codesign --force --sign - --entitlements Resources/Entitlements.plist "$APP"
codesign --verify --deep "$APP" && echo signed-ok
```

Continue once it prints `signed-ok`.

## Step 3: Start the Stub and Add the Account

1. Render the avatars: `swift $SCRIPTS/avatars.swift "$WORK/avatars"`.
2. Start the stub as a background command, without a trailing `&`:

   ```bash
   python3 $SCRIPTS/stub.py $PORT "$WORK"
   ```

   It serves the account, contacts and rooms of `content.json`. It logs every byte sent and received to `$WORK/stub.log`.
3. Add the account, then allow plaintext to the stub and turn on Connect on Launch. The CLI has no option for either, so set them in the profile's store. The JID, password and display name are `account.jid`, `account.password` and `account.name` of the content file in use. The last line must print `1`:

   ```bash
   BIN=$(swift build --show-bin-path)
   DUCKO_PROFILE=$PROFILE "$BIN/DuckoCLI" account add tobias@pond.example --password demo --host 127.0.0.1 --port $PORT --no-connect
   sqlite3 "$STORE/default.store" "UPDATE ZACCOUNTRECORD SET ZREQUIRETLS=0, ZCONNECTONLAUNCH=1, ZDISPLAYNAME='Tobias'; SELECT changes();"
   ```

4. Prove the stub before any window appears:

   ```bash
   BIN=$(swift build --show-bin-path)
   DUCKO_PROFILE=$PROFILE "$BIN/DuckoCLI" roster list
   ```

   It must print `connected as tobias@pond.example/…` (the `account.jid` in use) and the contacts in their groups. On any other result, read `$WORK/stub.log` for the last exchange and fix the stub before continuing.

## Step 4: Create the Conversation

1. Launch the copy's inner binary as a background command, without a trailing `&`. The launch argument switches this instance to overlay scroll bars, which removes the empty scroll track from the chat window:

   ```bash
   DUCKO_PROFILE=$PROFILE "$APP/Contents/MacOS/DuckoApp" -AppleShowScrollBars WhenScrolling
   ```

2. Wait for the Contacts window with `TITLE="Contacts"`:

   ```bash
   for attempt in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
     PID=$(pgrep -f "^${APP:?}/Contents/MacOS/DuckoApp")
     [ -n "$PID" ] && swift $SCRIPTS/windows.swift "$PID" | grep "onscreen true.*title: $TITLE\$" && break
     perl -e 'select(undef,undef,undef,1)'
   done
   ```

   Continue once it prints the window's line. When it prints nothing, read `$WORK/stub.log` for the last exchange.
3. Push one incoming message through the stub. The stub holds it until the instance has its roster and presence. The chat window then opens by itself at its default size, and the conversation's transcript folder is created:

   ```bash
   echo "<message from='lena@pond.example/laptop' to='{ME}' type='chat' id='seed-1'><body>Hi</body></message>" >> "$WORK/inject.txt"
   ```

From ducko-im/ducko, GPL-3.0.

More from ducko-im/ducko

Signals

Stars
7
Forks
0
Open issues
4
Last commit (this folder)
Oct 18, 2026 (11 days ago)
Last release
Oct 23, 2026 (6 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
GPL-3.0
Website
ducko.im
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from ducko-im

Cite this page

demo-screenshots skill. Agent Mart. https://agentmart.dev/skills/ducko-im-demo-screenshots (last updated 2026-10-24)