Normalize developers navigating their own apps using only a keyboard. ⌨️
HarborClient
@harborclient.com
The free API client that keeps your work private: no accounts, no subscriptions, no lock-in. Your work in a safe harbor that you control.
imgflip.com/i/awm2pv Why use a paid app with vendor lock in when HaborClient is free, open source, self-hosted, and vendor free?
Drake Hotline Bling
A Drake Hotline Bling meme. Caption your own images or memes with our Meme Generator.
imgflip.com
A11y work shows up in the details: Clear navigation. Visible focus. Keyboard-first interaction. Readable contrast. Screen-reader-friendly structure. HarborClient takes accessibility seriously because good developer tools should include everyone. #a11y #WebAccessibility
API collections are source code. They change with your backend. They should be reviewed with your backend. They should have history. They should have branches. That's why Git isn't an export feature in HarborClient. It's part of the workflow.
Web developers: what are you using for CSS these days? - Tailwind - CSS Modules - CSS-in-JS - Sass/SCSS
HarborClient tip of the day: Use the PostRequest tab for tests like hc.test("status is 200", () => hc.response.to.have.status(200));. Results show up after the request in the response Tests tab.
How to Take Screenshots with Live Pages Capture viewport or full-page PNGs from HarborClient Live Pages—from the browser toolbar, request scripts, or plugins with hc.livePage().screenshot.
How to Take Screenshots with Live Pages
Capture viewport or full-page PNGs from HarborClient Live Pages—from the browser toolbar, request scripts, or plugins with hc.livePage().screenshot.
harborclient-blog.com
Introducing Workspaces in HarborClient Workspaces save your open request tabs plus layout, environment, and theme—so you can switch contexts in one click and pick up where you left
Introducing Workspaces in HarborClient
Workspaces save your open request tabs plus layout, environment, and theme—so you can switch contexts in one click and pick up where you left off.
harborclient-blog.com
"I wrote this code completely from scratch," I whisper to myself, rapidly closing 14 Claude tabs, an open ChatGPT window, and a GitHub repo from 2017. 😂😂
"We don't really need API-level tests, the frontend handles all the input validation." — Famous last words right before a user figures out how to bypass the UI and names themselves Robert'); DROP TABLE Students;--.
Precise. Legible. Made for repeated use. Better understood the longer you work with it. That’s the kind of craftsmanship I want HarborClient associated with.
"I just need to fire off one quick API request." Postman: "Hold on, downloading update v11.4. Also, we redesigned the entire UI again. Good luck finding the Auth tab."
What HTTP status code would you return if the request succeeded, but the server intentionally returned an older cached version of the resource?
Me: "I just need to send a quick POST request." My API Client: "Great! Please sign in, join a workspace, invite 3 friends, and sync your data to our servers." Me: Downloads HarborClient instead. 🚢
Introducing Workflows in HarborClient Record a multi-step API session in HarborClient, replay it from the sidebar, and run the same workflow headlessly from the CLI—with results you can inspect or export.
Introducing Workflows in HarborClient
Record a multi-step API session in HarborClient, replay it from the sidebar, and run the same workflow headlessly from the CLI—with results you can inspect or export.
harborclient-blog.com
REST API testing: Checking 15 different endpoints for specific HTTP status codes. GraphQL testing: Checking one endpoint that always returns 200 OK, but contains an error array long enough to be a CVS receipt.
Want to see how we're building a fully local, self-hosted API tool? We share our development journey, technical decisions, and UI deep-dives on the blog. Check it out: harborclient-blog.com 📖⚓️
HarborClient Blog
Your work in a safe harbor that you control.
harborclient-blog.com
Powerful. Hackable. Git-aware. AI-assisted. Built for debugging.
Backend developers: what language are you reaching for most? - TypeScript/JavaScript - Go - Python - C# - Java
You send a PUT request to update one field. The request succeeds. Several fields you didn’t send are now null. What probably happened? A) The endpoint treats PUT as full replacement B) CORS stripped the fields C) TLS corrupted the payload D) The response was cached
Do you agree? James O. Coplien, author of Why Most Unit Testing is Waste, one of software’s true grey beards: “Turn most unit tests into assertions.” “Throw away tests that haven’t failed in a year.” “Tests don’t improve quality: developers do.”
Import OpenCollection Files and Browse Public Collections HarborClient can import OpenCollection v1.x files and search the apis.io catalog for public Open Collections and Postman Collections to import in one click. harborclient-blog.co...
Me: sends 3 requests in 10 seconds while testing manually The API: "Whoa there, rate limit exceeded." Production app: sends 10,000 requests a second The API: "This is fine."
The UI has come a long way since I started building HarborClient🔨
How to Use Environments in HarborClient Environments let you swap request variables between dev, staging, and prod without duplicating collections—import from .env files, export for sharing, and use merge/copy down to keep them in sync.
How to Use Environments in HarborClient
Environments let you swap request variables between dev, staging, and prod without duplicating collections—import from .env files, export for sharing, and use merge/copy down to keep them in sync.…
harborclient-blog.com
Safari really looked at Internet Explorer's long, dark legacy of traumatizing web developers and said, "Hold my beer, I'm going to randomly ignore this CSS grid."
Good craftsmanship in a developer tool is rarely one giant feature. It’s the focus state that lands correctly. The shortcut that works everywhere. The error you can actually understand. The interaction you repeat 100 times without resenting it. That’s the work.
A production API occasionally returns 500. Sending the exact same request again succeeds. Logs show failures only when several requests happen simultaneously. What would you suspect first? A) Race condition or shared-state bug B) Incorrect MIME type C) CORS D) URL encoding
Backend dev: "I'll just send you the cURL command." Me: Imports cURL into Postman Postman: "Best I can do is put the entire JSON payload in the headers, delete your Auth token, and crash."
You haven't truly lived until you've spent three hours debugging an API integration just to realize you were hitting http:// instead of https://.