Set up Omnihorn with an AI agent
Updated · Also available as Markdown
Human: paste this into your coding agent
Works with Claude Code, Cursor, Codex, Copilot agent mode or any agent that can read a URL and run commands. Create the app and the API key first (the agent will ask).
Set up Omnihorn releases for this repository.
Follow the runbook at https://omnihorn.com/docs/ai.md step by step. Do not skip its stop-and-ask points.
The Omnihorn API key is in the environment variable OMNIHORN_API_KEY. If it is not set, ask me for it; never write it into a file or a commit.
When you finish, give me the checklist from the last step of the runbook.You are an AI coding agent. Your job: connect this repository to Omnihorn so that every push uploads a signed, versioned build that installed copies of the app pick up. Two things only the human can do, signing in and creating the API key, come first. Everything else is yours.
Before you start
- Never print the key, never write it to a file, never commit it. It goes only into a CI secret.
- Windows is the only shipped target. If the repository builds for macOS or Linux only, tell the human and stop.
- Only do what is listed. Do not invent Omnihorn features or flags.
The steps
Find the Windows build output
Identify the framework and the command that produces the Windows app. The upload is the folder that runs on a clean PC: the
.exeplus its DLLs and data files. Use the table below as a starting point and confirm by reading the repository’s build scripts.Check the folder is complete
Build it locally if you can. The folder must contain the executable and everything it loads at run time. A single
.exethat needs a missing DLL will install but fail to start. Do not upload source code,.pdbfiles you do not need, or secrets.Choose how releases will be uploaded
If the repository uses GitHub Actions, write a workflow (next step). For GitLab or another CI, follow the CI/CD guide’s command-line section. If there is no CI, tell the human to drag the folder into the dashboard (Builds, New build) and stop here.
Write the workflow
Create
.github/workflows/release.ymlfrom the template below. Replace the build step with the real build command and setpathto the output folder. Always keep thebranches:filter.Store the key as a repository secret
Run
gh secret set OMNIHORN_API_KEYand paste the key when prompted (or ask the human to do it under Settings, Secrets and variables, Actions). Confirm withgh secret list. Do not echo the key.Commit on a branch and push
Commit only the workflow and any build-script changes. Push to a branch that the workflow’s
branches:filter matches. Open the run and read the job summary: it lists the version, the branch and what happened to the channels.Verify the build is active
The job must finish with status
active. If it fails, use the troubleshooting guide, fix the cause, and run again. Do not retry blindly more than twice.Hand back to the human
Give the human the checklist at the end of this page. Two things remain for them: confirm which channel ships to users, and press Build installer on the app’s Installer tab (installers are built on request, not on every upload).
Where common frameworks put the Windows output
| Stack | Typical command | Typical folder to upload |
|---|---|---|
| Electron (electron-builder) | npx electron-builder --win dir | dist/win-unpacked |
| .NET (WPF, WinForms, WinUI) | dotnet publish -c Release -r win-x64 --self-contained | bin/Release/<tfm>/win-x64/publish |
| Flutter | flutter build windows --release | build/windows/x64/runner/Release |
| Qt | windeployqt next to the built .exe | The folder windeployqt filled |
| Tauri | npm run tauri build | The folder holding the built .exe and its resources |
| Go, Rust, C++ | Your release build | A folder with the .exe and any DLLs or data it needs |
Workflow template
name: "Release"
on:
push:
branches: [main, 'release/**']
jobs:
release:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
# Replace with the repository's real build; its output must end up in ./dist
- name: Build
run: echo "Replace this step with your build command"
- uses: Ivorn-Technologies/upload-build@v1
with:
api-key: ${{ secrets.OMNIHORN_API_KEY }}
path: ./dist
# Optional: also assign the build to an existing channel once it is active.
# channel: productionVersion: by default Omnihorn reuses the last base version and appends its own build counter (1.4.0+build.42). To set it from a tag, see the CI/CD guide.
Report back with this checklist
- Which folder is uploaded, and the command that produces it.
- The workflow file path, and that
OMNIHORN_API_KEYexists as a repository secret (name only, never the value). - The run URL and the build’s version and status from the job summary.
- What the human still has to do: confirm the shipping channel (Channels tab,
productionby default) and press Build installer (Installer tab).
If it fails
| You see | Do this |
|---|---|
The API key was refused | The secret is empty, mistyped or revoked. Ask the human for a new key and update the secret. |
Storage limit reached | The plan’s storage is full. Tell the human; they can delete old builds or upgrade. |
| Fork or Dependabot run skipped | Expected: those runs get no secrets and are skipped with a notice. |
| Build stuck on processing | Large builds take longer to verify. Wait; check the app’s Builds tab. |
More cases are in Troubleshooting. Humans who prefer to read the full story can start at the quickstart.
›Can an AI agent create the Omnihorn account and API key itself?
No. Sign-in is a one-time link sent to the human’s email, and API keys are created by a signed-in user in the dashboard. The agent asks the human for the key and does the rest.
›Does the agent build the Windows installer?
No. The agent uploads the app’s build. The installer is built on request from the app’s Installer tab, which the human triggers once.
Prefer to do it yourself? Follow the human guide.