GeistHaus
log in · sign up

https://yaak.app/rss.xml

rss
0 posts
Polling state
Status active
Last polled May 19, 2026 00:46 UTC
Next poll May 19, 2026 22:54 UTC
Poll interval 86400s

Posts

Agent-friendly CLI, JSON Comments, and Redirect Warnings
Show full content

This release brings JSON comment support in request bodies and an all new agent-friendly CLI, allowing tools like Claude and Codex interact with Yaak workspaces directly.

🤖 New agent-friendly CLI

The new yaak CLI lets you manage workspaces, send requests, and inspect responses from the command line. It can be used directly by you, but is primarily designed for AI agents like Claude and Codex. Simply say “use the yaak CLI to…” and it will figure out the rest.

Install it with NPM and point your favorite agent at it:

npm install -g @yaakapp/cli
Yaak CLI

Use the CLI to interact with your Yaak workspaces

The CLI connects to the same local database as the desktop app, so any changes made are reflected immediately in both directions. The best part? It’s self-describing, so agents can use it without installing any skills.

  • JSON Schemas use schema subcommands to get exact data structure
  • Structured CRUD with --json '{...}' for complete data manipulation
  • Send anything with --parallel and --fail-fast flags
  • Troubleshoot with --verbose mode for debugging

Give it a try by asking Claude or Codex something like “Scan my API routes and create a Yaak workspace with all the requests I need for manual testing.”

Check out the CLI and Agents docs to get started.

📝 Allow commenting JSON body

You can now use Cmd+/ to comment out lines in JSON request bodies instead of deleting them when you want to temporarily disable part of a payload.

This works across HTTP, WebSocket, gRPC, and the GraphQL variables editor. When Yaak sends the request, it strips comments and removes trailing commas left behind by commented lines.

Commented JSON request body

Comment out part of a JSON body without deleting it

If you need to send the body exactly as written, disable Automatically Fix JSON in the editor. With that off, linting becomes strict again and Yaak stops rewriting the payload before sending it.

See also: feedback , #419

⚠️ Warn on HTTP redirects

Redirects can change a request in ways that are easy to miss, especially when a body or headers are dropped on the way to the final URL.

Yaak now shows a warning badge in the response pane when that happens. The timeline also includes the dropped header and body details so you can see which redirect caused the change.

Redirect warning badge in the response pane

See when a redirect dropped request data before the final response

This makes it easier to tell whether a failed request is caused by the destination server or by redirect handling before the final hop.

See also: #418

