Cross-platform desktop HTTP client built with .NET 10, Avalonia 12, and SQLite.
Click the image above or download docs/demo.mp4 to watch the demo.
Main window – send a request and inspect the response.
Environment panel – define reusable variables and apply them across requests.
Preview tab – verify the exact request sent after resolving variables from the active environment.
Scheduled jobs – run any saved request on a repeating interval in the background.
Per-request redirect overrides – manual and scheduled requests can enable or disable redirect following independently of the global default.
Arbor.HttpClient.slnx(SLNX solution at repo root)src/Arbor.HttpClient.Core- UI-agnostic business logic for sending requests and storing historysrc/Arbor.HttpClient.Storage.Sqlite- SQLite implementation of request history storagesrc/Arbor.HttpClient.Desktop- Avalonia desktop UI app (Windows/Linux/macOS)src/Arbor.HttpClient.Core.Tests- xUnit + AwesomeAssertions unit testssrc/Arbor.HttpClient.Storage.Sqlite.Tests- xUnit unit tests for the SQLite storage layersrc/Arbor.HttpClient.Desktop.E2E.Tests- headless UI automation testssrc/Arbor.HttpClient.Testing- shared in-memory test doubles and fakes for use across test projects
docs/architecture/clean-feature-separation.md— current architecture assessment, findings, and ordered next steps for feature isolationdocs/vocabulary.md— shared vocabulary for codebase concepts and where they appear in the implementation
docs/coverage.md— code coverage status, CI integration, and local report generation (see that file for current numbers)- Coverage reports are generated automatically in every CI build
dotnet run --project src/Arbor.HttpClient.Desktop/Arbor.HttpClient.Desktop.csprojdotnet test Arbor.HttpClient.slnxAll test projects use xunit.v3:
| Project | Framework | Runner | Notes |
|---|---|---|---|
Arbor.HttpClient.Core.Tests |
xunit.v3 | Microsoft Testing Platform (MTP) | In-process execution |
Arbor.HttpClient.Storage.Sqlite.Tests |
xunit.v3 | Microsoft Testing Platform (MTP) | In-process execution |
Arbor.HttpClient.Core.Integration.Tests |
xunit.v3 | Microsoft Testing Platform (MTP) | In-process execution |
Arbor.HttpClient.Desktop.E2E.Tests |
xunit.v3 | Microsoft Testing Platform (MTP) | Uses Avalonia.Headless.XUnit and assembly-level Avalonia test setup |
Variables let you reuse values across requests without hard-coding them.
They are referenced with double curly braces: {{variableName}}.
-
Click Environments in the top toolbar.
-
Click + New Environment.
-
Enter an environment name (e.g.
DevelopmentorProduction). -
In the Environments dock panel, click + Add Variable and fill in key/value pairs.
-
Use the Active checkbox per variable to include/exclude it.
Name Example value baseUrlhttp://localhost:5000tokenmy-secret-api-tokenapiVersionv2 -
Changes are saved automatically when you finish editing.
-
Use Export JSON in the Environments panel to export environments in a portable JSON format.
Select the environment from the Env: dropdown in the top toolbar.
Every subsequent request will resolve variables using that environment's values.
Use {{variableName}} in the URL, request body, header key/value, and query key/value:
URL
{{baseUrl}}/get?version={{apiVersion}}
Request body (JSON)
{
"auth": "{{token}}",
"version": "{{apiVersion}}"
}Header value
Authorization: Bearer {{token}}
If a variable name has no match in the active environment, the {{token}} placeholder is replaced with an empty string.
Use the env: prefix to insert a value from the system (process) environment variables:
{{env:SomeVariable}}
For example, if the HOME environment variable is /home/alice, then:
{{env:HOME}}/config
resolves to /home/alice/config.
Autocomplete — when you type {{env: in the URL bar or request body, a drop-down lists the available system environment variables. Start typing the name to filter the list.
Syntax coloring — {{env: tokens use three distinct colors:
{{/}}— bracket color (amber)env:— prefix color (teal) — distinct from regular variablesSomeVariable— name color (violet)
If a system environment variable is not set, the token is replaced with an empty string.
Use the c: prefix for computed timestamp values:
{{c:TimeStampLocal}}
{{c:TimeStampUtc}}
{{c:TimeStampLocal:yyyyMMdd}}
{{c:TimeStampUtc:yyyyMMddHHmmss}}
TimeStampLocaluses the current local timestamp.TimeStampUtcuses the current UTC timestamp.- The date/time format part is optional and defaults to
o(ISO 8601 round-trip format). - If the format is invalid, the token resolves to
invalidTimeStampFormat.
env:andc:are reserved token prefixes. Tokens like{{env:...}}and{{c:...}}are always treated as system/computed tokens (not user-defined environment-variable names).
If you define a variable namedc:TimeStampUtcorenv:HOME,{{c:TimeStampUtc}}/{{env:HOME}}still resolve using computed/system logic, not that user-defined value.
Any request can be scheduled to run automatically in the background:
- Switch to the Scheduled tab in the left panel.
- Click + Add Job and fill in:
- Job name – a friendly label for the log.
- Method / URL – same fields as a normal request (variables are supported).
- Body – optional request body.
- Interval (seconds) – how often the request fires.
- Auto-start – tick this to have the job start automatically when the app opens.
- Follow redirects – override the global redirect behavior for this scheduled request.
- Job changes are saved automatically when you finish editing, then click ▶ Start to run the job immediately, or rely on auto-start.
- Click ■ Stop to pause a running job.
Manual requests also have their own Follow redirects checkbox in the request panel, so they can override the global Options → HTTP → Follow redirects setting on a per-request basis.
Global launch behavior can be controlled in Options → HTTP → Auto-start scheduled jobs on launch.
If this option is disabled, no scheduled jobs are auto-started at application launch even when a job has Auto-start enabled.
Each invocation is recorded in the live log. Open it with the 📋 Logs button in the toolbar.
The following editable features now persist automatically after edits settle:
- Options (HTTP, Scheduled Jobs defaults, and Look & Feel settings)
- Environment editor (environment name and variables)
- Scheduled job editor (job fields in the Scheduled tab)
The log window (📋 Logs toolbar button) shows all application events in real time:
- Each scheduled job invocation, including HTTP status code.
- Any errors (connection failures, invalid URLs, etc.).
- Up to 1 000 events are kept in memory; older events are discarded automatically.
The theme palette and visual direction are inspired by Hoppscotch.
To regenerate the documentation screenshots locally (no display required):
./scripts/take-screenshots.shScreenshots are written to docs/screenshots/ and should be committed to the repository.
To regenerate the demo video from the latest headless screenshots (no display required):
./scripts/record-demo.shThe script requires ffmpeg and python3 in addition to the .NET 10 SDK.
It regenerates the screenshots, assembles video segments with animated text overlays, and writes docs/demo.mp4.





