{"slug": "show-hn-omasharp-build-omarchy-apps-with-c-and-net", "title": "Show HN: Omasharp: Build Omarchy apps with C# and .NET", "summary": "Developer Luís Rudge released Omasharp, an open-source toolkit that lets developers build Omarchy desktop apps in C# and QML, installed via `dotnet new install Omasharp.Templates`. In a benchmark of Omarchy's C++ calculator omacalc against a C# port, the Omasharp version reached a window in 593 ms versus 618 ms for the C++ app, used 77.8 MB of memory (PSS) versus 74.6 MB, and matched 3 idle wake-ups per second, with neither requiring .NET to run. Omasharp targets Linux x64 with Omarchy 4 (Hyprland, Qt 6.7 or newer), ships an agent skill in `.agents/skills/omasharp/` so coding agents can build, check and install apps, and is not affiliated with Omarchy or Basecamp.", "body_md": "Build Omarchy apps in C# and QML that start as fast as Omarchy's own C++ apps.\n\n```\ndotnet new install Omasharp.Templates\ndotnet new omarchy-app -n Tally\n```\n\nYou edit two files. `Backend.cs` holds the logic and `Main.qml` holds the UI. `dotnet publish` compiles the C# to native code and pairs it with a small Qt host. The app runs on the Qt that Omarchy already ships, so nobody needs .NET installed to run it.\n\nAdd `--kind panel` to make an omarchy-shell panel instead. The same `Backend.cs` then runs in its own process, so a crash in your code can't take the shell down.\n\nEvery app also gets an agent skill in `.agents/skills/omasharp/`. Coding agents read it to learn how to build, check and install the app.\n\nOmasharp runs on Linux x64 with Omarchy 4 (Hyprland, Qt 6.7 or newer). It isn't affiliated with Omarchy or Basecamp.\n\nC++ and qmake are fine for small Omarchy utilities. C# pays off when an app has real logic. You get NuGet, async I/O, memory safety and compiler errors that agents can act on. The usual price is a slow start and a lot of memory. Omasharp apps don't pay it.\n\nHere's Omarchy's calculator, omacalc, next to the same calculator ported to C# with Omasharp. The numbers are medians of 7 interleaved runs ([full results](https://github.com/luisrudge/omasharp/blob/main/examples/omacalc)).\n\n|  | omacalc (C++) | Omasharp (C#) | \n|---|---|---|\n| Time to window | 618 ms | 593 ms | \n| Memory (PSS) | 74.6 MB | 77.8 MB | \n| Idle wake-ups | 3/s | 3/s | \n| Needs .NET to run | no | no | \n\nApps follow the current Omarchy theme and repaint the moment you switch. QML binds to `theme.accent`, `theme.background` and every other key in the theme's `colors.toml`. C# gets the same colors from `Theme`, plus a `Changed` event.\n\n1. \nInstall the .NET SDK with `omarchy pkg add dotnet-sdk` , or from the Omarchy menu under Install › Development › .NET.\n2. \nInstall the template with `dotnet new install Omasharp.Templates` .\n3. \nCreate an app and run it: \n\n```\ndotnet new omarchy-app -n Tally            # or --kind panel; --app-id sets the app id (default: tally)\ncd Tally\ndotnet run                                 # opens it (agents check it off-screen with the skill's check.sh)\ndotnet publish -t:Install                  # installs ~/.local/bin/tally and a launcher entry\n```\n\n To share a window app, push it to GitHub and tag a version. The template's release workflow attaches the app to a GitHub release, and people install it with one command, without sudo or .NET: `curl -fsSL https://github.com/<owner>/<repo>/releases/latest/download/install.sh | sh` ([how](https://github.com/luisrudge/omasharp/blob/main/template/.agents/skills/omasharp/references/build.md#sharing-a-window-app) ).\n\nBuilding needs the SDK plus qmake6, g++ and Qt 6, which Omarchy ships. A published app needs only Qt.\n\nTo try a version that isn't released yet, build the template from source ([CONTRIBUTING.md](https://github.com/luisrudge/omasharp/blob/main/CONTRIBUTING.md#try-your-changes)).\n\nGive your agent this repo and say what you want:\n\n```\nomarchy agent prompt \"Build me a pomodoro timer for Omarchy with https://github.com/luisrudge/omasharp\"\n```\n\nThe agent offers to install a `create-omasharp-app` skill. Once it's installed, you don't need the link: \"build me an Omarchy app that …\" is enough.\n\n## Instructions for agents\n\n1. **Get the skill.** Download[https://raw.githubusercontent.com/luisrudge/omasharp/main/skills/create-omasharp-app/SKILL.md](https://raw.githubusercontent.com/luisrudge/omasharp/main/skills/create-omasharp-app/SKILL.md) . It's the`SKILL.md` of a skill named`create-omasharp-app` , with the steps for building the user's app.\n2. **Offer to install it for the user's agents.** Ask first, and say what it's for: next time, \"build me an Omarchy app\" works without this link. If they say no, go to step 3.\n  - **Where to put it.** Work out the user-level skills folder of each coding agent on this machine. Don't rely on a list from memory: agents move these folders between versions, so check what's actually here.\n    - Which agents are installed: their commands on the PATH (`claude` ,`codex` ,`pi` ,`opencode` ,`gemini` , …). On Omarchy,`omarchy default agent` prints the one the user picked.\n    - Where each reads skills from: the agent's own docs or `--help` for its current version. A skills folder in the home directory that already holds skills is good evidence too; Omarchy, for one, links its own`omarchy` skill into the folder of each agent it sets up.\n    - One folder per agent. Many agents also read the shared `~/.agents/skills` ; if an agent reads both that and its own folder, the shared one is enough (both can make it see the skill twice).\n    - If you can't tell for some agent, leave it out and say so.\n  - Which agents are installed: their commands on the PATH (\n  - **Confirm the list with the user** before writing anything: each folder, and which agent reads it. They may want fewer.\n  - **Install.** Save the file as`<folder>/create-omasharp-app/SKILL.md` in the first folder (`~/.agents/skills` if it's on the list), and link it into every other confirmed folder:`ln -sfn <that copy's folder> <folder>/create-omasharp-app` . If a different`create-omasharp-app` is already there, ask before replacing it.\n  - **Tell the user what you installed.** Some agents only pick up a new skill in a new session.\n3. **Build what the user asked for** by following the skill's steps, whether or not they installed it.\n\n- **QML sees your C# class.** Public properties and methods show up in QML as`backend.*` , and bindings update when the values change. Async methods return Promises. Records and lists arrive as JS objects, and C# can send events to QML. Changing state from a background thread is safe.[How it works](https://github.com/luisrudge/omasharp/blob/main/docs/architecture.md) .\n- **Omarchy's look.** Colors follow the theme, apps use the Omarchy font, and the app id is yours to match in Hyprland window rules.\n- **Fast custom drawing.**`Drawing` in C# and`DrawView` in QML draw charts, maps and treemaps through Qt's scene graph.\n- **A quick dev loop.** An agent edits, then runs the skill's`check.sh` : a dev build and an invisible run in about 3 s.`dotnet run` opens the app for you to look at.\n- **Mistakes fail the build.** Warnings are errors, and Omasharp's analyzers check`Backend` against what QML can use. They catch names QML can't take, members it can't see, setters that never tell it about a change, and types that can't cross over. Each error names the fix ([rules](https://github.com/luisrudge/omasharp/blob/main/analyzers/README.md) ).\n- **Checks agents can run.** The skill's`check.sh` runs the unit tests, then starts the app in a private compositor you never see. It prints every visible text, saves a screenshot and fails on QML errors.`--keys \"12{Tab}3{Enter}\"` types into the app first.\n- **The bridge is your code.** Each app gets its own copy of the bridge, like shadcn components. Change it if you need to.`dotnet build -t:UpdateBridge` brings in newer versions and keeps your changes.\n\nOne `Backend.cs` works as a window app (left) and as a panel (right):\n\n| Path | What's in it | \n|---|---|\n| `template/` | The `omarchy-app` template, exactly what a new app gets. That includes`bridge/` (the C# side, the C++ host and the build targets) and the agent skill in`.agents/skills/omasharp/` . | \n| `skills/` | `create-omasharp-app` , the skill agents install once to start new apps ([With an agent](https://github.com/luisrudge/omasharp#with-an-agent) ). | \n| `analyzers/` | `Omasharp.Analyzers` , the build-time checks every app gets ([rules](https://github.com/luisrudge/omasharp/blob/main/analyzers/README.md) ). | \n| `pack/` | Builds the `Omasharp.Templates` package. | \n| `examples/` | [hello](https://github.com/luisrudge/omasharp/blob/main/examples/hello) , one`Backend.cs` as a window app and a panel, and[omacalc](https://github.com/luisrudge/omasharp/blob/main/examples/omacalc) , Omarchy's calculator ported to C#. | \n| `scripts/` | `test.sh` runs everything CI checks.`lint.sh` checks formatting. | \n| `tools/` | Benchmark helpers for contributors. | \n| `docs/` | [How Omasharp works](https://github.com/luisrudge/omasharp/blob/main/docs/architecture.md) . | \n| `assets/` | The logo and icon. | \n\nIssues and pull requests are welcome, whether you wrote them or your agent did. Start with [CONTRIBUTING.md](https://github.com/luisrudge/omasharp/blob/main/CONTRIBUTING.md).\n\nMIT, see [LICENSE](https://github.com/luisrudge/omasharp/blob/main/LICENSE). The omacalc example keeps omacalc's MIT license and its font's OFL ([details](https://github.com/luisrudge/omasharp/blob/main/examples/omacalc/README.md#license)).", "url": "https://wpnews.pro/news/show-hn-omasharp-build-omarchy-apps-with-c-and-net", "canonical_source": "https://github.com/luisrudge/omasharp", "published_at": "2026-10-20 00:21:06+00:00", "updated_at": "2026-10-20 00:46:25.410373+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents"], "entities": ["Omasharp", "Omarchy", "C#", ".NET", "Qt", "Luís Rudge", "Basecamp", "Hyprland"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-omasharp-build-omarchy-apps-with-c-and-net", "markdown": "https://wpnews.pro/news/show-hn-omasharp-build-omarchy-apps-with-c-and-net.md", "text": "https://wpnews.pro/news/show-hn-omasharp-build-omarchy-apps-with-c-and-net.txt", "jsonld": "https://wpnews.pro/news/show-hn-omasharp-build-omarchy-apps-with-c-and-net.jsonld"}}