[HN Gopher] Show HN: Runprompt - run .prompt files from the comm...
       ___________________________________________________________________
        
       Show HN: Runprompt - run .prompt files from the command line
        
       I built a single-file Python script that lets you run LLM prompts
       from the command line with templating, structured outputs, and the
       ability to chain prompts together.  When I discovered Google's
       Dotprompt format (frontmatter + Handlebars templates), I realized
       it was perfect for something I'd been wanting: treating prompts as
       first-class programs you can pipe together Unix-style. Google uses
       Dotprompt in Firebase Genkit and I wanted something simpler - just
       run a .prompt file directly on the command line.  Here's what it
       looks like:  --- model: anthropic/claude-sonnet-4-20250514 output:
       format: json schema: sentiment: string, positive/negative/neutral
       confidence: number, 0-1 score --- Analyze the sentiment of:
       {{STDIN}}  Running it:  cat reviews.txt | ./runprompt
       sentiment.prompt | jq '.sentiment'  The things I think are
       interesting:  * Structured output schemas: Define JSON schemas in
       the frontmatter using a simple `field: type, description` syntax.
       The LLM reliably returns valid JSON you can pipe to other tools.  *
       Prompt chaining: Pipe JSON output from one prompt as template
       variables into the next. This makes it easy to build multi-step
       agentic workflows as simple shell pipelines.  * Zero dependencies:
       It's a single Python file that uses only stdlib. Just curl it down
       and run it.  * Provider agnostic: Works with Anthropic, OpenAI,
       Google AI, and OpenRouter (which gives you access to dozens of
       models through one API key).  You can use it to automate things
       like extracting structured data from unstructured text, generating
       reports from logs, and building small agentic workflows without
       spinning up a whole framework.  Would love your feedback, and PRs
       are most welcome!
        
       Author : chr15m
       Score  : 95 points
       Date   : 2025-11-27 14:26 UTC (8 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | dymk wrote:
       | Can the base URL be overridden so I can point it at eg Ollama or
       | any other OpenAI compatible endpoint? I'd love to use this with
       | local LLMs, for the speed and privacy boost.
        
         | jedbrooke wrote:
         | https://github.com/chr15m/runprompt/blob/main/runprompt#L9
         | 
         | seems like it would be, just swap the openai url here or add a
         | new one
        
         | chr15m wrote:
         | Good idea. Will figure out a way to do this.
        
           | benatkin wrote:
           | Perhaps instead of writing an llm abstraction layer, you
           | could use a lightweight one, such as @simonw's llm.
        
           | khimaros wrote:
           | simple solution: honor OPENAI_API_BASE env var
        
       | cedws wrote:
       | Can it be made to be directly executable with a shebang line?
        
         | _joel wrote:
         | it already has one -
         | https://github.com/chr15m/runprompt/blob/main/runprompt#L1
         | 
         | If you curl/wget a script, you still need to chmod +x it. Git
         | doesn't have this issue as it retains the file metadata.
        
           | vidarh wrote:
           | I'm assuming the intent was to as if the *.prompt files could
           | have a shebang line.                  #!/bin/env runprompt
           | ---        .frontmatter...        ---                The
           | prompt.
           | 
           | Would be a lot nicer, as then you can just +x the prompt file
           | itself.
        
         | chr15m wrote:
         | That's on my TODO list for tomorrow, thanks!
        
         | leobuskin wrote:
         | /usr/local/bin/promptrun                 #!/bin/bash
         | file="$1"       model=$(sed -n '2p' "$file" | sed 's/^# \*//')
         | prompt=$(tail -n +3 "$file")       curl -s
         | https://api.anthropic.com/v1/messages \         -H "x-api-key:
         | $ANTHROPIC_API_KEY" \         -H "content-type:
         | application/json" \         -H "anthropic-version: 2023-06-01"
         | \         -d "{           \"model\": \"$model\",
         | \"max_tokens\": 1024,           \"messages\": [{\"role\":
         | \"user\", \"content\": $(echo "$prompt" | jq -Rs .)}]
         | }" | jq -r '.content[0].text'
         | 
         | hello.prompt                 #!/usr/local/bin/promptrun       #
         | claude-sonnet-4-20250514            Write a haiku about
         | terminal commands.
        
       | cootsnuck wrote:
       | This is pretty cool. I like using snippets to run little scripts
       | I have in the terminal (I use Alfred a lot on macOS). And right
       | now I just manually do LLM requests in the scripts if needed, but
       | I'd actually rather have a small library of prompts and then be
       | able to pipe inputs and outputs between different scripts. This
       | seems pretty perfect for that.
       | 
       | I wasn't aware of the whole ".prompt" format, but it makes a lot
       | of sense.
       | 
       | Very neat. These are the kinds of tools I love to see. Functional
       | and useful, not trying to be "the next big thing".
        
         | PythonicNinja wrote:
         | added some examples using runprompt in blog post:
         | 
         | "Chain Prompts Like Unix Tools with Dotprompt"
         | 
         | https://pythonic.ninja/blog/2025-11-27-dotprompt-unix-pipes/
        
       | orliesaurus wrote:
       | Why this over md files I already make and can be read by any
       | agent CLI ( Claude, Gemini, codex, etc)?
        
         | garfij wrote:
         | Do your markdown files have frontmatter configuration?
        
         | jsdwarf wrote:
         | Claude.md is an input to claude code which requires a monthly
         | plan subscription north of 15EUR / month. Same applies to
         | Gemini.md, unless you are ok that they use your prompts for
         | training Gemini. The python script works with a pay per use api
         | key.
        
       | swah wrote:
       | Thats pretty good, now lets see simonw's one...
        
       | __MatrixMan__ wrote:
       | It would be cool if there were some cache (invalidated by hand,
       | potentially distributed across many users) so we could get
       | consistent results while iterating on the later stages of the
       | pipeline.
        
         | chr15m wrote:
         | Do you mean you want responses cached to e.g. a file based on
         | the inputs?
        
         | stephenlf wrote:
         | That's a great idea. Store inputs/outputs in
         | XDG_CACHE_DIR/runprompt.sqlite
        
       | tomComb wrote:
       | Everything seems to be about agents. Glad to see a post about
       | enabling simple workflows!
        
       | oddrationale wrote:
       | Interesting! Seems there is a very similar format by Microsoft
       | called `.prompty`. Maybe I'll work on a PR to support either
       | `.prompt` or `.prompty` files.
       | 
       | https://microsoft.github.io/promptflow/how-to-guides/develop...
        
         | chr15m wrote:
         | Oh interesting. Will investigate, thanks!
        
       | stephenlf wrote:
       | Fun! I love the idea of throwing LLM calls in a bash pipe
        
       | stephenlf wrote:
       | Seeing lots of good ideas in this thread. I am taking the liberty
       | of adding them as GH issues
        
       | ltbarcly3 wrote:
       | Ooof, I guess vibecoding is only as good as the vibecoder.
        
       | journal wrote:
       | i literally vibe coded a tool like this. it supports image in,
       | audio out, and archiving.
        
       | gessha wrote:
       | Just like Linus being content with other people working on
       | solutions to common problems, I'm so happy that you made this!
       | I've had this idea for a long time but haven't had the time to
       | work on it.
        
       | Barathkanna wrote:
       | This is really clever. Dotprompt as a thin, pipe-friendly layer
       | around LLMs feels way more ergonomic than spinning up a whole
       | agent stack. The single-file + stdlib approach is a nice touch
       | too. How robust is the JSON schema enforcement when chaining
       | multiple steps?
        
       | meander_water wrote:
       | This is really cool and interesting timing, as I created
       | something similar recently - https://github.com/julio-mcdulio/pmp
       | 
       | I've been using mlflow to store my prompts, but wanted something
       | lightweight on the cli to version and manage prompts. I setup pmp
       | so you can have different storage backends (file, sqlite, mlflow
       | etc.). I wasn't aware of dotprompt, I might build that in too.
        
       ___________________________________________________________________
       (page generated 2025-11-27 23:00 UTC)