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
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.
About
Use cases: presentations, backend, writing, marketing
Reviews
Write a reviewNo 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
- 0.629score
swift-testing
ducko-im
Expert guidance on Swift Testing for writing, reviewing, migrating, and debugging tests.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
accessibility
ducko-im
Apply platform accessibility best practices to SwiftUI, UIKit, and AppKit code.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
macos-ui-testing
ducko-im
Background-safe macOS app UI testing using Peekaboo CLI and osascript.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swiftui
ducko-im
Write, review, or improve SwiftUI code across state management, view composition, performance, modern APIs, navigation, animation, accessibility, Liquid Glass…
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swiftui-performance-audit
ducko-im
Audit and improve SwiftUI runtime performance from code review and architecture.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
writing-for-interfaces
ducko-im
Use when someone asks to write, rewrite, review, or improve text that appears inside a product or interface.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
macos-spm-app-packaging
ducko-im
Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
release
ducko-im
Cut a Ducko release: update CHANGELOG.md on main, then push the X.Y.Z tag that triggers the release.yml CI workflow (build, sign, notarize, DMG, Sparkle…
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swift-concurrency
ducko-im
Expert guidance on Swift Concurrency correctness, modern API usage, and async/await pitfalls in Swift 6.2+.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swift-language
ducko-im
Write, review, or improve Swift APIs and value-display formatting.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swift-security
ducko-im
Use when working with iOS/macOS Keychain Services (SecItem queries, kSecClass, OSStatus errors), biometric authentication (LAContext, Face ID, Touch ID)…
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swiftdata
ducko-im
Expert guidance for designing, writing, reviewing, and debugging SwiftData persistence in Swift and SwiftUI apps.
SkillAFreshness: A★ 7Claude Code +9
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
- Repository
- github.com/ducko-im/ducko
- Website
- ducko.im
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from ducko-im
- 0.629score
swift-security
ducko-im
Use when working with iOS/macOS Keychain Services (SecItem queries, kSecClass, OSStatus errors), biometric authentication (LAContext, Face ID, Touch ID)…
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swift-language
ducko-im
Write, review, or improve Swift APIs and value-display formatting.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swift-concurrency
ducko-im
Expert guidance on Swift Concurrency correctness, modern API usage, and async/await pitfalls in Swift 6.2+.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
macos-spm-app-packaging
ducko-im
Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project.
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
release
ducko-im
Cut a Ducko release: update CHANGELOG.md on main, then push the X.Y.Z tag that triggers the release.yml CI workflow (build, sign, notarize, DMG, Sparkle…
SkillAFreshness: A★ 7Claude Code +9 - 0.629score
swiftdata
ducko-im
Expert guidance for designing, writing, reviewing, and debugging SwiftData persistence in Swift and SwiftUI apps.
SkillAFreshness: A★ 7Claude Code +9
Cite this page
demo-screenshots skill. Agent Mart. https://agentmart.dev/skills/ducko-im-demo-screenshots (last updated 2026-10-24)