Other fixes and improvements🛠️ Fixed
  • Fix macOS Tahoe stoplight positioning and build on macOS 26
  • 🧩 Deduplicate plugins caused by CLI usage(#414 )
  • 📋 Fix Copy as gRPCurl with template-tag payloads(feedback , #413 )
  • Fix request descriptions after OpenAPI import(feedback , #412 )
  • Preserve drive letter in Windows plugin paths(#410 )
  • Fix “Send All” folder action(feedback , #405 )
  • Fix request chaining for more than two dependencies
  • Fix NTLM challenge parsing when WWW-Authenticate has Negotiate first(feedback , #402 )
  • Fix plugin settings layout
💄 Improved
  • Comment-preserving GraphQL formatting
  • Better external OAuth callback format
  • Detect CLI availability and add command palette copy action
/changelog/2026.3.0
Git diff viewer, OAuth2 in external browser, and code snippets
Show full content

You can now review diffs before committing with the new Git diff viewer, complete OAuth2 flows in your default browser, and generate code snippets from any HTTP request with the new httpsnippet plugin. Here’s everything that changed.

🔍 Git diff viewer and more

The Git commit dialog now includes a visual diff viewer, so you can review exactly what changed before committing.

Diff viewer in Git commit dialog

Diff viewer in the Git commit dialog

Several other Git workflow improvements ship in this release:

  • Pulling with uncommitted changes now shows a dialog prompting you to reset and pull, instead of a raw error message
  • A new “Reset Changes” menu item in the git dropdown lets you discard all uncommitted changes
  • Ahead/behind indicators (↗N ↙N) are shown next to the branch name in the git dropdown button
  • Push, Pull, and Commit menu items are disabled when not applicable

See also: #374

🌐 OAuth2 in external browser

OAuth2 authorization (authorization code and implicit grants) can now be completed in an external browser instead of the embedded webview. This is useful when OAuth providers block embedded browsers or when you need access to existing browser sessions.

External browser OAuth2 settings

External browser checkbox in OAuth2 settings

Enable the “Use External Browser” checkbox in the OAuth2 settings to open the authorization URL in your default browser. Two callback modes are available:

  • Hosted Redirect (default) uses a Yaak-hosted endpoint (oauth.yaak.app) as an intermediary that forwards the redirect back to Yaak
  • Localhost starts a local callback server on a configurable port (default 8765) for direct callback

A computed Redirect URI is displayed in the form so you know exactly which URI to register with your OAuth provider. A 5-minute timeout automatically cleans up the callback server if no response is received.

See also: feedback , #375

📋 HTTP snippet plugin

The new HTTP Snippet plugin lets you generate code snippets from any HTTP request. Select a language and library, and get a ready-to-use code snippet for your request.

Code snippet generation

Generate code snippets from HTTP requests

Supported languages include JavaScript (fetch, axios, jQuery), Python (requests, http.client), Go, Ruby, PHP, cURL, and many more via the httpsnippet library.

This plugin also uses the new dynamic() support in the prompt.form() plugin API, which allows form fields to update reactively when values change. For example, selecting a different language automatically updates the available libraries and regenerates the code preview.

Other fixes and improvements🎁 New
  • Pulling with uncommitted changes shows a dialog to reset and pull
  • New “Reset Changes” menu item in the git dropdown
  • Ahead/behind indicators in the git dropdown button
  • “Copy from Folder/Workspace” action for authentication config
  • Add dynamic() support to prompt.form() plugin API(#386 )
  • Add delete folder and copy id actions to folder settings(#380 )
🛠️ Fixed
  • Fix implicit grant not respecting the Response Type dropdown
  • Fix dynamic auth form becoming unresponsive after first request
  • Fix x64 macOS build bundling wrong architecture binaries
  • Timeline debug view shows URL query parameters(feedback , #373 )
  • Fix basic auth failing when password field is empty or unset(feedback )
  • Fix template tag theme colors
  • Fix redirect behavior on cross-origin redirects(feedback , #378 )
  • Fix passing down onClose properly for SSE streams(#376 )
  • Fix request cancellation before the request is sent
  • Fix text input autocomplete not working with completionOptions(#368 )
  • Don’t select current request by default for response chaining
  • Fix CSV responses ignoring raw view mode
  • Fix curl requests not getting parsed properly(feedback , #387 )
💄 Improved
  • Push, Pull, and Commit menu items disabled when not applicable
  • Graceful OAuth server shutdown
  • Add breadcrumbs to folder settings dialog(#296 )
  • More reliable plugin runtime kill
  • Use “send” preview mode for copy-as-curl
  • Cleaned up unused functions(#382 )
/changelog/2026.2.0
Yaak: A Local-First, Open Source Insomnia Alternative (2026)
Show full content

In 2014, I created Insomnia because existing API tools were bloated and hard to use. It grew organically to thousands of users as a side project before becoming my full-time job. After five years and $20k/month in revenue, I was burnt out. I accepted an acquisition offer in 2019 as a way to move on to the next chapter of my career.

Over time, Insomnia drifted from my original vision. The fun and powerful app I’d built turned into a do-it-all tool, prioritizing growth and enterprise above its users. Changes like forcing users to have a cloud account were not taken well by the community.

Yaak logo

Yaak is the best Insomnia alternative if you want a local-first, Git-friendly API client that's a joy to use.

Download Yaak 🦬 Introducing Yaak

After stepping away from Kong and spending time at Railway, I was in need of another API client. Every other app left something to be desired. I wanted an open-source, fast, and easy to use app that was still powerful enough to do everything. Yaak is the result of rethinking the API client using everything I’d learned from building Insomnia.

Yaak Screenshot

Yaak is a clean and modern desktop app

🔐 Plain files with encryption

One of the biggest lessons from Insomnia’s history how much developers care about data ownership. Yaak stores everything locally on the filesystem. No cloud sync, no mandatory account, no telemetry. Workspaces, environments, and secrets stay on your machine unless you explicitly choose to share them, either through data export or Yaak’s built-in Git sync.

  • No account required to use the app
  • No cloud dependency for any core functionality
  • No telemetry for data collection or tracking
  • Secrets encrypted using your OS keychain
  • Sensitive values obscured by default in the UI
Secure template function

Using the secure(...) function within a header value

🧩 Git-friendly and extensible

Yaak can store workspaces as plain files on disk, making it straightforward to sync workspaces with DropBox, or version control with Git using the built-in Git integration.

Git commit dialog

Confirmation for when changed files will modify or delete data

Beyond Git, Yaak’s plugin system supports custom authentication flows, template functions, themes, and data importers, including an Insomnia importer to make the switch easy.

  • Install community plugins from the plugin directory
  • Write plugins as simple TypeScript modules
  • Import existing Insomnia collections directly
💜 Indie and open source

Having been on both sides—indie developer and acquisition—the difference in incentives is real. Yaak is fully open source and independently funded, which means product decisions are driven by the things developers actually need.

  • Fully open source with a transparent, auditable codebase
  • Funded by the community for aligned incentives
  • Guided by users public feedback
🎁 Try Yaak: A Developer-First Insomnia Alternative

Insomnia served me well for years, but its enterprise direction has left developers feeling left behind. For a focused, local-first API client that puts developers first, Yaak is a strong fit.

Yaak logo

Import your Insomnia collections into Yaak and get back to building.

Download Yaak
/blog/insomnia-alternative
Request Debugging, Customizable Hotkeys, and 30 New Themes
Show full content

This is one of the biggest updates since Yaak’s launch. The HTTP layer has been completely rewritten to give you full visibility into redirects, headers, cookies, and compression—the most requested feature with 157 votes.

Also shipping: configurable keyboard shortcuts, reorderable tabs, 30+ VSCode themes, and an experimental MCP Server plugin for AI integrations.

🔬 Debug Redirects, Headers, Cookies, and More!!!

This was the most upvoted feedback item (157 votes). You can now view the entire request/response flow in plain text, similar to curl -v.

The HTTP layer has been rewritten to handle redirects, compression, and cookies inside Yaak instead of delegating to the underlying HTTP library. This means Yaak now tracks the full request lifecycle.

Request headers & body

Request headers are now captured and stored, so you can see exactly what Yaak sent.

Request headers

Request headers shown in the response pane

The request body is also visible in the UI.

Request body

Request body shown in the response pane

Timeline tab

The new Timeline tab shows request and response headers in collapsible sections, including the full redirect chain. Think curl -v but in a GUI.

Timeline Tab

View full HTTP transaction in the response Timeline tab

Cookies tab

The Cookies tab shows both sent and received cookies with detailed attributes (domain, path, expires, secure, httpOnly, sameSite). Sent cookies appear in pink, received in teal. Deleted cookies (Max-Age=0 or expired) are visually marked.

Cookies tab

Cookies tab showing sent and received cookies

DNS timings and resolution overrides

The Timeline tab now includes DNS resolution timing, so you can see how long DNS lookups take.

DNS timings

DNS resolution timing in the Timeline tab

You can also configure custom DNS resolution overrides in workspace settings to map hostnames to specific IP addresses.

DNS overrides

Configure DNS resolution overrides in workspace settings

Compression support

Compression is now handled internally instead of by the HTTP library, so Yaak can show both compressed and decompressed sizes in the response. This update also adds zstd support.

See also: feedback

⌨️ Configurable keyboard shortcuts

You can now customize keyboard shortcuts in Settings → Keyboard Shortcuts. The editor autocomplete trigger is also configurable.

Keyboard shortcuts settings

See also: feedback , #343

🔀 Reorderable tabs with persistence

Tabs can now be dragged to reorder them. Your arrangement persists across sessions.

Reorderable tabs

Drag tabs to reorder them

See also: #347

🎨 VSCode themes plugin with 30+ themes

This release adds 30+ popular VSCode themes including Dracula, One Dark Pro, Solarized, Monokai, and GitHub’s themes.

VSCode themes in Yaak

Choose from 30+ popular themes

See also: #336

🤖 MCP Server Plugin for AI integrations

The MCP Server plugin exposes your API workspace to AI assistants like Claude Desktop. It provides tools for creating, viewing, and sending HTTP requests—even supporting multiple windows.

The MCP plugin is still experimental so expect it to evolve and change over time.

Get started by installing the official Yaak MCP Server Plugin and following the documentation to configure it with Claude (or other apps).

MCP Server plugin

Sending requests with the MCP plugin

See also: #335

🔌 Disable plugins (including bundled ones)

You can now disable any plugin, including the bundled ones. Disabled plugins won’t load at startup.

Plugin settings with disable toggle

See also: feedback , #337

Other fixes and improvements🎁 New
  • 🍪 Add Cookies response pane tab(#346 )
  • Added zstd response compression support
  • Add configurable hotkey for editor autocomplete trigger(#350 )
  • Add support for nested sub menus(#352 )
  • Added Nord Light theme variants
  • Notify of plugin updates and add update UX(#339 )
  • Add plugin API to open URL in external browser(feedback , #340 )
  • Support for running multiple Yaak instances via git worktrees(#341 )
  • Allow dots in environment variable names(#323 )
  • Store and display request body in UI(#327 )
  • Timeline raw view and keyboard scrolling(feedback , #355 )
  • Add ctx.prompt.form() plugin API for multi-field form dialogs(#359 )
  • Add additional JWT headers input(#247 )
  • Add DNS timings and resolution overrides(#360 )
🛠️ Fixed
  • Fixed detection of protected branch push rejections(#345 )
  • Fixed cookie dialog rows persisting after deletion(#344 )
  • Preserved multiple Set-Cookie headers in responses
  • Fixed filesystem plugin installation listing
  • Fixed sidebar state updating too frequently
  • Preserved sidebar item color when showing context menu
  • Fixed cURL --data-raw multipart parsing(feedback , #331 )
  • Fixed twig grammar to ignore ${var} format(feedback , #330 )
  • Fixed cookies not persisting after HTTP requests(#328 )
  • Fixed gRPC autocomplete schema not being applied
  • Fix plugins commands not being found
  • Fix HeadersEditor padding when no inherited headers
  • Fix gRPC schema refresh not invalidating cache
  • Fix authentication actions being called with unrendered args
  • Fix clicking URL placeholder params not focusing value input
  • Fix cursor style on template tags
💄 Improved
  • Implemented custom cookie handling in HTTP transaction layer(#334 )
  • Cookies now persist across redirect chains
  • Moved default headers to workspace settings
  • Enhanced MCP server lifecycle management
  • Improved plugin error handling
  • Add 1Password caching to prevent rate limiting(#349 )
  • Add standardized EventDetailHeader component and fix EventViewer overflow
  • Show sent/received cookie counts in Cookies tab
  • Update 1Password plugin for simpler fetching and state handling(#353 )
  • Decouple core Yaak logic from Tauri(#354 )
  • Better logging for plugin timeouts
/changelog/2026.1.0
2025 Year in Review: 10x Growth
Show full content

A year ago I had just launched Yaak’s commercial-use license and was sitting at $160 MRR. It was a gamble to choose a business model that offered no actual incentive to upgrade other than good-faith compliance, but it’s been paying off. My bet was that larger organizations would purchase for legal compliance (and support) and it’s proving to be true. Multiple teams of 30+ seats have signed on!

Today, MRR sits at $1900—over 10x growth in one year—and total revenue has crossed $25,000!

Chart of MRR over the year

While the numbers are moving in the right direction, 2025 was a struggle. As always, marketing and user acquisition was the main challenge.

⏸️ Six months of flat growth

Around mid-year, active users plateaued for ~6 months. Revenue continued to climb, but nothing meaningfully accelerated growth. In hindsight, this seems to be due to two factors: API clients aren’t especially exciting right now, and teams already have deeply ingrained workflows with other tools.

Individuals clearly enjoy using Yaak, but turning that enthusiasm into team-wide adoption has proven difficult.

Here’s a quote from the survey I sent out at the beginning of the year:

The thing preventing most people from using Yaak more is the inability to convince their coworkers and friends to switch.

It seems that the only path forward is hoping early adopters become advocates and push Yaak within their companies… or by waiting for the competition to screw up.

🍀 Then Postman went down

On October 20, AWS experienced a major regional outage. Postman was unusable as a result—even for local APIs—so there were suddenly a lot of angry users looking for alternatives. Since Yaak works fully offline and can never have downtime, it was an easy sell.

I was able to capitalize on X and Hacker News with some good posts, which led to ~20k new downloads and a 6x increase in daily active users!

Postman Outage Downloads

This was a huge win. Growth has settled down again but it seems like this was the spike that’s been driving larger companies to sign on.

🚢 Shipped 11 major releases

Of course, marketing wins are nothing without a good product. I’m extremely proud of how far Yaak has come in just a couple of short years, and this pace of improvement is only going to increase.

Git and Team Workflows → Directory sync, Git compatibility, 1Password integration, encryption

Customization → Environment colors, custom fonts, colored HTTP methods, layout toggle

Plugin Ecosystem → Plugin directory, GraphQL doc explorer, Run-in-Yaak button

Core Improvements → Folder inheritance, folder variables, sidebar filtering, improved Postman imports, more template functions

See the full changelog for more details.

🌅 Reaching sustainability in 2026

My goal for 2026 is to bring Yaak to the sustainable revenue number of $10k/mo. By MRR alone that means a 10x increase. However, because subscriptions are annual, revenue is actually 3x MRR and so only a 3x increase is needed if this ratio holds true.

I still have close to 2 years of runway to do this so I’m not overly worried, but reaching this milestone would take that looming doubt off my shoulders and start thinking further into the future.

To get there, I’ll be focusing on a few core things:

Migration & onboarding → Keep reducing friction for teams switching from other tools.

Team workflows → Git integration, sharing, and more import/export control.

Plugin ecosystem → Expand APIs and community contributions to support more use cases.

Product onboarding → Improve the first-user experience, and feature discovery.

I’m super excited for 2026. This year proved to me that Yaak can work as a product in the long term. As long as growth keeps going at the same rate, 2026 is going to be the year Yaak proves itself.

Happy New Year!

~ Greg

/blog/2025-review
1Password, NTLM Auth, and Better Git Compatibility
Show full content

This release focuses on making Yaak feel more at home in real-world teams and environments: better Git integration, Windows authentication, first-class 1Password support, smarter template functions, and a big batch of UI polish.

🦾 ARM Linux and Windows support!

Before jumping into features, I’m happy to announce new native ARM builds for Linux and Windows! Head over to Downloads to get started.

Downloads page

Download the ARM installers from the Yaak websit

🔑 Access 1Password secrets

Yaak already provides end-to-end encryption for sharing secrets securely, but this still required copying secrets from 1Password or other tools. Now you can use the official 1Password template function to access secrets directly from Yaak!

1Password template function

Access secrets directly from Yaak using the 1password.item() function

This function is implemented as a bundled plugin and uses the official @1password/sdk JS package to interact securely with 1Password. The only requirement is to create a new service account from the 1Password website (Developer → Service Accounts) and copy the generated API key into Yaak.

See also: feedback

🔬 Conditionally enable authentication

It is now possible to enable authentication based on variables within the active environment. This makes it easy to interact with APIs that require authentication in production but not in development.

Conditional authentication

Enable authentication conditionally with the new “Enabled When…” option

When the new Enabled When… option is selected, an input appears where you can enter any template expression. If the expression renders to a non-empty string, authentication will be enabled. If it errors or renders to an empty string, authentication will be disabled.

See also: feedback

🪄 Header completion for request/response functions

Yaak now provides autocomplete for headers in the request.headers() and response.headers() template functions, making it easier to find the right header for any request or response. Simply start typing, or press Control+Space, to see available headers.

Header autocomplete

Header autocomplete for request.headers() and `response.headers()

💾 Prompt value persistence

The prompt.* template functions let you ask for input on every request—useful when you require a unique value each time.

This release adds the ability to persist these values across multiple requests.

Persist prompt values

You can now:

  • Expire values after a chosen time
  • Persist values per active environment
  • Persist values per request
🎋 Improved Git compatibility

This release brings a batch of improvements to working with Git:

  • Manage remotes directly in Yaak
  • Prompt to select a remote on push/pull if none exist
  • Support for HTTP remotes that require authentication
Manage git remotes

Yaak prompts to add a remote if none are configured ye

See also: feedback

⚠️ JSON body validation

Yaak now automatically lints JSON in the request body (and other fields) and displays any errors. Linting is template-aware, so you can still use template functions inside JSON.

JSON linting

JSON errors are displayed anywhere JSON is edited in Yaa

🛡️ Windows NTLM authentication

Yaak now supports Windows NTLM authentication! Not much more to say—go try it out and let me know if you run into any issues.

NTLM Auth

Configure NTLM at the request/folder/workspace leve

See also: feedback

🔼 Super-dark Triangle theme

The new Triangle theme is for those who love pure-black backgrounds—based on the Vercel dashboard.

Triangle Theme

The new Triangle theme features a pure black backgroun

👀 Show relevant arguments in template function tags

The template function plugin API now supports a new previewArgs parameter. When configured, the values of these preview arguments are displayed inside the template function tag—providing more context when scanning requests.

Function arg previews

Preview template function arguments directly in the ta

📄 Override file names for multi-part form files

When uploading multi-part files, it’s now possible to override the file name in the request body. Previously, the name was always derived from the selected file, which wasn’t always desirable.

Override file name

Override file name for multi-part form file

Other fixes and improvements🎁 New
  • Add request.body.path template function(feedback )
  • Add the ability to override file names for multi-part form files
  • 1Password template function
  • Ability to conditionally enable authentication(feedback )
  • Use host OS git binary for commit/fetch/push/pull operations(feedback )
  • Add an option to return jsonpath/xpath as an array
  • Add the ability to manage Git remotes
  • Add support for http Git remotes
  • Add prompt.* value persistence options
  • Add support for Windows NTLM authentication(feedback )
  • Add JSON linting(feedback )
  • Add the “Triangle” pure-black theme
🛠️ Fixed
  • Fix zoom-in hotkey not working(feedback )
  • Fix plugin settings pane crash
  • Fix Body editor not updating when switching between requests after Postman(feedback )
  • Fix sidebar scroll-into-view behavior
  • Fix scrollbar layout in EventStreamViewer
  • Fix GraphQL editor overwriting on request change
  • Fix focusing behavior for variables after clicking
  • Fix copy-as-curl API key auth(feedback )
💄 Improved
  • Make all table views scrollable
  • Keep autocomplete open when completing function namespaces
  • Validate template function arguments in UI and during render
  • Bail out of directory sync if the directory is deleted
  • Support gRPC Any type for reflection
  • Add platform-specific descriptions for the keychain() template function
  • Prompt for Git credentials when pushing to remotes
  • Focus request or folder in the sidebar after creation
  • Add sidebar action to focus the active request
  • Re-use HTTP connections for plugin-sent requests
  • Switch workspace settings dialog to top-aligned tabs
  • Sync setup dropdown now opens the correct tab
  • Allow taller response header values before scrolling
  • Recursively collapse during “collapse all” and fix hotkey behavior
  • fix: replace unstable from_mins with stable from_secs
  • Switch from Prettier/ESLint to BiomeJS
/changelog/2025.9.0
Sidebar Filtering, Environment Ordering, and Better Postman Imports
Show full content

This release brings the long-awaited ability to filter requests in the sidebar, plus a bunch of quality-of-life improvements that I know you’ll enjoy.

🔍 Sidebar request filtering

Let’s start with the big one. You can now quickly filter the sidebar using a simple-yet-powerful query language. This makes it much easier to navigate large workspaces, especially when you have deeply nested folder structures.

Sidebar filtering

Filter requests in the sidebar using a simple query language

Filtering works recursively, so Yaak automatically shows matching descendants and ancestors, ensuring you never lose context while searching.

See also: feedback

🌲 New environment edit sidebar tree

The environment edit dialog got an upgrade! The same sidebar tree component that was released in the last update is now being used for the environments dialog. This means you can:

  • Multi-select environments to perform actions
  • Drag-n-drop reorder environments
  • Double-click to rename
  • Navigate the sidebar with hotkeys
New sidebar tree

New environment sidebar with multi-select and reordering

Environiment colors also got an upgrade! It is now possible to assign a theme color to an environment. This means selecting “red” will automatically adapt to match whatever theme is active. (Selecting a custom color (last option) will assign a fixed color value like it used to.)

You will also be prompted to select a color during environment creation.

Environment Color Selector

New environment creation dialog with sharable and color option

📬 Import more postman auth types

The Postman importer now supports OAuth, JWT, and API key authentication. This should make it much easier to transition to Yaak if you’re looking for a faster or more secure API client.

OAuth 2

A sample OAuth 2 configuratio

📴 Opt-out of notifications

Yaak already does not include any tracking or analytics, but some of you also wanted the ability to opt out of checking for notifications. Now you can!

Phone home opt-out

Opt out of checking for notifications from Settings > Genera

Other fixes and improvements🎁 New
  • Left/right arrow support for sidebar navigation
  • Clicking a missing environment variable now creates one automatically
  • Clicking a variable now opens directly to the value input
  • Add hotkey for creating a new environment within the environment editor
  • Add API-key auth to “copy as gRPCurl”
  • Add AWS auth to “copy as Curl”
  • Add the ability to click to copy text on “Type ___ to confirm delete” dialog
  • Add the ability to disable notification check
  • Add hotkey to show context menu in sidebar (Control+Enter on macOS, or Alt+Insert)
  • Show error in app if enabling encryption fails
🛠️ Fixed
  • Curl Paste lost folder(feedback , #131 )
  • gRPC schema hangs on Inspecting Schema(feedback , #130 )
  • Allow opt-out of phoning home(feedback )
  • Error when entering encryption key(feedback )
  • Fix for floating sidebar rendering as empty(feedback )
  • JsonPath expression on text/plain(feedback )
  • Variable with empty value will cause error(feedback )
  • XML formatter breaks content(feedback )
  • Skip disabled parameters during render(feedback )
  • Fix missing environment context menu items(feedback )
  • Fix for dragging items past a folder that was just expanded(feedback )
  • Moving folders selected with Shift results in folders unpacking(feedback )
  • Copy as curl including disabled auth(feedback )
  • Change websocket connect from localhost to 127.0.0.1(feedback )
  • Remove duplicated “Create Folder” in command palette actions
  • Fix double-click to reset sidebar size
  • Fix indent guide alignment
  • Shift-selecting items no longer include collapsed folder children
💄 Improved
  • Handle GraphQL bodies in curl export(feedback )
  • Request/folder sometimes don’t update(feedback )
  • Colorized HTTP methods within method dropdown(feedback )
  • Show cursor in response panel(feedback )
  • Show full request paths in command palette(feedback )
  • Append unique name suffix when duplicating items
  • The “Rename” context menu action now renames inline
  • Allow selecting theme colors for each environment
  • Reduce the default font size setting
  • Change response history dropdown icon to a clock
  • Skip disabled headers and parameters during render
  • Allow specifying time for timestamp.* functions(#283 )
  • Fix text on plugin installation button(#284 )
  • Fix websocket url parameters not parsing variables(#281 )
  • Import Insomnia query parameters(#290 )
  • Fix dismissable banner action button title(#273 )
/changelog/2025.8.0
Yaak: A Fast, Pluggable, and Secure Bruno Alternative (2025)
Show full content

Bruno launched in 2022, but got its break in 2023 when Insomnia forced its users to sign up for a cloud account. Bruno’s plain-text file format and ability to integrate with Git made it a safe choice for developers looking for a local-first API client.

Yaak logo

Yaak is the best Bruno alternative if you're looking for a polished, secure, and extensible API client.

Download Yaak

Bruno continues to be a popular choice for developers, but there are a few key reasons to consider alternatives.

🦬 Introducing Yaak

Bruno and Yaak share a similar mission: bring back fast, local-first API tools that work with Git. Where Yaak differs is in its focus on performance, customization, and overall experience. It’s a joy to use.

Yaak Screenshot

Yaak is a clean and modern desktop app

🚀 Fast and polished

Yaak is built using Rust and React. It opens instantly, handles large workspaces with ease, and feels more native than other API clients.

  • Launches in milliseconds
  • Lightweight memory footprint
  • Zero lag for common interactions

Yaak just feels better is difficult to convey, so here’s a demo of Yaak’s multi-select sidebar—one of many examples of Yaak getting the fundamentals right.

It’s details like this that make Yaak stand apart from Bruno.

🔒 Security that scales with you

Since working with APIs often requires sending sensitive secrets for things like authentication, security is a top priority for Yaak.

  • App data never leaves your computer (unless you share explicitly)
  • Secrets can be encrypted using your OS keychain
  • Sensitive values are obscured by default
  • No telemetry, error tracking, or other analytics included

In Yaak, secrets can optionally be encrypted using your OS keychain, keeping things safe, but also allowing secure sharing of workspaces using Yaak’s Git integration.

Secure template function

Using the secure(...) function within a header value

Then, use Yaak’s built-in Git integration to securely share workspaces with your team.

Git commit dialog

Confirmation for when changed files will modify or delete data

🧩 Extensible via plugins

Yaak is built from the ground up to be extensible. In fact, much of Yaak’s functionality is already powered by its plugin system, including template functions, authentication, themes, and data importers (Postman, etc).

  • Install community plugins from the plugin directory.
  • Write plugins as simple TypeScript modules
  • Extend Yaak to suit your needs

This makes Yaak more adaptable for advanced use cases like internal APIs, advanced workflows, and custom authentication.

💜 Indie and open source

Yaak is fully open source whereas Bruno is “open core” and does not share the source of its premium features. This is crucial for large companies who want to run security audits on the software they use.

As an indie, I’m able to focus on performance, privacy, and long-term sustainability, without pressure from VCs or large payroll requirements.

  • No signup required, no telemetry, and no cloud lock-in
  • Fully open source with a transparent, auditable codebase
  • Funded by the community for aligned incentive
  • Guided by users using public feedback

If you value developer-owned tools and want to support software that respects your workflow, Yaak is for you.

🎁 Try Yaak: A Developer-First Bruno Alternative

Bruno is becoming more and more popular, and for many good reasons, but if you’re looking for a premium-feeling, secure, and extensible API client, Yaak is the way to go.

Yaak logo

Yaak is the best Bruno alternative if you're looking for a polished, secure, and extensible API client.

Download Yaak
/blog/bruno-alternative
Superpowered Sidebar, AWS Auth, and Postman Environment Import
Show full content

If you found Yaak during the recent Postman outage, hello! 👋

A bunch of you asked to be able to import Postman environments, so you can now do that in this release.

Along with that, there’s a brand-new multi-select sidebar, TTL for request chaining, AWS v4 authentication, and a bunch more goodies. 🎁

✨ All new multi-select sidebar

It looks mostly the same, but under the hood it’s rebuilt from scratch to support multi-select for re-ordering and context menu actions. You can also now drag items into closed folders (finally 🎉).

See also: feedback

📬 Import Postman environments

You can now import Postman environments into your currently active Yaak workspace.

Import Postman environment

Confirmation dialog for importing Postman environment

See also: feedback

📼 Drop files onto any file input

You can now drag-n-drop files into any “Select File” input within Yaak, so you don’t have to go hunting for files in the file explorer.

🔄 Add expiry to chained requests

Request Chaining now supports a new “When Expired” behavior that allows you to resend the dependent request when the response is older than n seconds.

Request chaining

Setting a TTL of 3 seconds in a request chain

See also: feedback

🔐 AWS Signature v4 Authentication

It’s now possible to use AWS Signature v4 Authentication for any request, for usage with APIs like S3.

AWS Authentication

Fetching a private S3 file via Yaa

See also: feedback

🕵🏼‍♂️ Bracket matching in code editors

Yaak now automatically highlights matching brackets in code editors. Simple. Useful. That’s Yaak.

Bracket matching

Matched brackets are underlined by defaul

Other fixes and improvements🎁 New
  • Drag files onto any “Select File” input button
  • Template function plugins can now specify dynamic args
  • Add ability to select fs.readFile encoding(#267 )
🛠️ Fixed
  • Fix GraphQL doc explorer CountBadge stacking order(#262 )
💄 Improved
  • Plugins tab is now scrollable
  • Reduce startup time
  • Pass previous app version to notification endpoint
  • Improved OAuth redirect URL matching(#261 )
/changelog/2025.7.0
Using Yaak at Work
Show full content
Table of Contents

Yaak is a local-first API client that focuses on security, ease of use, and collaboration (using Git). Thousands of developers trust Yaak every day to interact with APIs securely, without sending any data to the cloud.

If you’re evaluating Yaak for your company or team, this page covers everything you need to know about how it fits into professional environments—from pricing to privacy and compliance.

Summary Price See pricing License model Annual per-user license required for commercial use Storage 100% local. No cloud accounts or data sync Codebase Fully open source on GitHub Platforms macOS, Windows, Linux Support Private email support 🔐 Secure and private by design

Unlike other API clients, Yaak runs fully offline, stores data locally, includes no telemetry or 3rd-party tracking libraries, and is 100% open source, making it easy to reason about security and compliance.

  • Privacy: App data is stored locally. No cloud accounts. No telemetry.
  • Security: Local data. Optionally, encrypt secrets for secure collaboration.
  • Code transparency: 100% open source and auditable.
  • Predictable cost: Simple annual pricing, no surprise cloud fees.
  • Fast onboarding: Import from Postman, Insomnia, and other tools.
  • Developer friendly: Lightweight, Git-friendly, and built for real workflows.
👥 Built for collaboration

Yaak can optionally sync requests and environments to a folder on your local machine, which enables collaboration via its built-in Git integration.

Changed files confirmation

Modified/deleted filesystem changes will show a confirmation

Yaak also supports encrypting secrets with your OS keychain, so you can safely check in your entire workspace, including environment variables.

Secure template function

Using the secure(...) function within a header value

🧩 Deployment & IT Compatibility

Yaak is a desktop application with no servers, agents, or background daemons required. It runs entirely within your company’s network perimeter and requires no outbound connections.

  • No external dependencies, works offline once installed.
  • No administrator privileges required to run.
  • Automatic updates can be disabled for controlled environments.
  • Compatible with MDM tools for silent installs and version pinning.
🧾 Licensing and Team Management

Team administrators can manage seats and billing from the Yaak dashboard.

  • Add or remove team members anytime.
  • Invite users in bulk, by email.
  • Inactive members do not take up a seat.
  • Up to 3 devices per seat
🛡️ Security overview

Yaak’s security model is intentionally simple:

  • Data residency: All data is stored locally on the user’s machine.
  • Encryption: Secrets and tokens can be securely encrypted using the OS keychain (macOS Keychain, Windows Credential Vault, or Linux Secret Service).
  • No telemetry: Yaak never transmits workspace data unless you choose to share it via Git or export it manually.
  • Transparency: Full source code is public for audit and review.
📊 Comparison to other tools Feature Postman Insomnia Yaak Local-first ❌ ⚪️ Partial ✅ Git integration ✅ ✅ ✅ Cloud sync ✅ ✅ ❌ Encrypted secrets ⚪️ Partial ⚪️ Partial ✅ Open source ❌ ⚪️ Core only ✅ Offline mode ⚪️ Limited ⚪️ Limited ✅ 💁🏼‍♂️ Common questions

Can we use Yaak for free?
A license is required to use Yaak for commercial use (for work or revenue-generating activities).

Is there a trial period? A 30-day free trial is available, and is automatically activated by downloading and launching the app. Please reach out to sales@yaak.app if you need more time.

Is Yaak GDPR or SOC2 compliant?
Yaak doesn’t process or store customer data in the cloud. All data stays local,
so there are no ongoing compliance risks.

Can we self-host it?
No hosting is required. Yaak runs entirely on your local machine.

Can we pay by invoice or purchase order?
Please email sales@yaak.app to discuss purchasing options.

What happens if we stop paying?
Licenses include perpetual fallback rights so you can keep using all versions released during your active license period.

🏁 Ready to bring Yaak to your team?

Yaak is trusted by thousands of developers worldwide.
It’s local, transparent, and backed by a simple license — no vendor lock-in, no surprise bills.

📧 Contact: sales@yaak.app
🌐 Learn more: yaak.app/pricing

/blog/yaak-at-work
Folder Variables, Keychain Function, and Layout Toggle
Show full content

This release introduces folder variables, a keychain access template function for secure credential handling, and high-contrast themes to improve readability.

You’ll also find a new toggle for horizontal / vertical layout switching, along with a refreshed update experience that doesn’t interrupt your focus.

🎥 Yaak’s has a YouTube channel! Every release will also now feature a video explaining the new features.

📂 Folder environment variables

You can now create (or override) environment variables for all requests within a folder, by navigating to Folder > Settings > Variables.

Folder variables

Autocomplete displaying the source of a variable

This makes it easy to scope values like URL paths, resource IDs, and other values to all requests inside a folder, like https://api.example.com/users/${[user_id]}

See also: feedback

🔐 Keychain access template function

Yaak now ships with a keychain(...) template function that lets you pull secrets straight from your operating system’s keychain.

Keychain template function

Configuring the new keychain template function

This means you can reference credentials that are already on your system instead of duplicating them inside Yaak.

See also: feedback

🖥️ Layout direction toggle

You can now toggle between horizontal and vertical layouts by clicking on the “layout” icon in the top-right corner of the window.

Yaak previously tried to automatically select the correct layout based on window size, but it wasn’t always the desired outcome. Many of you wanted the ability to use the vertical layout at large window sizes as well. Now you can!

See also: feedback

🎨 High-contrast themes

For those needing stronger visual contrast, Yaak now includes two new high-contrast themes for both light and dark modes.

High contrast themes

New dark and light high-contrast themes

Enable the new themes by going to Settings > Themes and enabling one of the following:

  • Hight Contrast Light
  • High Contrast Dark

As a bonus, the contrast of the default light theme has also been increased.

See also: feedback

📦 New update experience

Say goodbye to the annoying “Update Available” alert that disrupts your focus, and say hello to a better-integrated update experience.

Update Notification

New in-app update notification

You’ll have to wait until the next release to actually experience it 😅

The new updater:

  • Automatically downloads updates (togglable in settings)
  • Shows a notification when an update is available
  • Shows a notification to restart the app

Restarting the app after an update is also now fixed in this release.

See also: feedback

Other fixes and improvements🎁 New🛠️ Fixed
  • Fix delete request hotkey(feedback )
  • JSONPath fails with non-ASCII(feedback , #251 )
  • Copy as Curl doesn’t use custom prefix(feedback , #253 )
  • Console.log from plugins doesn’t show(feedback )
  • Fix Typos (#255(#255 )
  • Fix SVG viewer crashing on unicode characters
  • Fixed OAuth 2 Authorization Code flow on Windows
💄 Improved
  • Improve variable autocompletion logic (eg. don’t complete currently-editing variable)
  • Workspace settings scroll now works for large descriptions
  • Always use POSIX paths for copy-as-grpcurl
  • Moved setting for personal-use badge to Settings > Interface
  • Improved design of all trial/license screens
/changelog/2025.6.0
Best Git-Friendly Postman Alternatives (Desktop, CLI, and IDE)
Show full content

Postman is the most popular desktop API client by a long shot, but it forces you to store all API requests and secrets in a proprietary cloud. Fortunately, there are local-first alternatives that allow you to back up and share requests via Git, Dropbox, or other file-based solutions.

This article will compare the best Git-friendly Postman alternatives, ranging from desktop apps to IDE and CLI-based workflows.

🦬 Yaak (Desktop)
Postman Alternative

Execute requests in a user-friendly interface

Yaak is an open-source and Git-friendly Postman alternative that runs on Mac, Windows, and Linux desktop environments.

Yaak defaults to internal local storage, but file sync can be enabled for any workspace. From there, use any file-based tool (Git, Dropbox, etc.) or the built-in Git interface to commit and track changes to requests.

As a bonus, Yaak supports built-in encryption, so you can safely commit even secrets to Git without compromising security.

  • 📦 Type: Desktop app (macOS, Windows, Linux)
  • 🟢 Pros: Fast startup, local-first, Git-friendly, supports REST, gRPC, GraphQL, and WebSockets.
  • 🟠 Cons: Newer project compared to Postman and Insomnia.
  • Best for: Devs who want a polished, Git-integrated API client without bloat.
🐶 Bruno (Desktop)
Bruno

Create and run collections in a desktop app

Bruno a cross-platform desktop app, loved for its human-editable file format. It gained popularity in 2023 after Insomnia forced users to have a cloud account —precisely the same reason people are shying away from Postman.

Bruno is the most popular open-source Postman alternative for those wanting a Postman-like workflow without cloud lock-in.

  • 📦 Type: Desktop app (macOS, Windows, Linux)
  • 🟢 Pros: Open source, simple file structure that commits well.
  • 🟠 Cons: No built-in encryption. Can be slow at times.
  • Best for: Teams that want a Postman-like experience but with file-based storage.
↔️ Hurl (Command Line)
Hurl

Execute .hurl files from the command line

Hurl provides a command-line-first approach that lets you define requests in a git-friendly text format and execute them using the hurl CLI. If you’re already familiar with other command line tools like Curl, Hurl is likely a great fit for you.

  • 📦 Type: CLI + text files
  • 🟢 Pros: Lightweight, testable, easily versioned with Git.
  • 🟠 Cons: No GUI — you’ll live in the terminal.
  • Best for: Developers who prefer scripting and automation over UI-driven API clients.
📦 JetBrains HTTP Client (IDE-based)
JetBrains HTTP Client

Execute .http files right within JetBrains IDEs

If you use IntelliJ IDEA, WebStorm, or other JetBrains IDEs, you already have a built-in HTTP client. Simply create a .http file to get started, then commit to Git.

  • 📦 Type: IDE-integrated (file-based)
  • 🟢 Pros: Always at your fingertips, Git-friendly, no extra app needed.
  • 🟠 Cons: Tied to JetBrains IDEs, lacks rich API testing features.
  • Best for: JetBrains users who want lightweight request testing without leaving their editor.
💻 VSCode Rest Client (IDE-based)
VSCode Rest Client

Execute .http files right from VSCode

VS Code users can install the REST Client extension. Like the JetBrains approach, .http files can be used to create executable API requests.

  • 📦 Type: Editor extension (file-based)
  • 🟢 Pros: Git-friendly, minimal setup, inline results.
  • 🟠 Cons: Lacks advanced features (GraphQL, gRPC, environments).
  • Best for: VS Code users who want a lightweight Git-integrated workflow.
↔️ Postman alternative comparison Tool Type Git-Friendly Open Source GUI/UX Yaak Desktop app ✅ With UI ✅ Yes ✅ Yes Bruno Desktop app ✅ With UI ✅ Yes ✅ Yes Hurl CLI ✅ Yes ✅ Yes ❌ No JetBrains HTTP IDE ✅ Yes ❌ No ⚠️ Minimal VS Code REST IDE ✅ Yes ✅ Yes ⚠️ Minimal 💁🏼‍♂️ What’s the best Postman alternative for you?

If your team already relies on Git for code, these tools are the best Postman alternatives to consider:

  • Yaak and Bruno if you want desktop apps that feel closer to Postman but are Git-native
  • Hurl if you value CLI tools and easy automated testing
  • JetBrains HTTP and VS Code REST Client if you prefer editor integration
Yaak logo

Yaak is the best Postman alternative if you're looking for a clean, local first, and Git friendly API client.

Download Yaak
/blog/git-friendly-postman-alternatives
2025 User Survey Results and The Future of Yaak
Show full content

Wow. It’s been almost two months since I’ve typed on a keyboard, and it feels good to be back. As an indie developer, sustainability is a huge priority, and vacationing is a key part of that. I spent time with family, hung out at the beach, and even built a truck camper!

Installing window

Installing a window, with some help

The first thing I did after coming back was read all 177 responses to the 2025 user survey, and I’m excited to summarize the results and share the plan for the next year or so (jump to the plan 👇🏼).

📊 2025 survey questions (1/6) How likely are you to recommend Yaak to a friend or colleague?

Users are 93% likely to recommend Yaak to someone else. This was mostly expected, as most people talking about Yaak online absolutely love it. Hopefully, it’ll increase even further as Yaak improves over time.

Previous Tool Responses 😃 5 (most likely) 121 (68%) 🙂 4 47 (27%) 😐 3 7 (4%) 🙁 2 1 (0.6%) 😫 1 (least likely) 1 (0.6%) (2/6) What tool did you come from?

The tools people migrate from are actually quite boring since they align exactly with the popularity of each. Though it is nice to see Bruno users coming over because it’s the most common choice of people getting fed up with Postman and Insomnia.

Previous Tool Responses 🧑🏼‍🚀 Postman 43.5% 👁️ Insomnia 36.2% 🐶 Bruno 12.4% 🐾 RapidAPI 4.5% 🛸 Hoppscotch 3.4% (3/6) What would you say is Yaak’s biggest advantage over other tools?

Most users agree that Yaak’s largest advantage is simplicity and intuitive UI, followed closely by its offline nature and the ability to sync requests with Git and other file-based tools. This aligns nicely with the reasons I created Yaak in the first place.

It’s open source and has no features locked behind a paywall, which every other client chooses to have.

Has streaming output for http and it doesn’t overcomplicate things by putting everything in your face

Directory Sync, I’m able to sync my data between devices using my existing file sync solution (Seafile).

Does not have a paywall like Bruno, but has the same good features

(4/6) Is there something preventing you from using Yaak for more of your work?

The thing preventing most people from using Yaak more is the inability to convince their coworkers and friends to switch. And, since word of mouth is the main growth channel, the result has been a flat active-user count for the past ~6 months.

public stats

Active users and downloads from the Public Metrics Page

Even though Yaak is able to import directly from Postman and other sources, the switching cost for this kind of tool is huge.

To help persuade more people to switch, I’ll be prioritizing:

  • Sharable resources on migrating from existing tools
  • More comparisons with other tools
  • More documentation
  • Improved import utilities

Another barrier to switching is the commercial-use license because (1) referring Yaak to a coworker requires them to spend money and (2) less frequent users find it difficult to justify the cost.

Switching to a freemium model (putting features behind a paywall) would definitely improve revenue growth. However, it would also introduce an incentive to gradually move more and more features behind the paywall over time, to juice profit. Incentives like this are exactly how enshittification happens and I want to avoid that at all costs.

I was initially planning to adopt an open source donation model, but not being able to find any other success stories besides Blender made me stick with a commercial-use license (essentially suggested donation) as the closest alternative.

Along with providing resources to help with switching, there are some missing features that should help adoption as well. All of them were already being tracked on the roadmap, so I’ve linked them here, ordered by priority.

The last thing I noticed in the responses was some users requesting features that already exist. One user even asked for variables—one of the most fundamental features of Yaak, so there’s still some work to do within the app to ensure users can discover what they don’t know.

(5/6) Have you heard anything from others about why they don’t or can’t use Yaak?

This question should have been combined with the previous one, as there’s a lot of overlap, but it was nice to hear that people are trying to convince others to use Yaak. This is a huge positive signal and something that will get easier as Yaak approaches critical mass.

(6/6) Any other feedback or comments?

Most of the open-ended feedback was filled with encouragement and kindness. Here are a few that stood out.

I hope you guys succeed

Congratulations on the good work and transparency as always

Don’t enshittify this app also

Only keep it fast, free and not add bloat features please

What to do with all this information? Well, get to work, of course. 😃

💫 Looking forward

The survey results, combined with the Feedback on the roadmap, allowed me to come up with clear priorities for the next phase of Yaak.

Keep the pricing model:
The pricing model aligns closely with my values and Yaak’s mission to be a private, open, and accessible API client. Since revenue is headed towards sustainability, the commercial-use pricing model is here to stay.

Keep the core focused:
Yaak is an API client at its core, and that won’t change. New features will only be added if they make sense for everyone, with lesser-used features remaining out of the way until needed. The survey results confirm this is Yaak’s largest advantage so it’s a priority to keep it that way.

Polish the core:
Development on Yaak has mostly been focused on checking off features, meaning Yaak is useful for a lot of use cases, but a lot of them are not as polished or complete as I’d like. Keep an eye out for upcoming improvements to core features like Git integration, data import, and general usability.

Add plugin APIs:
Yaak’s advantage is simplicity, but I don’t want to alienate those with more advanced use cases. This is why plugins exist. Similar to programming IDEs like VSCode or IntelliJ, plugins help extend the app without negatively affecting the broader user base. I’ll continue adding more APIs over time to further support more use cases.

Publish more content:
Word of mouth has been the most consistent driver of growth so far, but hard-hitting content has had a larger impact over Yaak’s lifetime. To fuel the next phase of growth, I’ll be working on sharing more interesting content (like this) while also building out documentation and resources to help drive organic traffic (SEO).

🙏🏼 Thanks for being part of the journey

Yaak has come a long way since its public launch, less than two years ago. It improves the lives of thousands of developers every single day, and the survey results prove that things are moving in the right direction.

The next phase is about continuing what’s already working—refining the core experience, adding flexibility through plugin APIs, and making it easier for new users and teams to switch.

I’m more confident than ever that Yaak will reach long-term sustainability without compromising on the values that got it this far, so keep submitting feedback, telling your friends, and publishing plugins.

See you soon 🙂

/blog/future-of-yaak
Plugin Directory, GraphQL Doc Explorer, and Run Button
Show full content

How’s that saying go? “All good features come in threes?” Never mind… 😅

Here are the three big things included in this release.

  • Official Plugin Directory
  • GraphQL Documentation Explorer
  • Embeddable Run-in-Yaak button

Plus a pile of fixes based on your feedback. Let’s dig in.

🧩 Official Plugin Directory

It was previously possible to create custom plugins for yourself, but there was no easy way to discover or share them. Now you can browse and install plugins directly from Yaak’s settings dialog!

Plugins installation view

Install community plugins from Settings → Plugins

Plugins also show up on the Plugins Directory on this website. It’s still early, so if you have an idea and want to submit your own, visit the Quick Start Guide. To learn how.

The following plugin types are currently supported:

  • Template functions
  • Custom themes
  • Authentication
  • Custom data importer
  • Request actions like “Copy as Curl”

Most plugins are only a couple dozen lines of TypeScript, and can be published in less than 5 minutes using the Yaak CLI.

See also: feedback

📖 GraphQL Documentation Explorer

You can now browse your GraphQL schema directly inside Yaak!

The GraphQL Docs Explorer makes it easy to navigate types, fields, queries, mutations, and arguments all without leaving the request tab.

It’s perfect for exploring unfamiliar APIs or refreshing your memory without having to use an external tool like GraphiQL.

Shout out to Mr0Bread for the initial implementation in #208

See also: feedback

▶️ Embeddable Run Button

You can now embed a “run button” on any web page (like your API docs) that will prompt the user to import it into Yaak when clicked.

Create your own button by visiting yaak.app/button/new.

Run in Yaak button

Clicking the button will open Yaak and prompt to import

Creating a button requires the following:

  • A friendly name (eg. Stripe API)
  • A link to an importable spec (Yaak, Postman, OpenAPI, etc.)

See also: feedback

🔐 API Key Authentication

There’s a new “API Key” authentication type to easily add an API key as a custom header or query parameter.

API key auth

Authenticate requests with an API ke

See also: feedback

Other fixes and improvements🎁 New
  • Add cancel request button in response pane(feedback )
  • Copy as gRPCurl(feedback )
  • Set gRPC include path(s)(feedback )
  • Pop-out editor for JWT payload(feedback )
  • Add timestamp.* template functions (#244(#244 )
  • Add request.param template function (#242(#242 )
  • Add regex.match and regex.replace template functions
  • Add json.minify() template function
  • Add header prefix option to bearer auth
  • Add type-text-to-confirm workspace delete
  • Ability to create theme plugins
🛠️ Fixed
  • Missing description when importing Postman(feedback )
  • Import from Postman reversed(feedback )
  • Chinese input text duplicated(feedback , #234 )
  • Inherit headers and auth when calling request actions(feedback )
  • Hide plugin errors for JSONPath/XPath input(feedback )
  • Import from curl multiple-equals(feedback )
  • Reset variable dialog on environment change(feedback )
  • Prevent response from hanging on error(feedback )
  • Cannot open sync directory(feedback )
  • YAML error missing field type(feedback )
  • Window padding wrong on fullscreen macOS(feedback )
  • Zoom hotkeys don’t use physical key location(feedback )
  • Folder may hide children during move operation(feedback )
  • No cookies for websocket requests(feedback , #245 )
  • “Authentication” misspelled in request Auth tooltip(feedback )
  • Scope OAuth 2.0 tokens to clientId/etc(feedback )
  • Fix pair editor focus when creating a new entry by clicking value
  • Fix OAuth PKCE flow not sending code challenge
  • Print table/column/value when the DB row is not found
💄 Improved
  • Use monospace font in autocomplete menu (#237(#237 )
  • Improve inherited headers preview (#238(#238 )
  • Remove --url-query (too new) from curl generate (#239(#239 )
  • Add hover effect to split-pane resizing (#240(#240 )
  • Fix padding on horizontal tabs view (#243(#243 )
  • Add more mimetypes for autocomplete (#235(#235 )
  • Improved workspace settings layout
  • Better websocket closing logic and URL parsing
  • Hide large request bodies by default to prevent a UI freeze
  • Prevent command palette from shifting when few results
  • Allow moving sidebar items to the end
/changelog/2025.5.0
Yaak: A Git-Friendly, Open Source Postman Alternative (2025)
Show full content

Postman is by far the most dominant API client on the market. Since launching in 2014, it has amassed 40 million users, thousands of employees, and hundreds of millions in VC funding.

Yaak logo

Yaak is the best Postman alternative if you're looking for a clean, local first, and Git friendly API client.

Download Yaak

Over time, Postman has shifted from a lightweight tool to a broader enterprise platform. Its wide variety of features has increased complexity, and its company nature has forced it to prioritize growth over user experience by doing things like requiring cloud accounts.

🦬 Introducing Yaak

Yaak is a local-first API client that focuses on the essentials: sending requests, working with a wide range of protocols and APIs, and getting out of your way. Built by an indie developer (hi 👋), Yaak feels snappy, intuitive, and fun.

Yaak Screenshot

Yaak is a clean and modern desktop app

🧁 The best API client. Nothing more.

Postman is much more than an API client, offering everything from API mocking to test automation and monitoring. These features are useful but each adds complexity, making Postman harder to learn and use—especially if you don’t need all that.

Yaak takes a different approach: it’s purpose-built to be the best API client, and nothing more.

  • Clean, focused UI that’s easy to learn and stays out of your way
  • Dynamic requests powered by template functions and plugins
  • Filesystem and Git integration for async collaboration
  • Fits in small windows, perfect for side-by-side dev workflows

If you need a tool to interact with APIs and/or share those requests with your team, Yaak is the perfect Postman alternative.

💜 Indie and open source

Postman is backed by hundreds of millions in venture capital. That means growth, metrics, and monetization often take priority.

“It seems that postman now forces me to store my collections and environments in the cloud”
Postman community member

Yaak is proudly independent and open source. As a solo developer, I’m able to focus on performance, privacy, and long-term sustainability, without outside pressure.

  • No signup required, no telemetry, and no cloud lock-in
  • Fully open source with a transparent, auditable codebase
  • Funded by the community for aligned incentive
  • Guided by users using public feedback

If you value developer-owned tools and want to support software that respects your workflow, Yaak is for you.

🎁 Try Yaak: A Developer-First Postman Alternative

Postman has grown into a powerful platform, but if you’re just looking for a focused API client that works the way you do, Yaak is a better fit.

Yaak logo

See for yourself what Yaak has to offer by importing your existing Postman collections today.

Download Yaak

It’s local first, open source, and thoughtfully designed for real-world developer workflows—not enterprise dashboards or growth metrics.

Whether you’re building APIs solo or collaborating with a small team, Yaak keeps things simple, flexible, and in your control.

Ready to give it a try? Download the app and start exploring

/blog/postman-alternative
Environment Colors, Custom Fonts, and Colored HTTP Methods
Show full content

While Apple was cooking up some sweet liquid glass, I’ve been tackling some design features of my own. Hopefully these will be greeted with slightly better fanfare. 🙈

🎨 Assign colors to environments

Have you ever accidentally sent some requests with the wrong active environment? We’ve all been there. To help prevent this, it’s now possible to assign a color to each environment, which will be displayed prominently in the app header.

See also: feedback

⌨️ Choose a custom font

It’s now possible to set a custom font for both the interface and editors within Yaak. The Appearance tab in settings has also been split into Theme and Interface for better organization.

Custom fonts

Choose a custom font for both interface and editors (monospace

See also: feedback

💄 Colorize HTTP methods

Along the same lines as environment colors, it’s now possible to enable colors for HTTP methods to better differentiate between safe and dangerous methods (eg. DELETE). This one is not enabled by default, so head over to Settings > Interface to give it a try if that suits your fancy.

HTTP method colors

Enable HTTP method colors from the interface setting

See also: feedback

Other fixes and improvements🎁 New
  • Enable dependency for socks5 proxies to work
  • Add the ability to bypass the network proxy
  • Add option to log extra data for OAuth 2 window navigation
  • Support id_token in OAuth 2.0(feedback )
🛠️ Fixed
  • Properly remember recent workspaces when opening in new windows
  • Fix infinite reload when using OAuth 2.0 at the workspace level
  • Fix id_token sending in OAuth
  • Properly terminate the plugin runtime yaaknode on Command+Q exit (macOS)
  • Handle reconfiguring directory sync for same Workspace(feedback )
  • Fix “Validate TLS Certificates” option for WS and
💄 Improved
  • Split Settings > Appearance tab into Theme and Interface
  • Clarify HTTP/HTTPS proxy setting meaning
  • Streaming text resets response scroll position(feedback )
  • Show error dialog if DB migration fails
  • Many large GraphQL introspection results slowed startup
  • Hide escaped / in Pretty JSON response view
  • OAuth audience not sent (#10(#10 )
  • Strip quotes when json.jsonpath(...) returns a single string
  • Don’t return undefined when json.jsonpath(...) matches nothing
/changelog/2025.4.0
Folder Inheritance, and More Template Functions
Show full content

It’s been just a week since 2025.2 release with encrypted text and sharable environments, so be sure to peep that if you missed it 👀

It’s only been a week since the last major release, but this one contains such a highly requested feature that I thought I’d ship it early: Request Inheritance.

Before we dig in, though, I’d like to give an update on Yaak’s sustainability.

💰 10% sustainability achieved!

I want to start by sharing my gratitude for those who have purchased a license for Yaak. Thank you so much! 🤗

I quit my job last May to take a second crack at building an API client. It was a huge risk, but it looks like it’s going to pay off. Yaak has been growing steadily over the past year and just hit $500 MRR, which is 10% of the way to a sustainable income.

That’s over 100 customers and almost 50k total downloads!

Stripe MRR

Chart from Stripe showing $500 MRR

We still need to 10x to reach this goal, so if you’re interested in helping out, the best things you can do are:

And with that, let’s dig into the changelog.

🫃🏼 Workspace and folder auth / headers

While going over feedback last week, I noticed a few people mention that not being able to set authentication for an entire folder was a dealbreaker—especially from those using Yaak as a Postman alternative. Reading this broke my heart, so I worked my butt off for a few days and implemented it! 🍑

Folder settings

Configure auth or headers via folder or workspace settings

Here’s a quick breakdown of how request inheritance works:

  • Configure on either workspace or folder
  • Set authentication or headers
  • View the inherited values within the request view
  • Override inherited values on individual requests

And if you need a bit more info, check out the docs on Request Inheritance

See also: feedback

📐 Functions for HMAC, cookies, UUIDs, and more

Template functions are an extremely powerful way to customize requests. You can even write your own Plugins with a few lines of TypeScript.

I’ve been wanting to fill out the list of built-in functions for a while, so I finally got around to it.

Secure input field

Access template functions from the ctrl-Space autocomplete dropdown

Here are function namespaces added in this release:

  • cookie.* for accessing the cookie jar (eg. for CSRF)
  • hmac.* for creating secure signatures
  • url.* for encoding or decoding URLs
  • uuid.* for generating UUIDs
  • hash.* for hashing strings
  • base64.* for encoding or decoding base64
  • regex.* for extracting arbitrary strings
  • xml.* for querying XPath
  • json.* for querying JsonPath and escaping

As always, let me know if there are any missing functions you’d like to see!

See also: feedback

Other fixes and improvements🎁 New
  • Add description field to plugin API input field types
🛠️ Fixed
  • Fix default GraphQL request name (#213(#213 )
💄 Improved
  • Ctrl-click automatically closes context menu(feedback )
  • Cookie jar not updated during chained requests(feedback )
  • Prevent send button from stealing url
  • Pass checkbox template function args as boolean instead of string
/changelog/2025.3.0
Encrypted Text, Sharable Environments, and Nested Functions
Show full content

It’s now possible to securely share variables and other sensitive fields via Directory / Git Sync!

Whether collaborating with a team or simply backing up your workspaces, you can REST 😉 easy knowing your secrets are safe. There are a few different features that make this possible, so let’s dig into them one by one.

🔐 Encrypted text and variables

Encryption is the main element behind sharing secrets. Without it, you’d be exposing your secrets to the world as plain-text. 🙈

The new secure(...) Template Function can be used to encrypt any portion of text within Yaak—anywhere environment variables are supported.

Secure template function

Using the secure(...) function within a header value

Encryption must be enabled for each workspace, which will generate and store an encryption key using your host OS’s keychain. Back this key up and share it with your team, as it will be necessary to access secure values on other devices.

Workspace encryption keys are encrypted using a master key stored in your OS’s keyring before being saved to Yaak’s local database.

See also: feedback

✍🏼 Secure inputs

To avoid remembering to use the secure(...) function, Yaak will use a secure input when it guesses that a value may contain sensitive text.

Fields like passwords or bearer tokens are obviously sensitive, but Yaak will also try to guess headers and other fields (eg. a header named X-Token).

Secure input field

Potentially-sensitive fields will automatically use secure inpu

🔄 Sharable environments

Environments were previously excluded from directory sync to prevent accidentally exposing sensitive values to Git or other tools. With the new encryption feature, environments can now be marked as “sharable” which will cause them to be included in data exports and directory sync.

When encryption is enabled, any variable added will automatically be encrypted, and Yaak will provide a stern warning if a public environment happens to contain unencrypted values.

Warning when a sharable environment contains unencrypted variable

See also: feedback

🪆 Nested template functions

Secure values needed to be usable within template function arguments, so I made it happen. Yaak now also supports nested template functions and variables!

It’s now possible to chain functions to do useful things like get the hash of a password.

Nested template function

Including a secure value within a hash functio

Other fixes and improvements🎁 New
  • Secrets Encryption(feedback )
  • Nested template functions (eg. hash.sha256(fs.readFile(...)))
  • Multi-line environment variables and query/form values
  • Add ability to deactivate license
  • Allow disabling window decorations (#176(#176 )
🛠️ Fixed
  • Handle variables in gRPC reflection(feedback )
  • Cannot rename websocket request(feedback )
  • Always show gRPC introspection menu(feedback )
  • Base64-encode arguments to template functions(feedback )
  • Git commit not respecting repo config(feedback )
  • Scrollbar not visible in HTTP response pane(feedback )
  • Some keyboard shortcuts are hidden(feedback )
  • Search matches are low contrast(feedback )
  • Issue with HTML response detection(feedback )
  • Ignore whitespace in response type detection(feedback )
  • Websocket close message doesn’t close client side(feedback , #175 )
  • Allow underscore-prefixed variable names(feedback )
  • Token not refreshed using oauth2(feedback )
  • Self-referencing variable crashes the app(feedback )
  • Font issues on Linux(feedback , #178 )
  • Selected element turns font bold(feedback )
  • Crash when parsing gRPC schema(feedback , #194 )
  • More reliable template grammar(feedback )
  • OAuth implicit flow closes window(feedback )
  • Don’t mark environments as external in Git
  • Don’t send trailing ? for websocket requests with no query params
  • Fix padding in authentication tab
  • Add ReactJS error boundaries to prevent crashing the entire UI
  • Use regular JSON text viewer for gRPC messages
  • Fix scrolling in environment editor
  • Fix FOREIGN KEY constraint failed during some sync and import operations
  • Only prompt for keychain password once
  • More flexible match for SSE content-type
  • Fix auto-closing editor brackets
  • Fail render on missing variables
  • Fix protobuf include path for gRPC (#179(#179 )
  • Fix plugin manager listening address (#177(#177 )
  • Fix GraphQL introspection infinite loop
💄 Improved
  • Unescape unicode in response viewer (#203(#204 )
  • Fix window header with larger font sizes (#182(#182 )
  • Decode unicode literals in response viewer (#203(#203 )
  • Improved path parameters highlighting grammar
  • Do not vendor libdbus for accessing Linux secret-service
  • Fix labels in gRPC method selection (#188(#188 )
  • Properly refresh Git info after init
  • Move editor search UI from bottom to top
  • Use the correct variable resolution within the environment editor
/changelog/2025.2.0
Simplifying Pricing
Show full content

Big news! Yaak’s commercial license is now simpler and more accessible.

Both Business and Individual plans have been consolidated into a single $50/year license. 🌟

New pricing plans

New, simpler pricing plan

If you’re already subscribed annually, you’re now paying just $50/year. Monthly subscribers have been moved to a special $5/month plan (not available for new users).

Plan Period Old Price New Price Individual Year $72 $50 Organization Year $108 $50 Individual Month $8 $5 Organization Month $12 $5

All Purchasing Power Parity (PPP) and other discounts are still applied.

But… why the change?

👌🏼 Simple app, simple pricing

Yaak is praised for its simplicity and ease of use. Why should pricing be different?

Any startup founder will tell you to never lower your prices, but Yaak is not any startup. I’m just an indie developer, bootstrapping an app that wins on simplicity.

…And the previous pricing was far from simple.

  • Do I need a commercial license?
  • Should I buy the individual or organization plan?
  • What’s the difference between the plans?
  • Can I switch plans?
  • Should I pay monthly or yearly?

This confusion meant users often gave up on buying a license, since it didn’t unlock any new features anyway.

Now there’s less chance of confusion. Using Yaak at work? Purchase for $50/year. Simple.

But there’s still the problem of incentive. Which brings me to the next addition.

🚂 Come along for the ride

You can now follow Yaak’s journey to sustainability with the introduction of public stats on the pricing page.

I’ve been an indie dev for over a decade and have discovered the greatest advantage is showing people that a product is made by a real person. This is especially true with API clients where the big players have hundreds or thousands of employees.

Public stats

Public revenue and other stats, displayed on the pricing page

I believe that if you can see your purchase making a difference, you’ll be more likely to support Yaak. I’ll be adding more public stats in the future as well, so stay tuned for more updates.


So that’s that.

Yaak’s pricing is now simpler and easier to understand. If you use Yaak for work, it’s just $50/year. No more confusion.

And if you want to see how your support makes a difference, check out the new public stats. Every purchase helps Yaak stay independent and continue improving.

Thanks for being part of this journey!

~ Greg 👋🏼

/blog/simplifying-pricing
2024 Year in Review: Going Full-Time
Show full content

It’s hard to believe that at the start of 2024, Yaak was still just a side project. Fast-forward a year, and it’s at 6k monthly active users and 25k total installs.

Yaak is also on its way to sustainability—reaching $160 in monthly recurring revenue since introducing a paid plan just a few weeks ago.

Chart of MRR over the past month Monthly recurring revenue

I originally planned to make this post a simple recap of the year’s milestones, but I’ve instead decided to share some more personal reflections. I hope you like it!

🔍 Finding motivation to start

My original plan was to keep Yaak a fun side project. But that changed after starting a family in late 2023, when I realized just how much time and energy my full-time job required. I wanted a life that would allow me to balance work and family, and decided that Yaak would be the key to getting there.

It’s a lot of pressure to put on one project, but I went all in, leaving my job in May to focus on Yaak full-time. So far, it seems like the right decision.

🏝️ Working less while growing

Having previously founded another API client, Insomnia, I learned some hard lessons about burnout. With less than a year of runway, I overworked and overstressed while trying to reach success as quickly as possible. The result?

  • Too many hours worked.
  • An endless cycle of refreshing analytics and iterating on growth ideas.
  • A mountain of technical debt I couldn’t climb out of.

Things got bad.

I burned out multiple times and spent a year with chronic pain so bad that I couldn’t sit for more than a few minutes at a time.

This time, things are different. With multiple years of runway and the benefit of hindsight, I’ve traded urgency for patience. I’m focusing on building a product people will recommend to their peers, and occasionally playing the content lottery to build the initial growth snowball. That’s the entire strategy.

Daily active users since launch Daily active users since launch

The chart above shows Yaak’s three successful blog posts from 2024. The first two spikes were followed by declines, but the third post in September broke the trend. Ignoring the holiday dip, Yaak’s daily active user metric is now growing organically for the first time. 🤯

If there’s one takeaway from 2024, it’s that Yaak will succeed if I just keep going.

🕰️ Time tracking for work/life balance

One concrete thing that helped immensely was using Toggl to track my time. In 2024, I averaged 23 hours per week of at-computer work, likely bumping to ~30 hours when counting untracked time spent planning or brainstorming (usually on walks or while driving).

Chart of hours worked Weekly hours worked since going full-time in May

Time tracking has provided an objective metric of expended effort, which helps keep focused and prevents overworking. If you’re starting your own project, I highly recommend it—it’s too easy to underestimate how much time you’re actually putting.

Now let’s talk a bit about Yaak itself.

🔄 Revisiting open source

After Insomnia, I swore I’d never do open source again, as it was a large contributor to burnout. I’ve written about it in Why Not Open Source so I won’t elaborate, but I’m glad I changed my mind (see Yaak Is Now Open Source).

It turns out that, for the same reason I like sharing in posts like this, I love working in the open. To avoid burnout, Yaak’s open-source model focuses on transparency rather than contribution—it’s open for bug fixes but not feature development. This keeps the benefits of open source without adding to my workload.

💰 Choosing a sustainable business model

Leaning on experience, my initial plan was to charge for cloud data sync, but y’all made it clear that you value offline apps. The market has shifted, and users want control over their data, and many are wary of cloud-dependent tools.

So I introduced a commercial-use license which went… okay? It’s hard to analyze the data with the holiday slump, but I think there was a noticeable drop in active users since the announcement. I’m hoping this is just a temporary blip and I’ll take another look in the coming months.

Chart of gross revenue over the past month Gross revenue since introducing a commercial-use license

That said, paying users are trickling in. While Yaak’s MRR is only at $160, it’s already grossed over $1.5k due to most subscribers opting for the annual plans. If this trend of ~$200 per week continues, Yaak is already 10% of the way to financial sustainability!

🌈 Looking forward to 2025

I’m extremely excited for 2025 because most of the foundational work is in the past. I’ve proved that Yaak is valuable, kick-started the word-of-mouth snowball, incorporated a company, added a business model, and implemented most of the low-hanging fruit features that prevented initial adoption.

So, here are my priorities for 2025:

  • Publish one blog post per month
  • Improve plugins and ship a plugin directory
  • Add filesystem sync and Git UI
  • Add Websocket support

2024 was the year of building the foundation. Now, it’s time to deliver on Yaak’s potential. I’m looking forward to continuing this journey and can’t wait to see what the next year brings!

~ Greg

/blog/2024-review
Fair Pricing for an Open-Source Future
Show full content

After months of conversing with users and some (misguided) prototyping, I’m excited to finally settle on a business model that feels right—one that prioritizes sustainability and puts local-first development, well… first.

Pricing plans

A visual overview of the pricing page

💫 Pricing overview

Let’s start with what’s not changing. Yaak remains open-source under the MIT license so you can still view, modify, and run the source code directly.

Here’s what’s new for use of the prebuilt binaries.

  • Personal Use: Free access to all features continues as before
  • Commercial Use: A paid license is required to use Yaak’s prebuilt and signed binaries for revenue-generating or work-related activities

Purchasing a license not only supports Yaak’s ongoing development but also unlocks these benefits:

  • Direct Support: Help for technical issues
  • Prioritized Feedback: Influence Yaak’s roadmap
  • Prebuilt & Signed Binaries: Convenience and authenticity
  • Automatic Updates: Access new features and security fixes

Licenses are available for individuals at $8/month and companies at $12/user/month, with a 25% discount for billing annually.

Commercial-use licensing operates on the honor system—I trust you to decide if a license is right for you. The goal is sustainability, not barriers and purchasing a license helps ensure Yaak’s continued growth and improvement.

Be sure to check out the Pricing Page for details on the trial period, purchasing power parity, bulk purchasing, and more.

Now, let’s talk about how this came to be.

☁️ Ditching cloud sync

Remember those months of “prototyping the wrong thing?” Well, that was cloud sync. So why’d it get scrapped?

A while back, I shared an RFC for data synchronization to gather feedback. Many of you had asked for a way to store Yaak data in a folder for seamless Git integration, so I wanted to explore whether cloud sync still had a place alongside filesystem storage. Your response was loud and clear:

No one wants cloud sync 🫠

As long as the app never wants to connect anywhere unless I ask it to
– feedback

Using git would definitely be the best solution here
– feedback

Turns out, you just want local files to easily integrate with Git, Dropbox, or other tools; not another company holding your sensitive API data hostage in the cloud. And you know what? You’re absolutely right.

🤝🏼 Aligning incentives

Without cloud sync, I needed a different way of supporting Yaak’s future. I considered freemium models but dislike how they incentivize pushing core features behind a paywall (see enshittification).

That’s why I chose commercial use—looking to apps with similar pricing models like Obsidian, Orbstack, and WebStorm.

This model feels fair for both Yaak and its users. If Yaak helps you earn money, Yaak earns money. It lets me focus fully on building the features you’ve been asking for:

No usage limits. No upselling. No cloud lock-in. Just a solid, privacy-respecting desktop API client that gets the job done.

📖 Open source, as usual

Initially, open source made sense because I planned to offer a hosted cloud sync service. You’d pay for the cloud, not the app.

While I considered moving to a Fair Source license to align with the commercial-use model, I ultimately decided against it. I love that Yaak is open source and don’t want to change that. So, for those who prefer to compile the source code for their own use, the option remains open.

🎯 What’s next?

This commercial model ensures that I can continue working on Yaak while keeping it true to its goal: a powerful, private, local-first desktop API client that puts you in control.

Growth chart

Yaak’s weekly active user growth, since inception

It’s been an amazing ride so far but Yaak wouldn’t exist without you, the community. So if you have feature requests, ideas, or questions about the pricing, be sure to drop them on the Feedback Board or find me on BlueSky @schier.co.

Thanks again for making this possible. 🙏🏼

~ Greg

/blog/commercial-use
Signed Windows Binaries and New Pricing
Show full content

There are some important updates to Yaak’s licensing: going forward, a paid license is required for commercial use of prebuilt binaries. Personal use and running the open-source code remain free.

I won’t go into detail here, so be sure to check out the Announcement Post.

✍🏼 Signed Windows Binaries

Now, you can finally install Yaak on Windows operating systems without seeing the “Running this app may put your PC at risk” warning. And for those working inside a larger organizations, Yaak will no longer be blocked by corporate security policies.

Screenshot of the warning presented during installation on Windows

The warning dialog shown when trying to install Yaak on Windows

Fixes Sign Windows Release

See also: feedback

Other fixes and improvements🎁 New
  • Add count to folded JSON items(feedback )
  • Added Nord theme support (#132(#132 )
🛠️ Fixed
  • Fixed missing Moonlight and Dracula themes (#133(#133 )
💄 Improved
  • Hide window controls in macOS full screen (#134(#134 )
  • Cannot import large data files(feedback )
/changelog/2024.13.0
Introspection Controls and Sync System Progress
Show full content

Hey there, It’s been a while. 👋🏼

I’ve taken a bit of a break from app development to focus on the upcoming sync system (more on that below). In the meantime, here’s a release containing some important bug fixes and GraphQL introspection improvements.

🧑🏼‍🔧 GraphQL Introspection Controls

This release adds more controls to GraphQL introspection.

  • Ability to disable automatic introspection
  • Ability to clear the currently fetched schema
  • Ability to trigger manual introspection
GraphQL introspection menu

Access new actions from the GraphQL schema menu

Fixes Manual GraphQL Introspection

See also: feedback

💣 New Non-destructive JSON Formatter

The previous JSON formatting logic would parse the text and re-serialized it with proper indentation. This would cause subtle mutations, however, like converting 1.000 to 1. This release includes a custom JSON formatter that does not include a parsing step.

The new formatter operates on the raw JSON string and simply adds whitespace as necessary, leaving all tokens in raw form. Not only does this mean your numbers will keep their precision, but it will also work with invalid JSON! How cool is that?

Fixes Respect numeric formatting in JSON pretty mode

See also: feedback

🔄 Sync System Progress

I’ve been heads-down on the sync system (paid subscription) for the past few week and am quite happy with the progress. You can follow along in the WIP Pull Request if you’d like.

Sync commit dialog

Select the entities to commit, just like Git

Here’s the current state of progress.

On the application side:

  • New sync menu at the bottom of the sidebar
  • Commit dialog to stage and commit changes
  • History dialog to see change history

On the server side:

  • A login system for email/password, GitHub, and Google
  • Basic team invitation functionality
  • Email notifications

The main items remaining are to have the sync system mutate the local database (eg. for branch checkout), hook it up to the remote API to enable collaboration, and integrate Stripe to manage billing.

The Git-like functionality will be available locally without the need to pay or create a cloud account.

I’m excited to be able to see the light at the end of the tunnel, as it will be a major step towards making Yaak a sustainable business. As for timeline, I hope to open it up for beta testing early next year.

As usual, please let me know if you have any thoughts on this via the Feedback Board.

Other fixes and improvements🛠️ Fixed💄 Improved
  • Sort cmd+k result by match score
/changelog/2024.12.0
Server Sent Events, Proxy, and Functions++
Show full content

Hold onto your butts! 🦖

This week is big, so let’s skip the preamble and jump right in to what’s new.

⛲ Server Sent Events

Server sent events (SSE) are is a relatively new way to push data from server to browser in real-time, and are now natively supported in Yaak. But this change also brings with it another major improvement: Streaming responses.

Screenshot of server sent events

Server sent events stream live into the response pane

To support SSE, Yaak needed to be able to show the contents of a response as it streamed to the client. So, along with SSE, you also get the following benefits for all other responses:

  • Responses show as “Connecting” until headers are received
  • Response status is shown as soon as headers are received
  • Size and Time now update as each response body chunk is received
  • Text responses will re-render after each chunk is received

Pretty neat, right?

See also: feedback

🌐 Proxy Setting

If you work inside a corporate network, you’ll be greatly aware of the need to send traffic through a proxy server. And, if you don’t, the ability to configure a proxy might not be that interesting. But it does allow other interesting use-cases, like forwarding traffic to a debug proxy like Proxyman for better debugging.

You can configure the proxy settings under Settings > Proxy.

Screenshot of new proxy settings

Configure a proxy in the new Proxy tab, under Setting

See also: feedback

🧑🏼‍🔬 More Template Functions!

The plugin system was intentionally introduced in an early state, to start getting feedback. One of the core use-cases for plugins is creating Template functions which you clearly wanted more of.

So, the following template functions are now bundled with Yaak:

  • prompt.text() → Prompt the user for input at send-time
  • fs.readFile() → Read the contents of a file
  • hash.* → Hash a value with md5, sha1, etc.
  • response.header → Access the value of a response header
  • response.body.raw → Access the entire response body

See also: feedback

🚀 Performance!

It’s usually not exciting when apps list “performance improvements” as a changelog item. However, this time it’s real. 👀

There were some naive decisions within Yaak’s codebase that caused major slowdowns when working with more than ~100 requests that are now eliminated!

If you notice any more performance issues, please submit Feedback so it can be addressed as well.

Other fixes and improvements🛠️ Fixed
  • Cannot undo changes in URL(feedback )
  • Headers tab table sizing(feedback )
  • Copy as Curl with path parameters(feedback )
  • URL Truncation Error When Hovering Over JSON Link(feedback )
  • Fix settings window on Linux(feedback )
  • Resizing window hides the close button(feedback )
  • Fix variables not working on bulk editor
  • Fix dialog backdrop color
  • Fix gRPC connections not being marked as closed
  • Fix gRPC events reloading in reverse order
💄 Improved
  • Better fuzzy matching in command palette
  • Moved response template function behind response.body.path
  • Set max width on request name in the app header
  • More verbose sending errors
/changelog/2024.11.0
FakerJS Plugin and Data Synchronization RFC
Show full content

There aren’t any earth-shattering new features in this release so don’t get too excited. However, a FakerJS plugin is available to install and a plan for implementing data synchronization is now open for comment!

🎁 Yaak's First Plugin: FakerJS

The plugin system has been in the works for a long time and—as you may already know—plugins already power a lot of core features including import, copy-as-curl, and the new response() tag. With the plugin APIs becoming more robust, it’s now possible to build some cool stuff.

So, here’s the first ever publicly available plugin! github.com/mountain-loop/plugin-faker 🙈

With the Faker plugin installed, you’ll have access to the dozens of FakerJS APIs for generating dummy data like airport codes, numbers, animals, colors, and more. And the entire plugin is only ~20 lines of code!

Faker plugin screenshot

Install the Faker plugin to start sending dummy data to your APIs

The installation process is still very manual and mostly meant for writing your own plugins, but you can follow these steps to get started:

  • Download the Faker plugin GitHub repo
  • Open Yaak > Settings > Plugins
  • Select the plugin code directory

This process will be vastly improved in the future, providing the ability to install from a URL or search from a first-party plugin registry.

If you’re curious about plugin development, there’s also a new Plugin Development / Quick Start guide to show you how to get started. Plugin development is done in TypeScript so most things are discoverable through your favorite text editor’s autocomplete.

See also: feedback

🚀 Quicker Launches and Theme Loading

This release also comes with some really nice quality-of-life improvements that will make Yaak feel more at home on your desktop.

The biggest of these is a 2x faster startup time. This was achieved by splitting the main JavaScript bundle into multiple parts so the webview can render the important bits right away. You’ll notice this the most when opening the settings window.

The next improvement is mostly for the Windows users. You see, Windows isn’t very good at respecting your dark mode preferences out of this box. This caused new Yaak windows to flash a white background for a split second while it loaded the active theme. This issue has been fixed by hiding new windows by default, and only showing them once the theme data has become available.

Those are the two most noteworthy improvements but be sure to check the bottom of this changelog for a ton of other important fixes! Now let’s talk about the next big upcoming feature.

☁️ Data Synchronization Proposal

Be sure to read the Synchronization System RFC and leave your thoughts 🙏🏼

I’ve been hard at work this week building a proof-of-concept for data synchronization in Yaak. The details are in the linked RFC above, so I won’t go over it again, but here’s a quick summary:

There will be two forms of data synchronization:

  • Directory sync → continuously import/export data from your filesystem
  • Cloud sync → collaborate using an end-to-end encrypted Git-like workflow

Directory sync will hopefully fit the need of those looking to integrate their Yaak workspaces with a local Git repository, while Cloud sync will be the easiest possible way to collaborate with others (or simply back up your data). Note that cloud sync will be available as a paid subscription, and the foundation of Yaak’s business model going forward.

I’ll have more to share on soon but, again, please give the Sync RFC a read and submit your thoughts.

See you soon!

See also: feedback

Other fixes and improvements🛠️ Fixed
  • Path variables replace even without colon prefix(feedback )
  • gRPC basic auth encoding(feedback )
  • Path variables parsing breaks when used with path variables
  • Request chain stuck when populating global var
  • Allow invalid JSON for GraphQL variables(feedback )
  • Settings window disappears when moved to another monitor
  • RPM installation fails to start(feedback )
  • URL param not updating correctly on URL paste
  • Prevent key/value editor from adding when clicked outside ed368cd
  • Fixed deadlock in response() tag c938b62
💄 Improved
  • Toggle maximize on double-click(feedback )
  • Namespaced autocomplete names for multi-level template functions #95(#95 )
  • Link to docs in plugin settings
  • Use plain input for prompt dialog 1c6c979
  • Environment dropdown becomes a button when no environments 3ee9ed8
  • Improved toast styling
  • Show all requests in response() tag dialog 3818154
/changelog/2024.10.0
Open Source, Path Params, and Query Import
Show full content

Welcome to the first release after the open-sourcing of Yaak! In case you missed the news, check out the full-length Announcement Post.

Yaak also has a new Feedback Site, so submitting and managing feedback will be a much nicer experience!

Okay, let’s jump into the goodies of this release.

🪄 URL Path Parameters

APIs that use a lot of GET requests can end up having a lot of really long URLs. For example:

https://api.example.com/users/usr_123/comments/cmt_123

This is a pain because it can be challenging to edit the segments of a URL. Now you can use the :placeholder syntax to populate a URL path segment. Yaak will automatically add these placeholders as entries in the Params tab.

URL path parameter

Path parameter placeholders for easy editing

Tip: Click the placeholders in the URL to navigate directly to the Param!

See also: feedback

📋 Import querystring on paste

Yaak will now automatically import any querystring parameters into the Params tab after pasting into the URL bar. This is a huge time-saver for those who frequently copy-paste URLs into Yaak.

See also: feedback

Other fixes and improvements🛠️ Fixed
  • Highlight as JSON when Content-Type incorrectly text/html(feedback )
  • JSON highlighting should work with +json content-types(feedback )
  • It’s not possible to create a top-level folder(feedback )
  • Import nested folders not working(feedback )
  • Better spacing of app header with different font sizes(feedback )
  • Endless loading when using Response fn in env var(feedback )
  • Fix windows/Linux close icon color
  • Fix interface zoom
  • Handle non-utf8 charsets in responses
  • Remove GraphQL introspection interval
💄 Improved
  • Selected tab state per request(feedback )
  • Copy response button on Response History menu
  • Check for updates less often on stable vs beta
/changelog/2024.9.0
Yaak Is Now Open Source
Show full content
Screenshot of Yaak GitHub repository README

Screenshot of the Yaak GitHub Repository

I hate to admit it, but the Reddit, HackerNews, and Lobsters folks were right. 🙈

Three months ago I published Why Not Open Source as an attempt to explain why the Yaak wouldn’t be open source. Having burnt out maintaining open source in the past, I figured others might find my decision-making process useful, so I shared it to the usual places.

Users of the Yaak’s users mostly agreed, which makes sense as they were already happy with the close-source reality. The broader open-source community, however, strongly disagreed with almost everything I wrote.

Here are a few of the highlights:

Don’t conflate “open source”/“free software” with github’s specific social model of drive-by contributions, or even contributions at all… → lobste.rs

But all of those things are also true of closed source software. → ycombinator.com

The claims of this text are complete bullshit. No idea what this “app” is about, anyways. Dont need it. Can go to the trash can of history → reddit.com

While most of the replies weren’t constructive, this 500-word lobste.rs comment is absolute gold. It immediately got me thinking that maybe I was wrong. 🙈

I wanted feedback, and that’s exactly what I got.

My main takeaway was that open source doesn’t mean open contribution. You can still get most of the benefits by simply making the code public:

  • Open to security audits
  • Transparent functionality (no shady stuff)
  • Flexibility (can still fork and modify)
  • Runnable even if the developer disappears

I wanted Yaak users to experience these benefits too, which is why Yaak is now open source but closed (mostly) for contribution.

🙈 Open source, closed(ish) contribution

Many commenters pointed to projects like SQLite which are open-source but don’t allow outside contribution. For some reason, I never even considered this as a possibility.

A while later, while searching for more examples of closed-contribution projects, I came across Litestream, which was initially closed to contribution but eventually opened for bug-fixes only.

This model made perfect sense to me, so it’s exactly what I chose to do. Yes, even though I said I’d never open-source… Yaak is now open source under the MIT license and open to contribution for bug fixes only.

Now the desktop Linux users can fix their own bugs (please don’t hate me) 😅

~ Greg

/blog/now-open-source
Request Chaining and Foundational Improvements
Show full content

You might be thinking, a month of work for a single changelog item?!

Yes, indeed! But not only was Request Chaining the most-requested feature on the roadmap, it required an entire new concept (template functions) to be introduced, as well as a large restructuring of how plugins communicate with the application.

Let’s first dig into Request Chaining, then talk about some of the changes that had to happen to get there.

⛓️ Request Chaining

When working with APIs, there are often dependencies between requests. For example, you might POST /users to create a new user, then PATCH /users/<id> to update the user’s email address.

But how do you get the ID of the created user into the update? You’d better not be copy/pasting! There’s now a better way.

Just like how environment variables allow dynamic reuse of values across requests, the new response(…) function allows something like PATCH /users/<id> to directly reference the id from the response body of POST /users. Here’s how.

Step 1 → Select the response() function from the autocomplete menu in any text field.

Step 2 → Click the blue template tag to configure the function arguments.

URL bar

URL showcasing the use of the new response function

Step 3 → Select the request you want to depend on.

Step 4 → Enter either JSONPath or XPath query to select just the value you want.

Function editor

Function editor interface, for configuring arguments

Step 5 → Send the request!

Sending the request will render the template and inject the referenced value – just like using regular variables. If no response exists yet for that request, it will be sent automatically.

So why did this take a month to ship? Let’s cover that now.

Fixes Reference Response Values in other requests (chaining)

See also: feedback

🏗️ Foundational Improvements

Template functions could have been implemented in a more direct way. However, I really wanted them to be extendable by the community. This meant having the necessary plugin APIs to provide dynamic template functions.

📣 Heads up! 3rd-party plugins are the next big item on the to-do list

Here’s a very simplified version of how the response() function plugin is implemented (or view the full source on GitHub).

// Psuedo-code for the response() template function plugin
export const plugin = {
  templateFunctions: [{
    name: 'response',
    args: [
      {type: 'http_request', name: 'request'},
      {type: 'text', name: 'path'},
    ],
    async onRender(ctx, args) {
      const requestId = args.values.request;
      const responses = await ctx.httpResponse.find({ requestId });
      return jsonPath.apply(responses[0].body, args.values.path);
    },
  }],
}

The big lift in this release was implementing the APIs for the ctx object (that you see above) to allow plugins to do useful things like show dialogs, copy text, fetch responses, and send requests. It’s this plugin→app communication that needed to be implemented for this release.

I’m saving the full details for a dedicated blog post, but the gist is that there’s now a bidirectional RPC API between the app (Rust) and plugin runtime (NodeJS). A functional interface is then implemented on top of this using strongly typed Request/Response events.

For example, the ctx.httpResponse.find({ requestId }) function emits a FindHttpRequestRequest{event_id: 123, ...} event to the app, then waits for a FindHttpRequestResponse{reply_id: 123, ...} to come back.

All event types are defined in Rust and TypeScript equivalents are generated using ts-rs, meaning plugin development is as easy as Ctrl+Spacing your way to success!

Editor autocomplete

Friendly autocomplete while writing plugin code

That’s enough details for today, though. Look forward to a future blog post outlining the full plugin stack once the architecture has fully settled.

Patch 2024.8.1
  • Fix some plugins not executing on Windows, due to not finding the focused window
Other fixes and improvements🎁 New
  • Add rename/send/delete to command palette
  • Always enable params when switching from bulk editor to regular
  • New plugin runtime communication layer
  • Enable JSONPath filtering for more content types
  • New setting to disable usage statistics
🛠️ Fixed
  • Fix automatic content-type on body change(feedback )
  • Fix backwards fold gutter icons
  • Properly invalidate bulk parameter editor when switching environments
  • Fix $ messing up syntax highlighting
💄 Improved
  • App crashes writing port file(feedback )
  • Not possible to delete variables in GraphQL(feedback )
  • Delete request confirmation styling(feedback )
  • Code folding is buggy(feedback )
  • Show import errors(feedback )
  • Decode params during Curl import(feedback )
  • Not allowing multiple environment variables(feedback )
  • Environments shown in workspace menu after import(feedback )
  • Include icon in navbar for command palette discovery
  • Remove persistence for active settings tab
  • Show rendered variable value as title attribute
  • Keep sidebar and command palette items in view during keyboard navigation
  • Switch database library from sqlx to rusqlite
/changelog/2024.8.0
OpenAPI Import, Large Responses, and Homebrew
Show full content

There’s been a lot of behind-the-scenes movement on the plugin system so this release is fairly small. However, it does add long-awaited support for OpenAPI as well as a few other goodies!

🚚 OpenAPI Support

By popular demand, you can now import OpenAPI spec files into Yaak. Specifically Swagger 2.0, OpenAPI 3.0, and OpenAPI 3.1 documents.

Import dialog showing OpenAPI spec

Many public APIs publish an OpenAPI specification and some web frameworks will generate them automatically. Now you can import these specs into Yaak to get started even more quickly.

Fixes OpenAPI Import Support

See also: feedback

👀 Reveal Large Responses

Due to performance concerns, large text responses were previously hidden with no way to view them. You now have the power to bypass this message 💪🏼

Prompt to show large response body

Fixes Show Large Response Payloads over 2MB

See also: feedback

📦 Homebrew Cask

Thanks to a contribution by @chenrui333, Yaak can now be installed via Homebrew!

brew install yaak

Fixes Install via Homebrew

See also: feedback

Other fixes and improvements🎁 New
  • Add .deb and .rpm installers for Linux
  • Enable bulk editor for gRPC metadata
  • Support Postman file body types and URL objects
🛠️ Fixed
  • Resize handles are very hit or miss(feedback )
  • Fix missing border style on some icon buttons
💄 Improved
  • Missing hints from GraphQL introspection(feedback )
  • More descriptive gRPC errors(feedback )
  • gRPC proto changes do not take effect(feedback )
  • Improve how variables are displayed in request name(feedback )
  • Multi-part Content-Type auto-detect is not working(feedback )
  • Stale request values sent(feedback )
  • NodeJS-based plugin system runtime
  • Show response info in separate tab
  • Better UI performance bug for gRPC UI
  • Move request to another workspace
  • Better performance on large workspaces
/changelog/2024.7.0
Why Not Open Source?
Show full content

👋🏼 Update: I'm pleased to announce that Yaak is now open-source!

Will Yaak be open source?

The short answer is no, there are no plans of going open source. Instead, Yaak will add a plugin system to its closed-core model, achieving the benefits of open source without the burden.

This post expands on the reasons behind this choice.

Yaaks GitHub repo showing private status

Let’s kick things off with some context. The last post mentioned how the open-source nature of my previous endeavour was a large contributor burnout—ultimately leading to my departure. The opinions in this post are informed by this experience.

✨ The product is the priority

Users want a great product.

While potential contributors will vote for open source, the most important thing is providing a great product. So, does open source lead to a better product? That’s the question I’m trying to answer.

🤔 Naive assumptions on open source

In the past, I assumed open source would provide a huge benefit. Unfortunately, these assumptions didn’t match reality. I’ll cover the important ones here.

Bugs will get fixed

🟩 Yes, they are an easy contribution candidate

In open source, any motivated user can jump into the code and submit a fix. These contributions have a narrow scope and thus lower the bar compared to other types of contributions.

Features will be added

🟥 Difficult, in reality

For desktop applications, new features often require design and usability consideration. Unfortunately, most programmers don’t possess these skills, necessitating many back-and-forth cycles to ensure the feature looks good and is integrated thoughtfully.

This means it’s often quicker for the maintainer to just implement the feature themselves. 💀

Conversely, extending existing features is easier—like adding support for OAuth 1.0—because the existing feature provides a UI paradigm to work from, reducing the barrier to entry. This would also be a great candidate for plugins.

see where this is going?

Transparency will increase

🟧 Doesn’t require open source

You can’t get much more transparent than publishing the entire codebase and its history. With so many privacy-abusing companies in the world, open source provides assurance that nothing shady is happening.

Transparency doesn’t just mean code, however. There are many ways for closed-source projects to be transparent as well. For example, having a Public Roadmap and sharing posts like this.

Security will improve

🟧 It depends

It’s possible for users to audit the code of an open-source project and disclose any issues. The key word here is “possible.” I don’t actually remember this happening, but it did while I worked at Railway, a closed-source product. Maybe this is due to the simpler nature of desktop applications.

Community will grow

🟧 Only if the effort is invested

There’s nothing specific about open source that builds community, other than the repository providing a place to congregate. Communities grow from the interactions within them, like openly discussing roadmap, which can also be done in closed-source.


Open source wasn’t what I thought it was, but why? I think most of the discrepancy can be attributed to the very nature of open source. Let me explain.

💩 The problem with open source

Imagine working at a company that hired anyone who applied. It would quickly fill with people bringing irrelevant experience and misaligned incentives. This is the unfortunate reality of open source, and requires a huge time and emotional investment.

Imagine working at a company that hired anyone who applied

The benefits of open source must make up for the fact that:

  • It’s hard to deal with unappreciative or rude feedback
  • It’s hard to manage long back-and-forth feedback cycles
  • It’s hard to decline a contribution that was submitted without approval
  • It’s hard to say no to most things once the project has matured
  • It’s hard when a good contributor leaves
  • It’s hard to accept that people are working for no pay
  • It’s hard to feel good about 1000+ open issues
  • It’s hard that it never stops.

The list could go on, but you get the point; open source is hard and it takes a toll on your emotional well-being. The only way open source can work is in a corporate setting where full-time maintainers are paid to manage the project, can take breaks, and be replaced if desired.

Unfortunately, the fact that Yaak is a small indie project means this isn’t possible.

So what’s the answer then? Can we get the benefits of open source without the burden? Yes, I think plugins can do just that!

🔌 Plugins solve the maintenance burden

A plugin system can garner the same collaborative attributes as open source. It’s kind of cheating, though, because the plugins would be open source. However, open-source plugins are much different than an open core because of their confined scope. This makes contributing easier and thus lowers the maintenance burden.

So let’s cover some of the same assumptions as before, but in the context of plugins.

Bug fixes

🟨 It depends

Plugins are not as good as open source in terms of getting bugs fixed simply because not all code is open source. However, this is a great motivation to put as much logic into plugins as possible (which is the plan).

More features

🟩 Yes

Contributing to open source gets harder for larger projects because more knowledge is required to implement something properly. Imagine getting hired as a developer and shipping something meaningful your first day. It’s possible, but extremely challenging and likely requires help from your team.

Imagine getting hired as a developer and being shipping something meaningful on your first day

Plugins avoid this problem because they are small and specific. It’s totally reasonable to comprehend a 200-line plugin codebase in order to make a proper contribution.

Also, since plugins don’t have to be integrated into the core application, features can be added even faster than in open source.

Community growth

🟩 Yes

Plugins grow community by giving authors the ability to share their creations and retain ownership of them. Something like the Raycast Store has thousands of users contributing high-quality plugins. People share their creations on social media, and good plugins are promoted. This incentive alignment creates a mutually beneficial relationship.

Raycast Vim Bro extension

Open source also provides ownership, but it’s often buried within the source code repository so it not nearly as public.


Now some of these assumptions about plugins could also turn out to be false, but my observations of popular projects seem to indicate a good chance of success.

🏖️ An exciting future

Hopefully you got a satisfactory answer to why Yaak won’t be open source. If not, feel free to leave a question on the Open Source Feedback Thread and so I can clarify it in this post.

I’m extremely excited about plugins, specifically because they won’t be confined to my specific vision for Yaak. Users can get creative and extend Yaak in ways I couldn’t imagine.

So when will plugins be ready?

The plugin system currently exists already, but for internal use. The plan is to prepare it for public release in the coming months so keep an eye out for that. 👀

And, if you have a question or comment, drop it on the Plugins Roadmap Item.

Thanks for reading! 👋🏼


~ Greg
/blog/why-not-open-source
Command Palette, Bulk Edit, and Response Download
Show full content

You’re in for a treat! 🍦

This release is jam-packed full of goodness, including the long-awaited command palette and bulk editor for params!

We’re also going to dive a little deeper this changelog, covering foundational topics like the template engine that powers variables, as well as the plugin system.

🎨 Command Palette

Let’s kick it off by talking about the new command palette. Almost every modern app has one, and it’s for good reason. A command palette makes it easy to access more niche features as well as making other features more discoverable.

The pallet can be triggered from anywhere via CmdOrCtrl+k and currently supports easy switching between requests, environments, and workspaces; plus the ability to trigger common actions (more of these coming soon).

The goal of the command palette is to expose everything Yaak can do in a friendly and accessible way. From a technical standpoint, this the beginning of a codebase restructuring where every action in Yaak will start as a command, which is subsequently exposed to user interface components, hotkey handler, and even the upcoming plugin system!

Fixes Command Palette

See also: feedback

🚜 Bulk Editor Everywhere

For larger edits to query parameters or headers, you often wish that Yaak would just give you a damn text box! Well, now it does!

For most key/value interfaces, you can now switch to a bulk editor that presents you with a text-editor interface. And, since Yaak uses the same <PairEditor/> component for many things, it’s been enabled for the following inputs:

  • Query Parameters
  • Request Headers
  • application/x-www-form-urlencoded forms
  • Environment variables

Fixes Bulk edit headers and params

See also: feedback

📋 Visual PDF Response Preview

I know, I know, we all hate working with PDFs. But they’re a necessary evil when when working on payment systems (generating invoices), amongst other things. Now, if a response returns a PDF, Yaak will render a rich preview right in the response pane! Not only that, but text will be selectable and links clickable.

View PDF responses in the response pane

This is all thanks to the amazing pdf.js project which Yaak is interfacing with through the react-pdf library.

⬇️ Save Responses to File

Sure, Yaak can now render PDFs, but there are plenty of content types that it has no idea about.

For these occasions, you can now save response bodies to your filesystem for use in other places. This action can be found in the response history menu for all HTTP responses and Yaak will even try to guess the correct file extension based on the returned mimetype.

Saving a response to the filesystem

Oh, and one other thing. Previously, when Yaak encountered a mimetype it couldn’t preview, it would simply show… nothing. 🤨 Now, when this happens, you’ll be presented with a prompt to save the response somewhere useful.

Prompt to save to file for unknown mimetype

Fixes Download response to file

See also: feedback

🔌 New Plugin Runtime (Deno)

Yaak’s grand vision is to put as much functionality as possible into plugins. While the plugin system isn’t public yet, it is being used internally for things like data importers (Postman, Insomnia, Curl, etc).

Plugins are small JavaScript programs, and were previously executed using the Boa JavaScript engine—a native Rust project. This worked great in theory, but performance was a problem in practice. For example, importing Stripe’s Postman collection (~800 requests) took upwards of 5 minutes! This was surprising because the all the importers do is JSON parsing, iteration, and object construction.

To get around this, Yaak now uses deno_core—a core component of the Deno project—to execute plugins. deno_core provides a thin wrapper around the v8 APIs (the same engine backing Chrome and NodeJS) making plugins super fast!

That same Stripe collection now imports in less than a second. Yes, a whopping 100x improvement! 🏎️

The new engine also exposed nicer stack traces as well as access to other Deno features like the ability to execute TypeScript directly.

🪄 New Variable Syntax Parser

A new plugin runtime isn’t the only major change in this release that you won’t notice. Yaak’s template parser for rending environment variables was completely rewritten, from scratch! 🤓

You probably won’t know this, but Yaak uses a custom syntax to power environment variables which the UI hides behind pretty-colored decorations. But, under each of those tags is something like ${[ MY_VAR ]}.

But why write a new parser? Well, the previous one nothing more than a regular expression that replaced the variable syntax with the value for each variable. However, to support one of the most popular feature requests Request Chaining , We need to be able to invoke asynchronous functions, something like:

${[ responseValue("<ID>", "$.user.id") ]}

This function needs to do a number of things before it can render a value, such as pull responses from the Sqlite database, send requests, and extract a value using a JSONPath query. Sure, it’s probably possible to do this with regular expressions, but it wouldn’t be easy to understand and definitely wouldn’t be fun to implement.

Along with request chaining, these functions will also be able to power other things like:

  • Timestamp and UUID generation
  • Fake data generation
  • File system access

And, of course, you’ll be able to provide your own functions in the future, via plugins.

See also: feedback

Other fixes and improvements🛠️ Fixed
  • HTTP/2 ALPN support(feedback )
  • Delete key sometimes deletes request(feedback )
  • Delete request from context menu works again
  • Ignore hidden items when navigating dropdowns
/changelog/2024.6.0
Themes, Audio / Video Previews, and Font Sizes
Show full content

Onslow: Did you bring any beer?
Rose: No, I didn’t.
Onslow: I’m sitting here, completely surrounded by no beer!

The above quote is from the classic sitcom Keeping Up Appearances, which is exactly what this release is all about. Yaak is about to get an appearance upgrade.

🎨 Selectable Themes

You know how the first comment when anyone posts a screenshot of their editor is what theme is that? Well now you can say the same thing about Yaak screenshots!

Thanks to your suggestions on Twitter, you can now choose between six popular themes (many with multiple variants):

Selecting a theme from the appearance settings dialog

But this is just the beginning of the story. A new “Theme Studio” is in the works, which will make it trivial to create and share custom themes of your own! So stay tuned for that.

Fixes Add Theme Support

See also: feedback

🔧 Standalone Settings Window

Themes presented a tricky problem. How do you know what the theme looks like if the settings menu covers the entire window? It took a while to come to a solution, but it was simple; move settings to a native window so that it can be moved out of the way. Perfect! This also makes Yaak feel much more desktop-native.

New standalone settings window

Settings have now also been split into two tabs to accommodate the new theme and font settings.

📖 Configurable Font Size and Wrapping

Accessibility is crucial to any application. And, one of the biggest things for accessibility is being able to change font size to suite your needs, whether you need larger text for readability or smaller text to get more out of your display.

Configurable font size and text wrapping

Now you can customize both UI and editor font sizes separately, as well as configure editor wrapping for those unwieldy responses.

🎥 Video and Audio Responses Previews

This release adds two more content types to the response preview: Video and Audio. If you deal with APIs that return either of these, you’ll now be able to play the media natively within Yaak.

🤔 Is Yaak now also a podcast player?

Playing a podcast file within the response pane

If you’re not aware, Yaak now supports the following content types:

  • Images
  • Video
  • Audio
  • CSV/TSV
  • JSON/XML
  • Web pages
  • gRPC

And more will be added in future releases so leave a suggestion if you need others!

Fixes Preview audio and video files

See also: feedback

Other fixes and improvements🎁 New
  • Add font size option for accessibility(feedback )
🛠️ Fixed
  • Properly send multi-part filenames(feedback )
  • Fix macOS stoplight flickering on window resize
  • Fix copy-as-curl when using environment variables
💄 Improved
  • Better error message for URL “invalid format”(feedback )
  • System dropdowns are still light in dark mode(feedback )
  • “Select All” keyboard shortcut not selecting all text(feedback )
  • Word wrap setting for request/response bodies(feedback )
  • Import content-type in multi-part forms for Postman(feedback )
  • Skip collapsed folders in sidebar arrow-key navigation
  • Sync native window theme with Yaak theme (macOS)
  • More efficient check for fullscreen state
  • Don’t send request when pressing Enter for autocomplete
  • Don’t change to POST when switching PUT/PATCH body type
  • Bugs and improvements to response pinning
  • Window scale hotkeys for Windows/Linux (Ctrl + / Ctrl -)
/changelog/2024.5.0
Curl Copy/Import and Tauri 2.0
Show full content

bro: How much you curl?
me: Almost every day
bro: No, I mean how much weight?
me: My p95 is under 100ms!
bro: Huh?

Get ready for Yaak to get supercharged, because I just left my full-time job to pursue it full-time 🥳

The first release is all about Curl–the most popular command line tool for sending network requests. You can now import and export Curl in a number of different ways, so let’s talk about those.

🪂 Import Curl

We, as developers, come in contact with Curl commands all the time. Here are just a few examples where you might be given one:

  • Exporting a single request from Chrome devtools
  • Reading API documentation
  • Installing a library
  • Reproducing a customer’s support request

Now you can quickly import any of these Curl commands into Yaak.

The flags and arguments will be parsed from the command and used to populate a request within Yaak.

Curl commands can be imported in three ways:

  • Click “Import Curl” to create a new request from your clipboard
  • Paste Curl into the URL to overwrite the current request
  • Import a newline-separated file of Curl commands

It’s that easy, but it’s only one side of the story.

Fixes Create requests from Curl

See also: feedback

📋 Copy requests as Curl

Curl commands are one of the best ways to share network requests because most developers already have it installed.

Now, you can quickly copy any Yaak request as Curl via the right-click context menu.

Fixes Copy as curl command

Right-click to copy as Curl

See also: feedback

⬆️ Tauri 2.0

For those that don’t know, Yaak is built on Tauri–a framework for building cross-platform desktop apps with Rust and web technologies.

Tauri 2.0 branding

This release includes an upgrade to the Tauri 2.0 beta which brings a number of cool new APIs, but also a faster RPC framework (how the web frontend shared data with the Rust backend). Yes, yes, I see your glazed-over expression. All you need to know, however, is that things will be snappier when dealing with larger requests and responses.

Other fixes and improvements🎁 New
  • Support Insomnia YAML format
  • Add QUERY HTTP method
  • New community-maintained Arch Linux package
🛠️ Fixed
  • Fix “Create Dropdown” not selecting first item on CmdOrCtrl+N
💄 Improved
  • Autocomplete other request URLs in URL bar
  • Insomnia imports work again(feedback )
  • Surface errors during import failure
  • Hide large GRPC bodies by default(feedback )
  • App menu to open settings now works
  • Show log directory in settings
/changelog/2024.4.0
Yet Another REST Client?
Show full content

Postman, RapidAPI, Insomnia, Hoppscotch, Httpie, Bruno, , and now Yaak? Why do we need another REST Client? I’ve seen variations of this question many times since launch, so I thought it’d be a great topic to kick off the blog.

💫 The tools can still be better

Let me start by introducing myself. My name is Greg and I launched Insomnia in 2014 (under the initial name Bodybuilder 😅) because I needed to interact with the APIs I was building at work and found existing tools to be bloated and hard to use.

With the help of the Chrome Web Store (now defunct), my little side project gained a few thousand organic users in the first year, which was enough to convince me to pursue it full time. I added a paid plan, released it as open-source, and eventually grew revenue to $20k/month in 2019 as a solo founder. Objectively, it was a huge success…

but I was totally burnt out 😮‍💨

After five years of grinding, I accepted an acquisition offer because I was drowning in support tickets (mostly related to technical debt) and open-source discussions (mostly saying “no” to new features) and couldn’t see myself sticking with it for much longer. I’d dug myself into an unsustainable hole and an acquisition was an easy escape.

The combination of burnout and a 9-5 job wasn’t for me. I needed a break and wanted to explore new creative ideas, so I made the tough decision to cut my acquisition term short and return to self-employment. About six months after this transition I discovered Railway, fell in love, and joined as an early engineer. I was building cool stuff again, but just like before I found myself in need of an API client.

Insomnia was still my app of choice at the time, but it was steadily drifting from my initial vision. It transformed from a simple API client to a do-it-all tool for designing, debugging, and testing APIs at a big-company scale. The once-simple app was now full of features I’d never use, just cluttering the experience. It was time for me to find a new tool.

I tried them all, but every tool left me wanting more. It was 2014 all over again.

👨‍💻 An API client for me

Some time later I found myself driving back from a 20-hour road trip alone–due to vehicle troubles–with an empty podcast queue. I spent the trip reflecting on difficult questions; could I build a better app? Was open-source worth it? Could I have avoided burnout? Is it worth trying again?

The thought disappeared after settling back into my daily routine, until a coworker shared Tauri–a cross-platform framework for building desktop apps with web technology and Rust. I was excited to try it but couldn’t think of anything to build… I’m sure you can guess what happened next.

I spent a day making a very bare-bones proof-of-concept, and Yaak was born.

Initial prototype to test sending a single request

I kept working on it, getting more excited as things took shape, until I was spending upwards of 30 hours per week outside my day job. Before work, after work, during lunch, on weekends. I would lay in bed for hours at night writing thoughts in my journal. * Calling it an obsession would be an understatement.* I knew exactly what to build and sprinted towards the finish.

First release shared with friends
🚢 Deciding to ship

After a month of work I sent an early release to friends and coworkers while continuing to tinker in my spare time. I was happy to finally have a tool I enjoyed using but still wasn’t considering a public release, until a handful of Insomnia’s actions changed my mind.

The first was adding a persistent GitHub stars widget, taking up valuable real-estate for no user benefit. It was a small thing, but it made clear a shift toward valuing growth above user experience. I was frustrated, but there was nothing I could do.

More recently, Insomnia forced users to create an account to use the app. This one really hit hard because one of the reasons I started Insomnia was because other apps in the space did exactly this.

Users can tell when they’re not valued, and it feels like shit. This was the first time I felt like the acquisition was a mistake.

Tweet showing my initial reaction

The app I poured 7 years of my life into was now trading its user loyalty for meaningless GitHub stars. The community was outraged [1] [2] and it was my fault.

That’s when the switch flipped in my head. It was time to ship Yaak as a roundabout way of making things right, so I put in another month of work to get a release ready for the public, and announced it.

👀 What the future holds

My goal for the launch was to get enough traction to see if it resonated, and that definitely happened. The launch was modest, only bringing in a few hundred active users, but people have been submitting to the roadmap and even doing weird things like cloning the app and making themes. The signal is high. I’m doing something right, but I need to get it in front of more people.

App stats since Twitter announcement

If there’s one thing I’ve learned over the years, it’s that success takes time and is 95% luck. All of Insomnia’s growth can be attributed to a handful of lucky breaks, so I’m sticking with a simple strategy for now.

  • Build out the Roadmap using community feedback
  • Focus on upcoming core features like Websocket and plugin system
  • Continue sharing my story in posts like this

I’m not sure where Yaak is headed, but I’m excited to find out. Worst case, I have the exact tool I want to use, and that’s a win in my book.


Building great products is a collaborative process, so please take Yaak for a spin and submit your thoughts. Or, if there are any topics you’d like to see covered on this blog, let me know on Twitter/X. I’m always excited to share!

See you soon 👋

/blog/yet-another-api-client
gRPC, Globals, and Menu Filter
Show full content

Great news! Yaak now speaks gRPC, adding yet another tool to the toolkit of REST and GraphQL.

That’s not all you get today though. Be sure to stay ’till the end of the changelog so you don’t miss the other goodies that came along for the ride.

🚀 gRPC Support

gRPC is a performance-focused RPC framework, mostly used for internal communication in microservice architectures. There’s actually 4 types of gRPC calls, all of which are supported in this release of Yaak.

  • Unary → A single request and response, similar to a traditional HTTP request
  • Server Streaming → A single client request resulting in a stream of server messages
  • Client Streaming → A stream of client messages resulting in a single server response
  • Bidirectional Streaming → A stream of client messages server messages intermingled
Protocol buffers and reflection

Unlike text-based formats like JSON or XML, gRPC uses binary protocol buffers (protobuf), making it faster to encode and decode, and more compact. The downside is that humans like you and me can’t read or write protobuf messages, making manually debugging difficult. This is where Yaak comes in.

Field and value autocompletion

To construct a protobuf message Yaak must know the correct structure. For servers with reflection enabled, Yaak will automatically fetch the type descriptions. 🪄 Otherwise, you’ll be prompted to select the *.proto definitions manually.

Like GraphQL, these definitions provide autocomplete and linting to help construct message bodies. To get around the binary format, messages are defined in JSON, which getsn converted to protobuf behind the scenes. Cool, right? gRPC, as easy as JSON.

Authentication and metadata

gRPC uses HTTP/2 for transport so, naturally, also supports standard authentication techniques like Basic Auth and Bearer tokens.

Metadata is also supported and is sent via HTTP/2 headers on the initial client request. Yaak will also show the response metadata from the initial server response, as well as the trailers (like headers, but at the end) on connection close.

Missing in this release

There’s a lot to cover with gRPC, and Yaak doesn’t support everything yet. Two notable missing features are:

  • Binary Metadata → A compliment to the text-based metadata Yaak currently supports
  • Client Certificates → Authenticate using TLS client certificates

Be sure to submit some Feedback if you require these and so they can be prioritized.

🌍 Global Environment Variables

Environments are great for defining things like authentication tokens that differ between development and production. However, sometimes you only need one environment or have something like user_role that has the same value no matter which environment.

Now you can define variables in a global environment any use them anywhere, independent of which “sub environment” is active. Note that conflicting variables within sub-environments will get priority.

Variables defined in the global environment
🕵️ Filterable Menus

Inspired by the wonderful JetBrains IDEs, you can start typing in any dropdown menu to filter. This came about because the CmdOrCtrl+N hotkey now opens the “create” menu instead of creating a new HTTP request. Simply type a few characters to select between HTTP, GraphQL, gRPC, or folder, and continue on your way.

Yet another step towards ditching the mouse 🤘🐭

Also don’t worry, HTTP is still the first option so you can simply hit Enter to quickly create a new HTTP request like before.

Features Tweaks
  • Show request method to sidebar
  • Add “other” text body type
  • Add Import/Create actions to initial empty state
  • CmdOrCtrl+N now opens create dropdown
  • More clear highlighting of variables
  • Prompt for name on folder creation
Fixes

See also: feedback

/changelog/2024.3.0
Cookies and More Response Info
Show full content

This week brings a tasty treat… cookies! 🍪

🍪 New Cookie Management

Cookies are a large part of managing state on the web. Now, any cookies received will be stored in a persistent cookie jar per-workspace. For example, if you submit a POST /login on one request, the auth cookie will also be sent with GET /profile.

Manage cookies from the new cookie dialog

You can also create additional cookie jars and switch between them, useful if testing a multiple users of a single web service.

New cookie dropdown in app header
🔍 Additional Response Info

Yaak now shows more response information like the HTTP version, remote address, and final URL (after redirects).

HTTP version, remote address, and URL in headers tab
Other fixes and improvements💄 Improved
  • URL bar no longer jumps 1px on focus
  • Improved experience when wrapping URL contents on focus
  • Change environment hotkey to CmdOrCtrl+Shift+E to avoid Linux/Windows conflicts
  • Show alert after force-checking for updates
/changelog/2024.2.0
Windows, Linux, and JSONPath
Show full content

Yaak launched just a week ago, but there’s already some new stuff to check out! Let’s dive into the changes.

💽 Windows and Linux Support

Yaak now supports Windows and Linux–available now, from the Downloads Page.

Note: the Windows binary is unsigned so you will need to click through a warning dialog to install it.

🕵️ Response Body Filtering

You can now filter response bodies using JSONPath and XPath. This can be extremely useful for large responses where you only care about a small subset of data.

Fun fact, each of these filter mechanisms is implemented as a plugin so, when the plugin system is ready to go, you’ll be able to extend this as you wish!

🛠️ New Settings Dialog

Say hello to the new settings dialog for configuring preferences like auto-redirect, timeout, and TLS validation. Settings are divided into two sections: global and per-workspace, allowing you to have different configurations for different projects.

New settings dialog
💁 Keyboard Shortcuts Help

One of Yaak’s goals is to be usable without a mouse. There’s still some work left to do in this area, but things are quickly heading in that direction. To learn the ropes, you can now press CmdOrCtrl+? to see a list of all the keyboard shortcuts available in the app.

Keyboard shortcut dialog
Improvements
  • Add support for custom HTTP methods
  • Add sidebar menu item to send the request
  • New and duplicated request now appear directly below the active one
  • Add hotkey hints to empty states
  • Switched icon pack from Radix to Lucide
  • Can now force-set appearance to dark or light
  • Compressed responses are now automatically decompressed
  • Add link to changelog in the settings menu
Fixes
  • Request/response layout now stacks vertically at small sizes
  • (macOS) App header now responds to lack of stoplight buttons when in fullscreen
/changelog/2024.1.0
Hello, World!
Show full content

This is the initial public release of the Yaak desktop app! It’s still early and is not yet feature-complete so please head over to the Roadmap to see what’s upcoming and leave your own feedback.

Example Yaak project
/changelog/2024.0.0