Amirhossein Hosseinpouramirhp
CV
Service · Web, macOS, browser, Telegram

Applications

Small on purpose, and each one solves a single problem.

Web applications and PWAs in React and Node, native macOS utilities in Swift, browser extensions for Chrome, Firefox and Safari, and Telegram Mini Apps. Most of mine started as problems I had myself, which is why they are small, and why they are finished.

Tell me what you need built See what has shipped

Four platforms, with shipped work on each

What already runs on each, from my own open-source label and from Pigment Dev.

Web and PWA

React, Node, Express, PostgreSQL

  • HesabyarAn accounting PWA inside shared cPanel limits
  • Client Hub A client portal as a React web app
  • StoryTypeStyled text to a transparent PNG, in the browser
  • PigmodoroA Pomodoro timer as a PWA

macOS

Swift, SwiftUI, Combine

  • TunnelGuard Domain-level VPN split tunneling
  • SlipnetA GUI for a DNS-tunneling VPN client
  • BDMA download manager, with its own browser extensions
  • SubStatSubscription usage in the menu bar
  • Jalali DateThe Persian date beside the Gregorian one
  • Video Thumbnail ExtractorThumbnails from video files, from Finder

Browser extensions

WebExtensions, since 2017

  • BDM for Chrome, Firefox and SafariThe browser side of the BDM download manager
  • TweeeAn X link as a bilingual reading card, with a Firefox extension
  • Firefox add-ons5 published since 2017, with a 4.6 average rating

Telegram

Mini Apps, Bot API

  • Client Hub Mini App A client's whole account, with no login
  • Uptime Mini App Fleet heatmaps and what is due next
  • aFilerA bot that downloads files from a URL and browses GitHub releases

Two builds, up close

One for the Mac and one for the web. Both started as problems I had.

macOS · Swift and SwiftUI · GPL

TunnelGuard

macOS gives you no way to exclude a specific domain from a VPN tunnel. Apple removed the kernel extension APIs that VPN clients used for split tunneling in Big Sur, and most clients still do not offer it. TunnelGuard is a native menu bar app that resolves a domain's addresses, adds bypass routes, and optionally pins DNS through the hosts file.

Version 2.0 was mostly about correctness. Users reported the menu bar freezing, which turned out to be shell commands running on the main thread; they all moved off it. The menu bar icon is now driven by a Combine publisher, so its state can never drift from reality.

The TunnelGuard page

Web · Node, Express, raw pg, React · PWA

Hesabyar

A personal accounting PWA, built inside shared cPanel constraints. The host set the rules: .cjs entry points for Node, and raw pg rather than an ORM, because Prisma will not run there.

An application can run on ordinary shared hosting, if the architecture starts from that limit instead of discovering it at deploy time.

NodeExpressPostgreSQLReactPWAcPanel

Choosing where it runs

The platform follows the people who will use it. This is how I choose.

A menu bar app
When it beats another browser tab: a tool someone reaches for many times a day on a Mac.
A PWA
When it has to open on any device, install without a store, and run on the hosting you already have.
A browser extension
When the work already happens in the browser, and the tool should meet it there.
A Telegram Mini App
When your users live in Telegram and will not install anything or remember a password.
A Cloudflare Worker
When a small edge service beats a server.
A WordPress plugin
When the site is already WordPress. That has its own page.

How a build goes

The same steps as any build I take on, with one difference: at every milestone there is something you can open and use.

  1. A short call

    Thirty minutes. You describe the problem, I tell you honestly whether I am the right person.

  2. A written scope

    What it does, what it does not, which platforms, how long, and what it costs. You approve it or we adjust it.

  3. Milestone builds

    Something you can install and use at each milestone, not a demo video. Nothing is released without your sign-off.

  4. Handover

    Documentation, a recorded walkthrough, and everything in your repository, not mine.

  5. Maintenance, if you want it

    Operating systems and browsers change every year. Monthly or on demand, optional and separate.

A good fit when

The problem is technical, the scope can be written down, and you want the person who builds it to still be reachable in a year.

Not a fit when

You need it next week, or the plan is a large app that needs a team behind it rather than one engineer.

branch main 6 active projects ↑ 113 releases services/applications.md Sari --:-- UTC+3:30 its@amirhp.com