{"slug": "show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding", "title": "Show HN: Askance, a human-in-the-loop GUI for agentic coding", "summary": "Askance, a new human-in-the-loop GUI for agentic coding, lets developers answer questions from AI coding agents like Claude Code via a local server and CLI, with support for Markdown, Mermaid diagrams, diffs, and push notifications. The tool, distributed as a single binary for Linux, Mac, and Windows via WSL, can be installed via a Nix flake or run manually, and includes setup instructions for systemd and launchd.", "body_md": "Askance is a simple and beautiful human-in-the-loop GUI for answering questions from an AI coding agent such as Claude Code, either in the browser or on the go with your phone.\n\nIt works by combining a server which you run locally with a self-documenting command-line utility which your agent uses to put questions to you. The CLI blocks on your answer so your agent waits for you, you answer whenever you're ready.\n\n- 📊 See agent feedback in richly formatted Markdown with Mermaid diagrams.\n- ✅ Answer questions with a single click, and attach free text to any answer.\n- 📋 Decide on multi-factor tradeoffs by picking from a table.\n- 🔍 View diffs of uncommitted code right next to agent feedback.\n- 📱 Respond from your desktop or your phone.\n- 🔔 Get notified when an agent is waiting on you with push notifications.\n\nAdd the following to your nix flake to install fully on nix.\n\n```\n# Imports the latest version as a nix flake\ninputs.askance = {\n  url = \"github:tobico/askance\";\n  inputs.nixpkgs.follows = \"nixpkgs\";\n};\n\n# The module comes from the input rather than from pkgs, so it has to be\n# imported before it can be enabled. In your host's module list:\nmodules = [\n  askance.nixosModules.askance\n  { services.askance.enable = true; }\n];\n```\n\nThis runs the server daemon under its own user, and adds the Askance CLI to\nevery user's `PATH`\n\n.\n\nAskance is distributed as a single binary, which you download and run from your home folder. It runs on Linux, Mac, and Windows via WSL.\n\n```\nmkdir -p ~/.local/bin && curl -fsSL -o ~/.local/bin/askance \\\n  \"https://github.com/tobico/askance/releases/latest/download/askance-$(uname -s | tr '[:upper:]' '[:lower:]' | sed s/darwin/macos/)-$(uname -m | sed -e s/x86_64/x64/ -e s/aarch64/arm64/)\" \\\n  && chmod +x ~/.local/bin/askance\n```\n\n`~/.local/bin`\n\nneeds to be on your `PATH`\n\n, which on most systems it already is.\n\nYou can run the server manually with `askance serve`\n\n; by default it will listen\non `127.0.0.1:8422`\n\n. Open [http://127.0.0.1:8422/](http://127.0.0.1:8422/) and you'll find the pending\nlist, which is where your agent's questions turn up.\n\nAskance server works fine when run manually, but for convenience you can add a systemd user unit to have it start automatically with your machine.\n\n`~/.config/systemd/user/askance.service`\n\n:\n\n```\n[Unit]\nDescription=Askance — questions from coding agents to a human\nAfter=network.target\n\n[Service]\nExecStart=%h/.local/bin/askance serve --listen 127.0.0.1:8422 \\\n    --database %S/askance/askance.db\nStateDirectory=askance\nRestart=always\nRestartSec=5s\nNoNewPrivileges=true\nRestrictSUIDSGID=true\nUMask=0077\n\n[Install]\nWantedBy=default.target\n```\n\nThen start it:\n\n```\nsystemctl --user daemon-reload\nsystemctl --user enable --now askance\n```\n\nmacOS doesn't have systemd; its equivalent is launchd.\n\nCreate a per-user agent, running as you, in\n`~/Library/LaunchAgents/net.tobico.askance.plist`\n\n. launchd doesn't expand `~`\n\n,\nso the paths are spelled out — replace `you`\n\nwith your username:\n\n```\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"\n  \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>Label</key>\n  <string>net.tobico.askance</string>\n  <key>ProgramArguments</key>\n  <array>\n    <string>/Users/you/.local/bin/askance</string>\n    <string>serve</string>\n    <string>--listen</string>\n    <string>127.0.0.1:8422</string>\n    <string>--database</string>\n    <string>/Users/you/Library/Application Support/askance/askance.db</string>\n  </array>\n  <!-- Start at login, and come back if it dies — an agent is blocked on an\n       answer for as long as the server is down. -->\n  <key>RunAtLoad</key>\n  <true/>\n  <key>KeepAlive</key>\n  <true/>\n</dict>\n</plist>\nlaunchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/net.tobico.askance.plist\nlaunchctl print gui/$(id -u)/net.tobico.askance\n```\n\nThe database's parent directory is created for you, so there's nothing to set up before the first start.\n\nAdd the following to your `~/.claude/CLAUDE.md`\n\nfile or equivalent:\n\nNever use the AskUserQuestion tool. Put all questions and approvals to me through askance: run\n\n`askance`\n\nonce per session for the guide and follow it, including the topic guides it requires.\n\nThe `askance`\n\nCLI is self-documenting and will guide your agent with\nbuilt-in guides on how to use it effectively as needed.\n\nAskance is designed to be especially useful in two situations:\n\n- When your agent asks you a lot of questions\n- When your agent leaves code uncommitted as an acceptance gate, asking your permission before committing it.\n\nIn order to benefit from this, you need to actually have skills or prompts which instruct your agent to do those things.\n\nTwo such skills are included as examples, but feel free to use whichever skills or prompting approach you prefer; Askance will adapt to it.\n\n** Grilling** — interviews you about a plan by\nasking a series of questions until a shared understanding is reached.\nInspired by the\n\n[Matt Pocock grilling skill](https://github.com/mattpocock/skills)\n\n** Acceptance gate** — puts a gate before\ncommitting code changes. The agent waits for your feedback and addresses it,\nonly proceeding to commit the code with your express approval.\n\nWhen running Askance, it's vital to understand the security implications. It runs as a server on your machine, with no authentication system, and accepts text input which is passed directly to your agent without sanitization.\n\nWhat keeps it safe is making sure that your server is never made available to others. By default it runs bound to 127.0.0.1, meaning it can't be accessed from other machines.\n\nIf you do want to access it from another machine (your phone for example), the\nrecommended approach is to proxy that connection through `tailscale serve`\n\n,\nwhich lets you use Tailscale's authentication to control access, and adds TLS\nencryption provided by Tailscale (which is itself a requirement if you want to\nenable push notifications).\n\nWith Tailscale installed, run the following to set up a Tailscale proxy to your\nAskance server. The `--bg`\n\noption makes it persistent across reboots.\n\n```\ntailscale serve --bg 8422\n```\n\n**Note:** To receive notifications on iOS, you'll need to add the site to\nyour home screen. On Mobile Safari, tap \"...\", \"Share\", \"View More\", then\n\"Add to Home Screen\".\n\nTo check the current version, run `askance --version`\n\n.\n\n**Installed with curl:** run the install command again, which overwrites the\nbinary in place, then restart the server — `systemctl --user restart askance`\n\non Linux, or `launchctl kickstart -k gui/$(id -u)/net.tobico.askance`\n\non a Mac.\n\n**Installed from the flake:** Run `nix flake update askance`\n\nin your host\nconfiguration, then rebuild — the rebuild restarts the service for you.\n\nThe database is untouched either way, so the Archive and your phone's push\nsubscription come back with the new binary. The server also asks GitHub once a\nday whether a newer release exists, and puts a banner above the pending list\nwhen there is one; it never installs anything itself, and\n`ASKANCE_NO_UPDATE_CHECK`\n\nturns the check off.\n\nAskance can be configured by environment variables or CLI options:\n\n| Variable | CLI Option | Used by | Default | What it is |\n|---|---|---|---|---|\n`ASKANCE_SERVER` |\n`--server` |\nCLI | `http://127.0.0.1:8422` |\nBase URL the CLI submits to and waits on. |\n`ASKANCE_LISTEN` |\n`--listen` |\nserver | `127.0.0.1:8422` |\nAddress and port to bind. |\n`ASKANCE_DATABASE` |\n`--database` |\nserver | `askance.db` |\nSQLite database for Askance data. |\n`ASKANCE_NO_UPDATE_CHECK` |\n`--no-update-check` |\nserver | unset | Disables the automated daily check to GitHub to notify you of a new Askance release. |\n\n** Deployment** — running the server as a service, in\nfull: the NixOS module this flake carries, and a systemd unit for a host that\nisn't NixOS.\n\n** On your phone** —\n\n`tailscale serve`\n\n, adding the site to your\nhome screen, turning notifications on per device, and how the long waits behave\nthrough the proxy.** Development** — the dev shell, building the viewer,\nand the loop for working on Askance itself.\n\n** Releasing** — how a tag becomes the binaries the install\ncommand above fetches.\n\n** CONTEXT.md** — the project's vocabulary. Question Set, Preface,\nAnswer, Response and the rest, defined once.\n\nMIT — see [LICENSE](/tobico/askance/blob/main/LICENSE).", "url": "https://wpnews.pro/news/show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding", "canonical_source": "https://github.com/tobico/askance", "published_at": "2026-08-12 00:57:32+00:00", "updated_at": "2026-08-12 01:10:45.614184+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["Askance", "Claude Code", "tobico", "Nix", "systemd", "launchd"], "alternates": {"html": "https://wpnews.pro/news/show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding", "markdown": "https://wpnews.pro/news/show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding.md", "text": "https://wpnews.pro/news/show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding.txt", "jsonld": "https://wpnews.pro/news/show-hn-askance-a-human-in-the-loop-gui-for-agentic-coding.jsonld"}}