Show HN: Txt2plotter – True centerline vectors from Flux.2 for pen plotters

Show HN (score: 8)
Found: January 19, 2026
ID: 3088

Description

Other
Show HN: Txt2plotter – True centerline vectors from Flux.2 for pen plotters I’ve been working on a project to bridge the gap between AI generation and my AxiDraw, and I think I finally have a workflow that avoids the usual headaches.

If you’ve tried plotting AI-generated images, you probably know the struggle: generic tracing tools (like Potrace) trace the outline of a line, resulting in double-strokes that ruin the look and take twice as long to plot.

What I tried previously:

- Potrace / Inkscape Trace: Great for filled shapes, but results in "hollow" lines for line art.

- Canny Edge Detection: Often too messy; it picks up noise and creates jittery paths.

- Standard SDXL: Struggled with geometric coherence, often breaking lines or hallucinating perspective.

- A bunch of projects that claimed to be txt2svg but which produced extremely poor results, at least for pen plotting. (Chat2SVG, StarVector, OmniSVG, DeepSVG, SVG-VAE, VectorFusion, DiffSketcher, SVGDreamer, SVGDreamer++, NeuralSVG, SVGFusion, VectorWeaver, SwiftSketch, CLIPasso, CLIPDraw, InternSVG)

My Approach:

I ended up writing a Python tool that combines a few specific technologies to get a true "centerline" vector:

1. Prompt Engineering: An LLM rewrites the prompt to enforce a "Technical Drawing" style optimized for the generator.

2. Generation: I'm using Flux.2-dev (4-bit). It seems significantly better than SDXL at maintaining straight lines and coherent geometry.

3. Skeletonization: This is the key part. Instead of tracing contours, I use Lee’s Method (via scikit-image) to erode the image down to a 1-pixel wide skeleton. This recovers the actual stroke path.

4. Graph Conversion: The pixel skeleton is converted into a graph to identify nodes and edges, pruning out small artifacts/noise.

5. Optimization: Finally, I feed it into vpype to merge segments and sort the paths (TSP) so the plotter isn't jumping around constantly.

You can see the results in the examples inside the Github repo.

The project is currently quite barebones, but it produces better results than other options I've tested so I'm publishing it. I'm interested in implementing better pre/post processing, API-based generation, and identifying shapes for cross-hatching.

More from Show

Show HN: Webhook Skills – Agent skills for webhook providers and best practices

Show HN: Webhook Skills – Agent skills for webhook providers and best practices I built a collection of webhook skills because AI coding agents are surprisingly bad at webhook integrations. The generated code looks reasonable until you run it, then signature verification fails, raw body handling is wrong, or the middleware order breaks everything.<p>PostHog&#x27;s research on LLM code generation (<a href="https:&#x2F;&#x2F;posthog.com&#x2F;blog&#x2F;correct-llm-code-generation" rel="nofollow">https:&#x2F;&#x2F;posthog.com&#x2F;blog&#x2F;correct-llm-code-generation</a>) found that agents produce more reliable code when referencing known-working examples rather than reconstructing from training data. That&#x27;s the approach here.<p>`webhook-skills` is a collection of provider-specific webhook implementations and best practices guides built on the Agent Skills spec (agentskills.io):<p><pre><code> - Runnable examples (currently Express, Next.js, FastAPI, with more frameworks coming) - Signature verification with provider-specific gotchas documented - Best-practice patterns: idempotency, error handling, retry logic - 11 providers at launch (Stripe, Shopify, GitHub, OpenAI, Clerk, Paddle, others), expanding based on my needs or requests. </code></pre> Example:<p><pre><code> # list skills npx skills add hookdeck&#x2F;webhook-skills --list # install skills npx skills add hookdeck&#x2F;webhook-skills --skill stripe-webhooks --skill webhook-handler-patterns </code></pre> Works with Claude Code, Cursor, Copilot. The examples are useful even without an agent: minimal, tested handlers you can copy directly.<p>PRs welcome for new providers and frameworks. I also built an AI-powered generator that automatically creates new provider skills. Point it at webhook docs, and it researches the signature scheme, generates verification code for each framework, writes tests, and opens a PR.

