- Published on
The 2026 macOS Developer Productivity Stack — Raycast, Karabiner, Hammerspoon, Homebrew, Ghostty Deep Dive
- Authors

- Name
- Youngju Kim
- @fjvbn20031
Prologue — The Day I Turned Off Spotlight
Around 2022 I turned off Spotlight. To be precise, I rebound cmd-space to Raycast and never went back. That was the start.
"Productivity stack" sounds grand, but it is simple in practice: a bundle of tools that automate and standardize the keys you press hundreds of times a day, the windows you open every day, and the config files you touch every week. In 2026 macOS has never been better at this. Raycast has fully replaced Spotlight. Ghostty is rapidly eating iTerm2's mindshare. AeroSpace removed the last excuse i3 users had for not coming to macOS. Homebrew has made new-Mac setup declarative with brew bundle. mise has become asdf's successor.
This post is not "10 good tools." It is why each tool occupies its slot, what it replaced, and how the pieces interlock — with concrete configs. At the end, a one-line "minimum viable stack."
1 · The Launcher — Raycast Replaced Spotlight
1.1 Why Spotlight Is Not Enough
Spotlight is a search box. Raycast is a command palette. That distinction decides everything.
"Open Slack" works fine in Spotlight. "Open the #ops channel inside the Slack window I already have" does not. "Open the Figma file I saved at 2:14 AM today." "Base64-encode the current clipboard." "Show the Linear ticket I created yesterday." Spotlight gets none of these. Raycast gets all of them. Via one unified model: extensions.
1.2 Raycast in 2026
As of May 2026, the Raycast Store has over 1,300 extensions. GitHub, Linear, Jira, Notion, Slack, VS Code, Docker, Figma, AWS, Vercel — nearly every developer tool has a first-class extension. On top of that, two large shifts.
First, Raycast AI. In late 2025 Raycast integrated OpenAI, Anthropic, and Perplexity models directly into the command palette, and the UI was redesigned in spring 2026. Press tab twice to open AI Chat and run natural-language commands like "format the JSON currently on my clipboard and put it back." Anthropic Claude and OpenAI GPT models are available on the Pro plan (8/month).
Second, MCP (Model Context Protocol) integration. Raycast AI Chat now auto-loads MCP servers, so a local file/git/shell MCP can be invoked directly by the AI inside the launcher. That is the single biggest change of 2026.
1.3 Alfred — Still a Valid Choice
Alfred is not dead. It still wins on stability and on its license model (Powerpack at $42 one-time, versus Raycast Pro's subscription). Memory footprint is 30 to 50 MB, launch latency around 100 ms, both lighter than Raycast (80 to 120 MB, around 200 ms). The downsides: no native AI, and a stagnating extension ecosystem.
My take is simple: if you are starting fresh, Raycast. If you have seven years of Alfred Workflows that work, there is no compelling reason to migrate.
1.4 The First 30 Minutes
After installing Raycast:
Settings -> General -> Hotkeyset tocmd-space. Disable the system Spotlight shortcut atSettings -> Keyboard -> Spotlight.Settings -> Extensions -> Window Managementon. Leave the keybindings empty — Rectangle or AeroSpace will own those.Settings -> AI -> Quick AI Hotkeyblank for now (you will bind it through Karabiner Hyper later).- First five extensions to install:
Brew,GitHub,Visual Studio Code,Color Picker,Quicklinks.
2 · Karabiner-Elements — Caps Lock as Hyper
2.1 What Is a Hyper Key
A Hyper key is a virtual key that behaves as if you pressed shift + control + option + command simultaneously. No reasonable app demands all four modifiers at once, so any shortcut starting with Hyper sits in a "global namespace" that collides with nothing.
The traditional trick is to remap Caps Lock — a near-useless key — to Hyper. Even better, the classic combo: Escape on tap, Hyper on hold. A huge win for Vim users.
2.2 The Karabiner JSON Snippet
A Karabiner-Elements complex modification snippet looks like this.
{
"description": "Caps Lock -> Hyper (Escape on tap)",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "caps_lock",
"modifiers": { "optional": ["any"] }
},
"to": [
{
"key_code": "left_shift",
"modifiers": ["left_control", "left_option", "left_command"]
}
],
"to_if_alone": [
{ "key_code": "escape" }
]
}
]
}
Drop this into ~/.config/karabiner/assets/complex_modifications/ and enable it with one click in the Karabiner Settings Complex Modifications tab.
2.3 What to Bind to Hyper
My recommendation:
Hyper + T-> open terminal (Ghostty)Hyper + B-> browserHyper + S-> SlackHyper + R-> Raycast AI quick invokeHyper + 1..9-> switch AeroSpace workspaces 1..9
You can wire these directly in Karabiner JSON, but the cleaner pattern is app shortcuts via Raycast Quicklinks/Hotkey, system actions via Hammerspoon. Karabiner owns only the "Caps Lock -> Hyper" line.
2.4 Escaping JSON Hell with Goku
Karabiner JSON grows fast. Move to goku (Clojure compiling EDN to JSON) or karabiner.ts (TypeScript) and it becomes much more manageable. In 2026 the two are roughly tied in popularity; for a fresh start the TypeScript flavor has the shorter learning curve.
3 · Hammerspoon — Scripting macOS in Lua
3.1 What Does Hammerspoon Do
Hammerspoon is a desktop automation tool that exposes macOS system APIs to a Lua scripting engine. Window moves, key hooks, USB events, network state, battery — nearly every macOS event arrives as arguments to a Lua function.
The default config is empty. You write what you want in ~/.hammerspoon/init.lua. Changes apply instantly via live reload.
3.2 A First init.lua
local hyper = {"ctrl", "alt", "cmd", "shift"}
-- Hyper + H / L: snap window to left or right half
hs.hotkey.bind(hyper, "H", function()
local win = hs.window.focusedWindow()
local f = win:screen():frame()
win:setFrame({x = f.x, y = f.y, w = f.w / 2, h = f.h})
end)
hs.hotkey.bind(hyper, "L", function()
local win = hs.window.focusedWindow()
local f = win:screen():frame()
win:setFrame({x = f.x + f.w / 2, y = f.y, w = f.w / 2, h = f.h})
end)
-- Hyper + F: maximize without creating a new Space
hs.hotkey.bind(hyper, "F", function()
local win = hs.window.focusedWindow()
win:setFrame(win:screen():frame())
end)
-- Hyper + R: reload config
hs.hotkey.bind(hyper, "R", function()
hs.reload()
hs.alert.show("Hammerspoon reloaded")
end)
Thirty lines replace half of what Rectangle does. For the other half (drag-to-snap, third/two-thirds), layer in a Spoon like WindowGrid or MiroWindowsManager.
3.3 The Bigger Picture — Environment Awareness
The real value of Hammerspoon is not window management; it is using environment changes as triggers.
- HDMI of the conference room monitor plugged in -> silence Slack, enable Do Not Disturb
- Connected to a specific Wi-Fi -> start VPN automatically
- 09:00 with a meeting in Calendar -> swap Karabiner profile to "meeting"
Each of these is 30 to 50 lines of Lua. Hammerspoon operates at a different layer than Raycast or Karabiner because it thinks in system events, not key remaps.
3.4 Hammerspoon vs Karabiner — Division of Labor
They are both automation tools, but at different layers.
- Karabiner transforms the input events themselves. Keyboard-driver level: "Caps Lock key -> Hyper modifier."
- Hammerspoon receives transformed (or system) events and runs Lua. Application level: "Hyper-T pressed -> open Ghostty with the dev profile."
The rule: Karabiner only remaps keys. Everything else is Hammerspoon. That keeps your JSON from exploding.
4 · Homebrew and Brewfile — Build a New Mac in 30 Minutes
4.1 brew Alone Is Not Enough
I have watched people receive a new Mac and type 50 brew install commands by hand. Write one Brewfile instead.
brew bundle reads a Brewfile and converges the machine to a declarative package state. Where brew install is imperative, the Brewfile says "this machine should be in this state." As of 2026 brew bundle supports Homebrew formulae, Cask, Mac App Store, VS Code extensions, Go packages, Cargo packages, uv tools, Flatpak, and krew plugins. One Brewfile describes a polyglot environment.
4.2 A Sample Brewfile
# ~/.config/brew/Brewfile
# Taps
tap "homebrew/bundle"
tap "homebrew/cask-fonts"
# Core CLI tools
brew "git"
brew "gh"
brew "fish"
brew "starship"
brew "mise"
brew "ripgrep"
brew "fd"
brew "fzf"
brew "bat"
brew "eza"
brew "delta"
brew "jq"
brew "yq"
brew "direnv"
brew "lazygit"
brew "neovim"
# Dotfile management
brew "chezmoi"
# Container and cloud
brew "docker"
brew "kubectl"
brew "k9s"
brew "helm"
# Cask apps
cask "raycast"
cask "ghostty"
cask "karabiner-elements"
cask "hammerspoon"
cask "aerospace"
cask "1password"
cask "1password-cli"
cask "cleanshot"
cask "visual-studio-code"
cask "orbstack"
cask "font-jetbrains-mono-nerd-font"
# Mac App Store (requires `brew install mas`)
brew "mas"
mas "Xcode", id: 497799835
# VS Code extensions
vscode "ms-python.python"
vscode "rust-lang.rust-analyzer"
On a fresh Mac:
xcode-select --install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew bundle --file=~/.config/brew/Brewfile
Keep this in chezmoi and new-Mac setup is three commands.
4.3 The brew bundle dump Trap
brew bundle dump writes every currently installed package into a Brewfile. Convenient, dangerous. One-off tools you forgot about get pinned. Maintain Brewfiles by hand. Use dump once for migration, then edit manually.
4.4 brew vs Mac App Store
My rules of thumb:
- Apps that need code signing or Apple ID binding (iWork, sandbox-forced apps): Mac App Store.
- Developer tools where rapid updates matter: brew cask.
- If both are available, brew cask. More automation-friendly.
5 · The Terminal Wars 2026 — iTerm2, Ghostty, WezTerm, Warp
5.1 The Landscape
For years macOS had a single dominant terminal: iTerm2. The landscape shifted in 2024 to 2025. Mitchell Hashimoto (creator of Vagrant, Terraform, Consul) released Ghostty, and in March 2026 Ghostty 1.3 shipped scrollback search and native scrollbars — at which point iTerm2 users started migrating in volume.
| Terminal | Input latency | Output throughput | Built-in multiplexer | AI integration | Config | Price |
|---|---|---|---|---|---|---|
| Ghostty 1.3 | 2 ms | Very high | Yes (tabs/splits) | None | Single ZON file | Free, OSS |
| iTerm2 | 12 ms | Moderate | Yes (rich triggers) | Partial | GUI-driven | Free |
| WezTerm | 3 ms | High | Yes (powerful) | None | Single Lua file | Free, OSS |
| Warp | 8 ms | Moderate | Partial | Deep | Cloud-synced | Free/Team |
| Alacritty | 3 ms | Very high | None | None | YAML | Free, OSS |
(Latency numbers are medians from 2026 benchmark reports; environments vary.)
5.2 Ghostty — The 2026 Default
The recommendation is simple: if you are starting fresh, Ghostty. Reasons:
- Built natively for macOS; system font rendering and event handling feel right.
- Lowest key-to-screen latency on the platform.
- Single
~/.config/ghostty/configfile, text-based, slots directly into your dotfiles. - Adopts modern terminal protocols (ANSI, OSC, Sixel) quickly.
Example config:
# ~/.config/ghostty/config
font-family = JetBrainsMono Nerd Font
font-size = 14
theme = catppuccin-mocha
window-padding-x = 12
window-padding-y = 12
macos-titlebar-style = tabs
window-decoration = false
cursor-style = bar
shell-integration = fish
5.3 iTerm2 — The Giant Worth Staying With
iTerm2's strengths are intact: Triggers, profile branching, shell integration, AppleScript automation — 13 years of features piled up. If you already have dozens of trigger rules wired in, staying on iTerm2 is rational. Starting fresh, there is no reason to.
5.4 WezTerm vs Warp — Two Extremes
- WezTerm wins on cross-platform consistency and Lua-configured expressiveness. If you bounce between macOS, Linux, and Windows with one config, or want a built-in multiplexer to replace tmux, this is the pick.
- Warp is a product that bakes AI into the terminal itself. According to 2026 user reports it correctly diagnoses and suggests fixes for roughly 80% of failed commands. Downsides: cloud dependency and pricing ($15/month/seat for Pro and up). If a company card pays and you like talking to your shell in natural language, it is worth it.
5.5 Recommendation
- Solo developer, shell-heavy: Ghostty.
- Cross-platform, Lua zealot: WezTerm.
- Beginner to intermediate leaning on AI: Warp.
- iTerm2 veteran with a trigger graveyard: stay on iTerm2.
6 · Window Management — Rectangle or AeroSpace
6.1 Rectangle — The Conservative Pick
Rectangle is free, OSS, downloaded outside the App Store. It snaps halves, quarters, sixths, and custom sizes via shortcuts. Versus Magnet: price (free) and multi-monitor behavior (Rectangle is better). As of 2026 it is still the first window manager I recommend on macOS.
6.2 AeroSpace — For Those Who Missed i3
AeroSpace is an i3/Sway-style tiling window manager. It auto-tiles windows and exposes keyboard navigation, resizing, and workspace switching. Critically, it does not require disabling SIP (System Integrity Protection) — a major difference from yabai. That makes it resilient to macOS updates.
Config lives in a single ~/.aerospace.toml.
# ~/.aerospace.toml (excerpt)
start-at-login = true
default-root-container-layout = 'tiles'
[mode.main.binding]
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
alt-shift-h = 'move left'
alt-shift-j = 'move down'
alt-shift-k = 'move up'
alt-shift-l = 'move right'
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-shift-1 = 'move-node-to-workspace 1'
alt-shift-2 = 'move-node-to-workspace 2'
alt-slash = 'layout tiles horizontal vertical'
alt-comma = 'layout accordion horizontal vertical'
The wins are clear: almost no mouse, instant workspace switches (animation-free mode), consistent multi-monitor behavior.
The downsides too: friction with parts of macOS UI (Mission Control, Spotlight in particular), and breaking changes are expected pre-1.0. Still good enough as a daily driver.
6.3 Which One
- Stick to native macOS workflows: Rectangle.
- Keyboard-first, i3-style multiple workspaces: AeroSpace.
- yabai requires disabling SIP and breaks frequently after macOS updates. Not recommended in 2026.
7 · Passwords and Secrets — 1Password CLI vs Bitwarden CLI
7.1 Both Are Good; The Decision Axis Differs
- 1Password: subscription. CLI (
op), Connect Server, Shell Plugins (transparent integrations with AWS CLI, gh, Docker, Stripe, and 100+ other tools), built-in SSH agent. The smoothest developer workflow. - Bitwarden: OSS, self-hostable. CLI plus Bitwarden Secrets Manager (GitHub Actions, GitLab, Kubernetes integrations). Far friendlier pricing.
7.2 Recommended 1Password Pattern
# Put op:// references in your .env and inject at runtime
# .env
DATABASE_URL="op://Engineering/postgres-prod/connection-string"
AWS_ACCESS_KEY_ID="op://Engineering/aws-prod/access-key-id"
# Run
op run --env-file=.env -- npm run dev
Store SSH keys in your 1Password vault and expose them via the built-in SSH agent. Plaintext ~/.ssh/id_* files disappear.
7.3 Bitwarden Pattern
# Log in once, capture a session token
export BW_SESSION="$(bw unlock --raw)"
# Retrieve a secret
bw get password "AWS Production"
For CI, use the Bitwarden Secrets Manager SDK (Go, Python, JS).
7.4 Decision
- Solo developer, SSH-heavy: 1Password.
- 20-person engineering team, cost-sensitive: Bitwarden + Secrets Manager.
- Either way, stop committing plaintext secrets to dotfiles.
8 · Runtime Version Management — Why mise Replaced asdf
8.1 mise — asdf Rewritten in Rust
mise (formerly rtx) was started in 2022 by Jeff Dickey. It reads the same .tool-versions file as asdf and is compatible with asdf plugins. It adds:
- Performance: asdf's shim approach adds about 120 ms per runtime call. mise adds roughly 5 ms when the shell prompt loads. Per-call calls are faster.
- Multiple backends: beyond asdf plugins, mise has core (Node, Python, Go etc. built in), cargo, npm, pipx, ubi, aqua.
envandtasks: replaces parts of direnv and Make.
8.2 Usage
# Global defaults
mise use --global node@22 python@3.13 go@1.23
# Per-project (.mise.toml or .tool-versions)
cd ~/code/myapp
mise use node@20.18 python@3.12
# Tasks
mise tasks add dev -- npm run dev
mise run dev
~/.config/mise/config.toml declares env vars, global tools, licenses, and more.
8.3 Migrating From asdf
mise import brings your asdf setup over in one shot. The shims disappear and shell-call latency drops visibly. Starting fresh: use mise. Big teams already happy on asdf: no forced migration.
9 · Dotfile Strategy — chezmoi vs stow vs Bare Git
9.1 Three Approaches
- Bare git repo: alias
git --git-dir=$HOME/.dotfiles --work-tree=$HOMEto track$HOMEin place. Zero dependencies, maximally minimal. Downside: very easy to push a secret by accident. - GNU stow: a symlink manager.
~/dotfiles/zsh/.zshrcbecomes~/.zshrcviastow zsh. Simple, UNIX-friendly. Downside: no machine branching, no secret handling. - chezmoi: Go templates for OS branching, secret encryption, and
onchangescripts. The most powerful — with a learning curve.
9.2 The 2026 Recommendation — chezmoi
If forced to pick one, chezmoi. Why:
- One command (
chezmoi init https://github.com/<user>/dotfiles) applies the repo on a new machine. .chezmoi.toml.tmplbranches bychezmoi.os == "darwin"and similar to keep macOS and Linux configs in one tree.- Secrets are fetched and decrypted via 1Password, Bitwarden, Keychain, or age. Structurally prevents plaintext pushes.
- Scripts prefixed
run_onchange_re-run only when changed — perfect for invokingbrew bundlewhenever the Brewfile is edited.
9.3 A chezmoi Skeleton
chezmoi init --apply git@github.com:youruser/dotfiles.git
Repository layout:
~/.local/share/chezmoi/
├── .chezmoi.toml.tmpl
├── dot_zshrc.tmpl
├── dot_gitconfig.tmpl
├── private_dot_ssh/
│ └── config
├── run_onchange_install-packages.sh.tmpl
└── README.md
Inside dot_zshrc.tmpl:
export EDITOR=nvim
{{ if eq .chezmoi.os "darwin" -}}
eval "$(/opt/homebrew/bin/brew shellenv)"
{{ end -}}
9.4 Why I Do Not Recommend stow
stow is fine. On a single machine it works. The moment you add a second machine or secrets enter the mix, you will start writing your own branching logic. That is the moment to jump to chezmoi.
10 · Screenshots and Screencasts — CleanShot X, Kap, Loom
10.1 CleanShot X — The 2026 Default
Bind it on top of cmd-shift-4. The differentiators:
- Auto-hides desktop icons
- Built-in annotation, blur, step counters
- "All-in-One" mode: screenshots, GIFs, video, and scrolling captures behind one hotkey
- Optional cloud (
cleanshot.cloud) auto-upload
Priced as a one-time license (or via Setapp). Buy once, lifetime updates. Easy to expense.
10.2 Kap — The OSS Alternative
Kap is a macOS-only OSS screen recorder. Outputs MP4, WebM, and GIF cleanly. Fewer features than CleanShot but free and fast. For quick GIFs alone, Kap is plenty.
10.3 Loom — Async Video Communication
Loom is optimized for one thing: record, share a link. PR comments, design reviews, async standups. CleanShot's cloud mode overlaps functionally, but Loom adds view tracking and reactions.
My split:
- Daily screenshots: CleanShot X.
- Quick GIFs: Kap.
- Async videos to teammates: Loom.
11 · One Diagram That Wires It All Up
At this point it helps to see how the tools chain together.
Caps Lock (Karabiner) ──► Hyper (ctrl+alt+cmd+shift)
│
├─ T ─► Hammerspoon ─► open Ghostty
├─ B ─► Hammerspoon ─► browser
├─ S ─► Hammerspoon ─► Slack
├─ R ─► Raycast AI quick invoke
├─ 1..9 ─► AeroSpace workspace switch
├─ H/J/K/L ─► Hammerspoon ─► half-window snap
└─ Space ─► Raycast command palette (mapped earlier)
The thesis of this whole post lives in that diagram. Karabiner only remaps keys. Hammerspoon only handles system actions. Raycast only owns the command palette. AeroSpace only manages windows. Each tool does one thing well.
12 · The Minimum Viable Stack
For someone starting today, the minimum viable productivity stack.
1. Raycast (Spotlight replacement)
2. Karabiner-Elements (Caps Lock -> Hyper)
3. Ghostty (terminal)
4. Homebrew + Brewfile (declarative install)
5. mise (runtime versions)
6. 1Password or Bitwarden (secrets)
7. chezmoi (dotfiles)
8. Rectangle or AeroSpace (window management)
9. CleanShot X (screenshots)
Add to it only when your workflow shows a real hole. You do not need all nine on day one. Items 1, 2, 3, and 4 alone shift your daily experience within a week.
Epilogue — Tools Are Just Tools
The most common mistake when building a productivity stack is making the tools themselves the goal. Spend a whole day polishing the dotfiles repo, write 100 lines of Karabiner JSON, ship zero code. That is a hobby, not work.
Tools belong only where you press a key 30 times a day, open a window 100 times a day, type the same command 10 times a day. Spend time on measurable friction, default the rest.
The bundle in this post is what I have refined over four years against that principle. It still shifts one or two pieces every year. 2024 was iTerm2 to Ghostty. 2025 was asdf to mise. Late 2025 was yabai to AeroSpace. Late 2026 will be something else. Adapting fast to those shifts is the real productivity.
30-Day Adoption Checklist
- Day 1: Install Raycast, move
cmd-space. Disable Spotlight's shortcut. - Day 2: Install Karabiner-Elements. Map Caps Lock to Hyper, Escape on tap.
- Day 3: Write a first Brewfile. Run
brew bundleonce. - Day 4: Switch to Ghostty. Drop the config file into your dotfiles.
- Day 7: Unify runtime versions under mise.
mise importif you had asdf. - Day 14: Migrate dotfiles to chezmoi. Wire secrets through 1Password/Bitwarden.
- Day 21: Add 5 to 10 personal shortcuts to Hammerspoon
init.lua. - Day 30: Standardize on AeroSpace or Rectangle for window management.
Anti-Patterns
- Hand-editing Karabiner JSON every day -> move to goku or a TS compiler.
brew installwith no Brewfile -> regret it on the next new Mac.- Plaintext
.envin git -> migrate to 1Password/Bitwarden references. - Installing all nine on day one -> stagger items 1 through 4 first, one week at a time.
- Installing yabai fresh -> in 2026, start with AeroSpace.
Coming Next
The next post tackles turning this bundle into a team standard: an in-house Brewfile, chezmoi templates, Raycast extension distribution, onboarding automation. Single-developer workflows and team workflows have different grain. When a 30-person engineering team starts every new hire on the same dotfiles base, the first week looks very different.
References
- Raycast — https://www.raycast.com/
- Raycast AI — https://www.raycast.com/core-features/ai
- Alfred — https://www.alfredapp.com/
- Karabiner-Elements — https://karabiner-elements.pqrs.org/
- Karabiner Complex Modifications — https://ke-complex-modifications.pqrs.org/
- Hammerspoon — https://www.hammerspoon.org/
- Homebrew — https://brew.sh/
- Homebrew Bundle and Brewfile — https://docs.brew.sh/Brew-Bundle-and-Brewfile
- Ghostty — https://ghostty.org/
- iTerm2 — https://iterm2.com/
- WezTerm — https://wezterm.org/
- Warp — https://www.warp.dev/
- Alacritty — https://alacritty.org/
- Rectangle — https://rectangleapp.com/
- AeroSpace — https://github.com/nikitabobko/AeroSpace
- AeroSpace Guide — https://nikitabobko.github.io/AeroSpace/guide
- 1Password CLI — https://developer.1password.com/docs/cli/
- Bitwarden CLI — https://bitwarden.com/help/cli/
- mise-en-place — https://mise.jdx.dev/
- asdf — https://asdf-vm.com/
- chezmoi — https://www.chezmoi.io/
- GNU Stow — https://www.gnu.org/software/stow/
- CleanShot X — https://cleanshot.com/
- Kap — https://getkap.co/
- Loom — https://www.loom.com/