Show HN: A small programming language where everything is a value

Show HN: A small programming language where everything is a value This is a hobby project of mine that I started a few years ago to learn about programming language implementation. It was created 95% without AI, although a few recent commits include code from Gemini CLI.<p>I started out following Crafting Interpreters, but gradually branched off that until I had almost nothing left in common.<p>Tech stack: Rust, Cranelift (JIT compilation), LALRPOP (parser).

Show HN: Fence – Sandbox CLI commands with network/filesystem restrictions

Show HN: Fence – Sandbox CLI commands with network/filesystem restrictions Hi HN!<p>Fence wraps any command in a sandbox that blocks network by default and restricts filesystem writes. Useful for running semi-trusted code (package installs, build scripts, unfamiliar repos) with controlled side effects, or even just blocking tools that phone home.<p>&gt; fence curl <a href="https:&#x2F;&#x2F;example.com" rel="nofollow">https:&#x2F;&#x2F;example.com</a> # -&gt; blocked<p>&gt; fence -t code -- npm install # -&gt; template with registries allowed<p>&gt; fence -m -- npm install # -&gt; monitor mode: see what gets blocked<p>One use-case is to use it with AI coding agents to reduce the risk of running agents with fewer interactive permission prompts:<p>&gt; fence -t code -- claude --dangerously-skip-permissions<p>You can import existing Claude Code permissions with `fence import --claude`.<p>Fence uses OS-native sandboxing (macOS sandbox-exec, Linux bubblewrap) + local HTTP&#x2F;SOCKS proxies for domain filtering.<p>Why I built this: I work on Tusk Drift, a system to record and replay real traffic as API tests (<a href="https:&#x2F;&#x2F;github.com&#x2F;Use-Tusk&#x2F;tusk-drift-cli" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;Use-Tusk&#x2F;tusk-drift-cli</a>). I needed a way to sandbox the service under test during replays to block localhost outbound connections (Postgres, Redis) and force the app to use mocks instead of real services. I quickly realized that this could be a general purpose tool that would also be useful as a permission manager across CLI agents.<p>Limitations: Not strong containment against malware. Proxy-based filtering requires programs to respect `HTTP_PROXY`.<p>Curious if others have run into similar needs, and happy to answer any questions!

Show HN: ccrider - Search and Resume Your Claude Code Sessions – TUI / MCP / CLI

Show HN: ccrider - Search and Resume Your Claude Code Sessions – TUI / MCP / CLI I built a tool that stores your full Claude Code history to let you easily find and resume sessions. It has TUI, CLI and MCP interfaces. It&#x27;s a single Go binary, and the session history is synced to SQLite each time you use it.<p>Default mode is the TUI with a session browser and full-text search. Once a session is selected you can browse and search within it, resume it or export to markdown.<p>The MCP server provides tools to let Claude search back through the session for pre-compact context or pull from prior sessions. I use this constantly.<p>I&#x27;ve seen elaborate continuity systems to give Claude Code access to history but this simple approach has been very effective.<p>Installation:<p>macOS: brew install neilberkman&#x2F;tap&#x2F;ccrider<p>Linux&#x2F;other: git clone <a href="https:&#x2F;&#x2F;github.com&#x2F;neilberkman&#x2F;ccrider" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;neilberkman&#x2F;ccrider</a> &amp;&amp; cd ccrider &amp;&amp; go build<p>MCP server: claude mcp add --scope user ccrider $(which ccrider) serve-mcp<p>Source: <a href="https:&#x2F;&#x2F;github.com&#x2F;neilberkman&#x2F;ccrider" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;neilberkman&#x2F;ccrider</a>

No other tools from this source yet.