This commit is contained in:
mr0xb 2026-06-03 14:36:50 -04:00
commit 715eb53860
No known key found for this signature in database
57 changed files with 7755 additions and 3 deletions

200
.aerospace.toml Normal file
View file

@ -0,0 +1,200 @@
# Place a copy of this config to ~/.aerospace.toml
# After that, you can edit ~/.aerospace.toml to your liking
# It's not necessary to copy all keys to your config.
# If the key is missing in your config, "default-config.toml" will serve as a fallback
# You can use it to add commands that run after login to macOS user session.
# 'start-at-login' needs to be 'true' for 'after-login-command' to work
# Available commands: https://nikitabobko.github.io/AeroSpace/commands
after-login-command = []
# You can use it to add commands that run after AeroSpace startup.
# 'after-startup-command' is run after 'after-login-command'
# Available commands : https://nikitabobko.github.io/AeroSpace/commands
after-startup-command = [
'exec-and-forget /opt/homebrew/bin/borders active_color=0xff906cff inactive_color=0xff494d64 width=10.0 hidpi=on',
]
# Start AeroSpace at login
start-at-login = true
# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true
# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
accordion-padding = 30
# Possible values: tiles|accordion
default-root-container-layout = 'tiles'
# Possible values: horizontal|vertical|auto
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
# tall monitor (anything higher than wide) gets vertical orientation
default-root-container-orientation = 'auto'
# Possible values: (qwerty|dvorak)
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
key-mapping.preset = 'qwerty'
# Mouse follows focus when focused monitor changes
# Drop it from your config, if you don't like this behavior
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
[workspace-to-monitor-force-assignment]
1 = 'built-in'
2 = 2
3 = 3
# Gaps between windows (inner-*) and between monitor edges (outer-*).
# Possible values:
# - Constant: gaps.outer.top = 8
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
# In this example, 24 is a default value when there is no match.
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
# See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
[gaps]
inner.horizontal = 10
inner.vertical = 10
outer.left = 10
outer.bottom = 10
outer.top = [{ monitor.built-in = 20 }, 58]
outer.right = 10
# 'main' binding mode declaration
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# 'main' binding mode must be always presented
[mode.main.binding]
# All possible keys:
# - Letters. a, b, c, ..., z
# - Numbers. 0, 1, 2, ..., 9
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
# - F-keys. f1, f2, ..., f20
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick,
# leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
# keypadMinus, keypadMultiply, keypadPlus
# - Arrows. left, down, up, right
# All possible modifiers: cmd, alt, ctrl, shift
# All possible commands: https://nikitabobko.github.io/AeroSpace/commands
# You can uncomment this line to open up terminal with alt + enter shortcut
# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
# alt-enter = 'exec-and-forget open -n /System/Applications/Utilities/Terminal.app'
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
alt-slash = 'layout tiles horizontal vertical'
alt-comma = 'layout accordion horizontal vertical'
# See: https://nikitabobko.github.io/AeroSpace/commands#focus
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
# See: https://nikitabobko.github.io/AeroSpace/commands#move
alt-shift-h = 'move left'
alt-shift-j = 'move down'
alt-shift-k = 'move up'
alt-shift-l = 'move right'
# See: https://nikitabobko.github.io/AeroSpace/commands#resize
alt-shift-minus = 'resize smart -50'
alt-shift-equal = 'resize smart +50'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
alt-3 = 'workspace 3'
alt-4 = 'workspace 4'
alt-5 = 'workspace 5'
alt-6 = 'workspace 6'
alt-7 = 'workspace 7'
alt-8 = 'workspace 8'
alt-9 = 'workspace 9'
# alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need
# alt-b = 'workspace B'
# alt-c = 'workspace5C'
# alt-d = 'workspace D'
# alt-e = 'workspace E'
# alt-f = 'workspace F'
# alt-g = 'workspace G'
# alt-i = 'workspace I'
# alt-m = 'workspace M'
# alt-n = 'workspace N'
# alt-o = 'workspace O'
# alt-p = 'workspace P'
# alt-q = 'workspace Q'
# alt-r = 'workspace R'
# alt-s = 'workspace S'
# alt-t = 'workspace T'
# alt-u = 'workspace U'
# alt-v = 'workspace V'
# alt-w = 'workspace W'
# alt-x = 'workspace X'
# alt-y = 'workspace Y'
# alt-z = 'workspace Z'
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
alt-shift-1 = 'move-node-to-workspace 1'
alt-shift-2 = 'move-node-to-workspace 2'
alt-shift-3 = 'move-node-to-workspace 3'
alt-shift-4 = 'move-node-to-workspace 4'
alt-shift-5 = 'move-node-to-workspace 5'
alt-shift-6 = 'move-node-to-workspace 6'
alt-shift-7 = 'move-node-to-workspace 7'
alt-shift-8 = 'move-node-to-workspace 8'
alt-shift-9 = 'move-node-to-workspace 9'
# alt-shift-a = 'move-node-to-workspace A'
# alt-shift-b = 'move-node-to-workspace B'
# alt-shift-c = 'move-node-to-workspace C'
# alt-shift-d = 'move-node-to-workspace D'
# alt-shift-e = 'move-node-to-workspace E'
# alt-shift-f = 'move-node-to-workspace F'
# alt-shift-g = 'move-node-to-workspace G'
# alt-shift-i = 'move-node-to-workspace I'
# alt-shift-m = 'move-node-to-workspace M'
# alt-shift-n = 'move-node-to-workspace N'
# alt-shift-o = 'move-node-to-workspace O'
# alt-shift-p = 'move-node-to-workspace P'
# alt-shift-q = 'move-node-to-workspace Q'
# alt-shift-r = 'move-node-to-workspace R'
# alt-shift-s = 'move-node-to-workspace S'
# alt-shift-t = 'move-node-to-workspace T'
# alt-shift-u = 'move-node-to-workspace U'
# alt-shift-v = 'move-node-to-workspace V'
# alt-shift-w = 'move-node-to-workspace W'
# alt-shift-x = 'move-node-to-workspace X'
# alt-shift-y = 'move-node-to-workspace Y'
# alt-shift-z = 'move-node-to-workspace Z'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth
alt-tab = 'workspace-back-and-forth'
# See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor
alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
alt-shift-semicolon = 'mode service'
# 'service' binding mode declaration.
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
[mode.service.binding]
esc = ['reload-config', 'mode main']
r = ['flatten-workspace-tree', 'mode main'] # reset layout
#s = ['layout sticky tiling', 'mode main'] # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
backspace = ['close-all-windows-but-current', 'mode main']
alt-shift-h = ['join-with left', 'mode main']
alt-shift-j = ['join-with down', 'mode main']
alt-shift-k = ['join-with up', 'mode main']
alt-shift-l = ['join-with right', 'mode main']

27
.config/sketchybar/colors.sh Executable file
View file

@ -0,0 +1,27 @@
#!/bin/bash
# IR Black Color Palette (from Ghostty theme)
export BLACK=0xff000000 # IR Black bg
export WHITE=0xfff1f1f1 # IR Black fg
export RED=0xfffa6c60 # IR Black red
#export GREEN=0xffa8ff60 # IR Black green
export GREEN=0xff906cff # PURPLE
export BLUE=0xff96cafe # IR Black blue
export YELLOW=0xfffffeb7 # IR Black yellow
export ORANGE=0xfffcb6b0 # IR Black bright red (warm accent)
export MAGENTA=0xfffa73fd # IR Black magenta
export CYAN=0xffc6c5fe # IR Black cyan/lavender
export GREY=0xff4f4f4f # IR Black dim
export TRANSPARENT=0x00000000
# Bar colors with IR Black background
export BAR_COLOR=0xa0000000 # IR Black bg with transparency
export ICON_COLOR=$WHITE # Color of all icons
export LABEL_COLOR=$WHITE # Color of all labels
export BACKGROUND_1=0x90000000 # IR Black bg
export BACKGROUND_2=0x604f4f4f # IR Black dim, semi-transparent
export POPUP_BACKGROUND_COLOR=0xff000000
export POPUP_BORDER_COLOR=$GREEN
export SHADOW_COLOR=$BLACK

View file

@ -0,0 +1,26 @@
#!/bin/bash
# Gruvbox Dark Hard Color Palette
export BLACK=0xff1d2021 # Gruvbox bg
export WHITE=0xffd5c4a1 # Gruvbox fg
export RED=0xfffb4934 # Gruvbox red
export GREEN=0xffb8bb26 # Gruvbox green (active workspace)
export BLUE=0xff83a598 # Gruvbox blue (front app icon)
export YELLOW=0xfffabd2f # Gruvbox yellow/gold (apple icon)
export ORANGE=0xfffe8019 # Gruvbox orange
export MAGENTA=0xffd3869b # Gruvbox magenta
export CYAN=0xff8ec07c # Gruvbox cyan/aqua
export GREY=0xff665c54 # Gruvbox grey
export TRANSPARENT=0x00000000
# Bar colors with Gruvbox background tones
export BAR_COLOR=0xa01d2021 # Gruvbox bg with transparency
export ICON_COLOR=$WHITE # Color of all icons
export LABEL_COLOR=$WHITE # Color of all labels
export BACKGROUND_1=0x901d2021 # Gruvbox bg
export BACKGROUND_2=0x903c3836 # Gruvbox bg1
export POPUP_BACKGROUND_COLOR=0xff1d2021
export POPUP_BORDER_COLOR=$YELLOW
export SHADOW_COLOR=$BLACK

View file

@ -0,0 +1,26 @@
#!/bin/bash
aerospace_workspace_change() {
source "$CONFIG_DIR/colors.sh"
CURRENT_WORKSPACE=$(aerospace list-workspaces --focused)
args=()
while read -r line
do
if [[ $line =~ (aerospace\.workspace\.[0-9]+) ]]; then
WORKSPACE_NUMBER=${line##*.}
if [ "$WORKSPACE_NUMBER" = "$CURRENT_WORKSPACE" ]; then
args+=(--set "${line}" icon.highlight=on)
else
args+=(--set "${line}" icon.highlight=off)
fi
fi
done <<< "$(sketchybar --query bar | jq -r '.items[]')"
[ ${#args[@]} -gt 0 ] && sketchybar "${args[@]}"
}
case "$SENDER" in
"aerospace_workspace_change") aerospace_workspace_change
;;
esac

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,455 @@
return {
["Live"] = ":ableton:",
["Acrobat"] = ":acrobat:",
["Activity Monitor"] = ":activity_monitor:",
["Aktivitätsanzeige"] = ":activity_monitor:",
["Adobe Bridge"] = ":adobe_bridge:",
["AFFiNE"] = ":affine:",
["Affinity Designer"] = ":affinity_designer:",
["Affinity Designer 2"] = ":affinity_designer_2:",
["Affinity Photo"] = ":affinity_photo:",
["Affinity Photo 2"] = ":affinity_photo_2:",
["Affinity Publisher"] = ":affinity_publisher:",
["Affinity Publisher 2"] = ":affinity_publisher_2:",
["Airmail"] = ":airmail:",
["AirPort Utility"] = ":airport_utility:",
["Alacritty"] = ":alacritty:",
["Alfred"] = ":alfred:",
["Android Messages"] = ":android_messages:",
["Android Studio"] = ":android_studio:",
["Anki"] = ":anki:",
["Anytype"] = ":anytype:",
["Apifox"] = ":apifox:",
["App Eraser"] = ":app_eraser:",
["App Store"] = ":app_store:",
["Arc"] = ":arc:",
["Arduino"] = ":arduino:",
["Arduino IDE"] = ":arduino:",
["Atom"] = ":atom:",
["Audacity"] = ":audacity:",
["balenaEtcher"] = ":balena_etcher:",
["Bambu Studio"] = ":bambu_studio:",
["MoneyMoney"] = ":bank:",
["Battle.net"] = ":battle_net:",
["Bazecor"] = ":bazecor:",
["Bear"] = ":bear:",
["BetterTouchTool"] = ":bettertouchtool:",
["Bilibili"] = ":bilibili:",
["哔哩哔哩"] = ":bilibili:",
["Bitwarden"] = ":bit_warden:",
["Blender"] = ":blender:",
["Blitzit"] = ":blitzit:",
["BluOS Controller"] = ":bluos_controller:",
["Books"] = ":book:",
["Calibre"] = ":book:",
["Bücher"] = ":book:",
["Brave Browser"] = ":brave_browser:",
["Bruno"] = ":bruno:",
["BusyCal"] = ":busycal:",
["Calculator"] = ":calculator:",
["Calculette"] = ":calculator:",
["Rechner"] = ":calculator:",
["Calendar"] = ":calendar:",
["日历"] = ":calendar:",
["Fantastical"] = ":calendar:",
["Cron"] = ":calendar:",
["Amie"] = ":calendar:",
["Calendrier"] = ":calendar:",
["カレンダー"] = ":calendar:",
["Notion Calendar"] = ":calendar:",
["Kalender"] = ":calendar:",
["calibre"] = ":calibre:",
["Capacities"] = ":capacities:",
["Caprine"] = ":caprine:",
["Amazon Chime"] = ":chime:",
["Cisco AnyConnect Secure Mobility Client"] = ":cisco_anyconnect:",
["Cisco Secure Client"] = ":cisco_anyconnect:",
["Citrix Workspace"] = ":citrix:",
["Citrix Viewer"] = ":citrix:",
["Claude"] = ":claude:",
["ClickUp"] = ":click_up:",
["Code"] = ":code:",
["Code - Insiders"] = ":code:",
["Cold Turkey Blocker"] = ":cold_turkey_blocker:",
["Color Picker"] = ":color_picker:",
["数码测色计"] = ":color_picker:",
["Comet"] = ":comet:",
["Copilot"] = ":copilot:",
["CotEditor"] = ":coteditor:",
["Creative Cloud"] = ":creative_cloud:",
["Cursor"] = ":cursor:",
["Cypress"] = ":cypress:",
["DataGrip"] = ":datagrip:",
["DataSpell"] = ":dataspell:",
["DaVinci Resolve"] = ":davinciresolve:",
["DBeaver"] = ":dbeaver:",
["DeepSeek"] = ":deepseek:",
["Deezer"] = ":deezer:",
["Default"] = ":default:",
["deno"] = ":deno:",
["CleanMyMac X"] = ":desktop:",
["DEVONthink 3"] = ":devonthink3:",
["Dexcom"] = ":dexcom:",
["Dia"] = ":dia:",
["DingTalk"] = ":dingtalk:",
["钉钉"] = ":dingtalk:",
["阿里钉"] = ":dingtalk:",
["Discord"] = ":discord:",
["Discord Canary"] = ":discord:",
["Discord PTB"] = ":discord:",
["Docker"] = ":docker:",
["Docker Desktop"] = ":docker:",
["GrandTotal"] = ":dollar:",
["Receipts"] = ":dollar:",
["Double Commander"] = ":doublecmd:",
["Drafts"] = ":drafts:",
["draw.io"] = ":draw_io:",
["Dropbox"] = ":dropbox:",
["Eagle"] = ":eagle:",
["Element"] = ":element:",
["Emacs"] = ":emacs:",
["Evernote Legacy"] = ":evernote_legacy:",
["FaceTime"] = ":face_time:",
["FaceTime 通话"] = ":face_time:",
["Feishu"] = ":feishu:",
["Figma"] = ":figma:",
["Final Cut Pro"] = ":final_cut_pro:",
["Finder"] = ":finder:",
["访达"] = ":finder:",
["Firefox"] = ":firefox:",
["Firefox Developer Edition"] = ":firefox_developer_edition:",
["Firefox Nightly"] = ":firefox_developer_edition:",
["FL Studio"] = ":flstudio:",
["Folx"] = ":folx:",
["Fork"] = ":fork:",
["Foxit PDF Reader"] = ":foxit_reader:",
["FreeCAD"] = ":freecad:",
["Freeform"] = ":freeform:",
["FreeTube"] = ":freetube:",
["Fusion"] = ":fusion:",
["System Preferences"] = ":gear:",
["System Settings"] = ":gear:",
["系统设置"] = ":gear:",
["Réglages Système"] = ":gear:",
["システム設定"] = ":gear:",
["Systemeinstellungen"] = ":gear:",
["System­einstellungen"] = ":gear:",
["Ghostty"] = ":ghostty:",
["GIMP"] = ":gimp:",
["GitHub Desktop"] = ":git_hub:",
["Godot"] = ":godot:",
["GoLand"] = ":goland:",
["Goodnotes"] = ":goodnotes:",
["Chromium"] = ":google_chrome:",
["Google Chrome"] = ":google_chrome:",
["Google Chrome Canary"] = ":google_chrome:",
["Grammarly Editor"] = ":grammarly:",
["Granola"] = ":granola:",
["Grayjay"] = ":grayjay:",
["Helium"] = ":helium:",
["Home Assistant"] = ":home_assistant:",
["Hyper"] = ":hyper:",
["IntelliJ IDEA"] = ":idea:",
["IINA"] = ":iina:",
["Adobe Illustrator"] = ":illustrator:",
["Illustrator"] = ":illustrator:",
["Adobe InDesign"] = ":indesign:",
["InDesign"] = ":indesign:",
["Infuse"] = ":infuse:",
["Inkdrop"] = ":inkdrop:",
["Inkscape"] = ":inkscape:",
["Insomnia"] = ":insomnia:",
["iPhone Mirroring"] = ":iphone_mirroring:",
["Iris"] = ":iris:",
["iTerm"] = ":iterm:",
["iTerm2"] = ":iterm:",
["Jellyfin Media Player"] = ":jellyfin:",
["JetBrains Gateway"] = ":jetbrains_gateway:",
["JetBrains Toolbox"] = ":jetbrains_toolbox:",
["Joplin"] = ":joplin:",
["카카오톡"] = ":kakaotalk:",
["KakaoTalk"] = ":kakaotalk:",
["Kakoune"] = ":kakoune:",
["KeePassXC"] = ":kee_pass_x_c:",
["Keyboard Maestro"] = ":keyboard_maestro:",
["Keynote"] = ":keynote:",
["Keynote 讲演"] = ":keynote:",
["KiCad"] = ":kicad:",
["Kiro"] = ":kiro:",
["kitty"] = ":kitty:",
["Kodi"] = ":kodi:",
["LanguageTool for Desktop"] = ":languagetool_for_desktop:",
["League of Legends"] = ":league_of_legends:",
["LibreWolf"] = ":libre_wolf:",
["LibreOffice"] = ":libreoffice:",
["Adobe Lightroom"] = ":lightroom:",
["Lightroom Classic"] = ":lightroomclassic:",
["LINE"] = ":line:",
["Linear"] = ":linear:",
["LM Studio"] = ":lm_studio:",
["LocalSend"] = ":localsend:",
["Logic Pro"] = ":logicpro:",
["Logseq"] = ":logseq:",
["MacPass"] = ":macpass:",
["Canary Mail"] = ":mail:",
["HEY"] = ":mail:",
["Mail"] = ":mail:",
["Mailspring"] = ":mail:",
["MailMate"] = ":mail:",
["Superhuman"] = ":mail:",
["Spark"] = ":mail:",
["邮件"] = ":mail:",
["メール"] = ":mail:",
["MAMP"] = ":mamp:",
["MAMP PRO"] = ":mamp:",
["Maps"] = ":maps:",
["Google Maps"] = ":maps:",
["マップ"] = ":maps:",
["Karten"] = ":maps:",
["Marta"] = ":marta:",
["Matlab"] = ":matlab:",
["MATLAB"] = ":matlab:",
["MATLABWindow"] = ":matlab:",
["MATLAB_R2024b"] = ":matlab:",
["MATLAB_R2024a"] = ":matlab:",
["MATLAB_R2023b"] = ":matlab:",
["MATLAB_R2023a"] = ":matlab:",
["MATLAB_R2022b"] = ":matlab:",
["MATLAB_R2022a"] = ":matlab:",
["MATLAB_R2021b"] = ":matlab:",
["MATLAB_R2021a"] = ":matlab:",
["Mattermost"] = ":mattermost:",
["Google Meet"] = ":meet:",
["Messages"] = ":messages:",
["信息"] = ":messages:",
["Nachrichten"] = ":messages:",
["メッセージ"] = ":messages:",
["Messenger"] = ":messenger:",
["Microsoft Edge"] = ":microsoft_edge:",
["Microsoft Excel"] = ":microsoft_excel:",
["Microsoft Outlook"] = ":microsoft_outlook:",
["Microsoft PowerPoint"] = ":microsoft_power_point:",
["Microsoft Remote Desktop"] = ":microsoft_remote_desktop:",
["Microsoft Teams"] = ":microsoft_teams:",
["Microsoft Teams (work or school)"] = ":microsoft_teams:",
["Microsoft Word"] = ":microsoft_word:",
["Mimestream"] = ":mimestream:",
["Min"] = ":min_browser:",
["Miro"] = ":miro:",
["MongoDB Compass"] = ":mongodb:",
["Moonlight"] = ":moonlight:",
["mpv"] = ":mpv:",
["Mullvad Browser"] = ":mullvad_browser:",
["Music"] = ":music:",
["音乐"] = ":music:",
["Musique"] = ":music:",
["ミュージック"] = ":music:",
["Musik"] = ":music:",
["Navicat Premium"] = ":navicat:",
["Neovide"] = ":neovide:",
["neovide"] = ":neovide:",
["Neovim"] = ":neovim:",
["neovim"] = ":neovim:",
["nvim"] = ":neovim:",
["网易云音乐"] = ":netease_music:",
["NetEaseMusic"] = ":netease_music:",
["News"] = ":news:",
["Nextcloud"] = ":nextcloud:",
["Nicotine+"] = ":nicotine_plus:",
["Nimble Commander"] = ":nimble_commander:",
["NimbleCommander-Unsigned"] = ":nimble_commander:",
["Noodl"] = ":noodl:",
["Noodl Editor"] = ":noodl:",
["NordVPN"] = ":nord_vpn:",
["Notability"] = ":notability:",
["Notes"] = ":notes:",
["备忘录"] = ":notes:",
["メモ"] = ":notes:",
["Notizen"] = ":notes:",
["Notion"] = ":notion:",
["Notion Mail"] = ":notion_mail:",
["Nova"] = ":nova:",
["Numbers"] = ":numbers:",
["Numbers 表格"] = ":numbers:",
["Obsidian"] = ":obsidian:",
["OBS"] = ":obsstudio:",
["OmniFocus"] = ":omni_focus:",
["1Password"] = ":one_password:",
["Open Video Downloader"] = ":open_video_downloader:",
["ChatGPT"] = ":openai:",
["OpenAI Translator"] = ":openai_translator:",
["OpenVPN Connect"] = ":openvpn_connect:",
["Opera"] = ":opera:",
["OrbStack"] = ":orbstack:",
["OrcaSlicer"] = ":orcaslicer:",
["Orion"] = ":orion:",
["Orion RC"] = ":orion:",
["Overleaf"] = ":overleaf:",
["ShareLaTeX"] = ":overleaf:",
["Pages"] = ":pages:",
["Pages 文稿"] = ":pages:",
["Parallels Desktop"] = ":parallels:",
["Parsec"] = ":parsec:",
["Passepartout"] = ":passepartout:",
["Passwords"] = ":passwords:",
["Passwörter"] = ":passwords:",
["PDF Expert"] = ":pdf_expert:",
["Pearcleaner"] = ":pearcleaner:",
["Perplexity"] = ":perplexity:",
["Perplexity AI"] = ":perplexity:",
["Phoenix Slides"] = ":phoenix_slides:",
["Photos"] = ":photos:",
["Fotos"] = ":photos:",
["Adobe Photoshop"] = ":photoshop:",
["PhpStorm"] = ":php_storm:",
["Pi-hole Remote"] = ":pihole:",
["Pine"] = ":pine:",
["Plex"] = ":plex:",
["Plexamp"] = ":plexamp:",
["Podcasts"] = ":podcasts:",
["播客"] = ":podcasts:",
["PomoDone App"] = ":pomodone:",
["Postman"] = ":postman:",
["Premiere"] = ":premiere:",
["Adobe Premiere"] = ":premiere:",
["Adobe Premiere Pro 2024"] = ":premiere:",
["Preview"] = ":preview:",
["预览"] = ":preview:",
["Skim"] = ":preview:",
["zathura"] = ":preview:",
["Aperçu"] = ":preview:",
["プレビュー"] = ":preview:",
["Vorschau"] = ":preview:",
["Proton Mail"] = ":proton_mail:",
["Proton Mail Bridge"] = ":proton_mail:",
["Proton VPN"] = ":proton_vpn:",
["ProtonVPN"] = ":proton_vpn:",
["PrusaSlicer"] = ":prusaslicer:",
["SuperSlicer"] = ":prusaslicer:",
["PyCharm"] = ":pycharm:",
["qBittorrent"] = ":qbittorrent:",
["QLMarkdown"] = ":qlmarkdown:",
["QQ"] = ":qq:",
["QQ音乐"] = ":qqmusic:",
["QQMusic"] = ":qqmusic:",
["Quantumult X"] = ":quantumult_x:",
["Quip"] = ":quip:",
["qutebrowser"] = ":qute_browser:",
["Raindrop.io"] = ":raindrop_io:",
["Raspberry Pi Imager"] = ":raspberry_pi:",
["Raspberry Pi Connect"] = ":raspberry_pi:",
["Raycast"] = ":raycast:",
["Reeder"] = ":reeder5:",
["rekordbox"] = ":rekordbox:",
["Reminders"] = ":reminders:",
["提醒事项"] = ":reminders:",
["Rappels"] = ":reminders:",
["リマインダー"] = ":reminders:",
["Erinnerungen"] = ":reminders:",
["Replit"] = ":replit:",
["Repo Prompt"] = ":repo_prompt:",
["Rider"] = ":rider:",
["JetBrains Rider"] = ":rider:",
["Rio"] = ":rio:",
["Royal TSX"] = ":royaltsx:",
["RustDesk"] = ":rustdesk:",
["Safari"] = ":safari:",
["Safari浏览器"] = ":safari:",
["Safari Technology Preview"] = ":safari:",
["Scribus"] = ":scribus:",
["Seafile"] = ":seafile:",
["Sequel Ace"] = ":sequel_ace:",
["Sequel Pro"] = ":sequel_pro:",
["Session"] = ":session:",
["Setapp"] = ":setapp:",
["SF Symbols"] = ":sf_symbols:",
["SF Symbole"] = ":sf_symbols:",
["SF-Symbole"] = ":sf_symbols:",
["Shortcuts"] = ":shortcuts:",
["Signal"] = ":signal:",
["sioyek"] = ":sioyek:",
["Sketch"] = ":sketch:",
["Skype"] = ":skype:",
["Slack"] = ":slack:",
["Spark Desktop"] = ":spark:",
["Spotify"] = ":spotify:",
["Spotlight"] = ":spotlight:",
["Steam"] = ":steam:",
["Steam Helper"] = ":steam:",
["Studio 3T"] = ":studio_3t:",
["Sublime Text"] = ":sublime_text:",
["Summoners War"] = ":summoners_war:",
["superProductivity"] = ":superproductivity:",
["Surfshark"] = ":surfshark:",
["T3 Chat"] = ":t3chat:",
["Tabby"] = ":tabby:",
["TablePlus"] = ":tableplus:",
["Tana"] = ":tana:",
["TeamSpeak 3"] = ":team_speak:",
["Telegram"] = ":telegram:",
["Terminal"] = ":terminal:",
["终端"] = ":terminal:",
["ターミナル"] = ":terminal:",
["Termius"] = ":termius:",
["Typora"] = ":text:",
["TextEdit"] = ":textedit:",
["Microsoft To Do"] = ":things:",
["Things"] = ":things:",
["Thunderbird"] = ":thunderbird:",
["Thunderbird Daily"] = ":thunderbird:",
["TickTick"] = ":tick_tick:",
["TIDAL"] = ":tidal:",
["Tiny RDM"] = ":tinyrdm:",
["Todoist"] = ":todoist:",
["Toggl Track"] = ":toggl_track:",
["Tor Browser"] = ":tor_browser:",
["Tower"] = ":tower:",
["TradingView"] = ":trading_view:",
["Transmit"] = ":transmit:",
["Trello"] = ":trello:",
["Tweetbot"] = ":twitter:",
["Twitter"] = ":twitter:",
["UTM"] = ":utm:",
["VeraCrypt"] = ":veracrypt:",
["MacVim"] = ":vim:",
["Vim"] = ":vim:",
["VimR"] = ":vim:",
["Vivaldi"] = ":vivaldi:",
["VLC"] = ":vlc:",
["VMware Fusion"] = ":vmware_fusion:",
["Vorta"] = ":vorta:",
["VSCodium"] = ":vscodium:",
["Warp"] = ":warp:",
["Weather"] = ":weather:",
["Wetter"] = ":weather:",
["WebStorm"] = ":web_storm:",
["Webull Desktop"] = ":webull:",
["微信"] = ":wechat:",
["WeChat"] = ":wechat:",
["企业微信"] = ":wecom:",
["WeCom"] = ":wecom:",
["WezTerm"] = ":wezterm:",
["wezterm-gui"] = ":wezterm:",
["WhatsApp"] = ":whats_app:",
["WhatsApp"] = ":whats_app:",
["Windows App"] = ":windows_app:",
["WireGuard"] = ":wireguard:",
["Xcode"] = ":xcode:",
["Yandex Browser"] = ":yandex_bower:",
["Yandex Browser"] = ":yandex_bower:",
["Yandex"] = ":yandex_bower:",
["Yandex Music"] = ":yandex_music:",
["Yazi"] = ":yazi:",
["yazi"] = ":yazi:",
["YouTube"] = ":youtube:",
["YouTube Music"] = ":youtube_music:",
["Yuque"] = ":yuque:",
["语雀"] = ":yuque:",
["Zed"] = ":zed:",
["Zen"] = ":zen_browser:",
["Zen Browser"] = ":zen_browser:",
["Zeplin"] = ":zeplin:",
["zoom.us"] = ":zoom:",
["Zotero"] = ":zotero:",
["Zulip"] = ":zulip:",
}

View file

@ -0,0 +1,986 @@
#!/usr/bin/env bash
### START-OF-ICON-MAP
function __icon_map() {
case "$1" in
"Live")
icon_result=":ableton:"
;;
"Acrobat")
icon_result=":acrobat:"
;;
"Activity Monitor" | "Aktivitätsanzeige")
icon_result=":activity_monitor:"
;;
"Adobe Bridge"*)
icon_result=":adobe_bridge:"
;;
"AFFiNE")
icon_result=":affine:"
;;
"Affinity Designer")
icon_result=":affinity_designer:"
;;
"Affinity Designer 2")
icon_result=":affinity_designer_2:"
;;
"Affinity Photo")
icon_result=":affinity_photo:"
;;
"Affinity Photo 2")
icon_result=":affinity_photo_2:"
;;
"Affinity Publisher")
icon_result=":affinity_publisher:"
;;
"Affinity Publisher 2")
icon_result=":affinity_publisher_2:"
;;
"Airmail")
icon_result=":airmail:"
;;
"AirPort Utility")
icon_result=":airport_utility:"
;;
"Alacritty")
icon_result=":alacritty:"
;;
"Alfred")
icon_result=":alfred:"
;;
"Android Messages")
icon_result=":android_messages:"
;;
"Android Studio")
icon_result=":android_studio:"
;;
"Anki")
icon_result=":anki:"
;;
"Anytype")
icon_result=":anytype:"
;;
"Apifox")
icon_result=":apifox:"
;;
"App Eraser")
icon_result=":app_eraser:"
;;
"App Store")
icon_result=":app_store:"
;;
"Arc")
icon_result=":arc:"
;;
"Arduino" | "Arduino IDE")
icon_result=":arduino:"
;;
"Atom")
icon_result=":atom:"
;;
"Audacity")
icon_result=":audacity:"
;;
"balenaEtcher")
icon_result=":balena_etcher:"
;;
"Bambu Studio")
icon_result=":bambu_studio:"
;;
"MoneyMoney")
icon_result=":bank:"
;;
"Battle.net")
icon_result=":battle_net:"
;;
"Bazecor")
icon_result=":bazecor:"
;;
"Bear")
icon_result=":bear:"
;;
"BetterTouchTool")
icon_result=":bettertouchtool:"
;;
"Bilibili" | "哔哩哔哩")
icon_result=":bilibili:"
;;
"Bitwarden")
icon_result=":bit_warden:"
;;
"Blender")
icon_result=":blender:"
;;
"Blitzit")
icon_result=":blitzit:"
;;
"BluOS Controller")
icon_result=":bluos_controller:"
;;
"Books" | "Calibre" | "Bücher")
icon_result=":book:"
;;
"Brave Browser")
icon_result=":brave_browser:"
;;
"Bruno")
icon_result=":bruno:"
;;
"BusyCal")
icon_result=":busycal:"
;;
"Calculator" | "Calculette" | "Rechner")
icon_result=":calculator:"
;;
"Calendar" | "日历" | "Fantastical" | "Cron" | "Amie" | "Calendrier" | "カレンダー" | "Notion Calendar" | "Kalender")
icon_result=":calendar:"
;;
"calibre")
icon_result=":calibre:"
;;
"Capacities")
icon_result=":capacities:"
;;
"Caprine")
icon_result=":caprine:"
;;
"Amazon Chime")
icon_result=":chime:"
;;
"Cisco AnyConnect Secure Mobility Client" | "Cisco Secure Client")
icon_result=":cisco_anyconnect:"
;;
"Citrix Workspace" | "Citrix Viewer")
icon_result=":citrix:"
;;
"Claude")
icon_result=":claude:"
;;
"ClickUp")
icon_result=":click_up:"
;;
"Code" | "Code - Insiders")
icon_result=":code:"
;;
"Cold Turkey Blocker")
icon_result=":cold_turkey_blocker:"
;;
"Color Picker" | "数码测色计")
icon_result=":color_picker:"
;;
"Comet")
icon_result=":comet:"
;;
"Copilot")
icon_result=":copilot:"
;;
"CotEditor")
icon_result=":coteditor:"
;;
"Creative Cloud")
icon_result=":creative_cloud:"
;;
"Cursor")
icon_result=":cursor:"
;;
"Cypress")
icon_result=":cypress:"
;;
"DataGrip")
icon_result=":datagrip:"
;;
"DataSpell")
icon_result=":dataspell:"
;;
"DaVinci Resolve")
icon_result=":davinciresolve:"
;;
"DBeaver")
icon_result=":dbeaver:"
;;
"DeepSeek")
icon_result=":deepseek:"
;;
"Deezer")
icon_result=":deezer:"
;;
"Default")
icon_result=":default:"
;;
"deno")
icon_result=":deno:"
;;
"CleanMyMac X")
icon_result=":desktop:"
;;
"DEVONthink 3")
icon_result=":devonthink3:"
;;
"Dexcom")
icon_result=":dexcom:"
;;
"Dia")
icon_result=":dia:"
;;
"DingTalk" | "钉钉" | "阿里钉")
icon_result=":dingtalk:"
;;
"Discord" | "Discord Canary" | "Discord PTB")
icon_result=":discord:"
;;
"Docker" | "Docker Desktop")
icon_result=":docker:"
;;
"GrandTotal" | "Receipts")
icon_result=":dollar:"
;;
"Double Commander")
icon_result=":doublecmd:"
;;
"Drafts")
icon_result=":drafts:"
;;
"draw.io")
icon_result=":draw_io:"
;;
"Dropbox")
icon_result=":dropbox:"
;;
"Eagle")
icon_result=":eagle:"
;;
"Element")
icon_result=":element:"
;;
"Emacs")
icon_result=":emacs:"
;;
"Evernote Legacy")
icon_result=":evernote_legacy:"
;;
"FaceTime" | "FaceTime 通话")
icon_result=":face_time:"
;;
"Feishu")
icon_result=":feishu:"
;;
"Figma")
icon_result=":figma:"
;;
"Final Cut Pro")
icon_result=":final_cut_pro:"
;;
"Finder" | "访达")
icon_result=":finder:"
;;
"Firefox")
icon_result=":firefox:"
;;
"Firefox Developer Edition" | "Firefox Nightly")
icon_result=":firefox_developer_edition:"
;;
"FL Studio")
icon_result=":flstudio:"
;;
"Folx")
icon_result=":folx:"
;;
"Fork")
icon_result=":fork:"
;;
"Foxit PDF Reader")
icon_result=":foxit_reader:"
;;
"FreeCAD")
icon_result=":freecad:"
;;
"Freeform")
icon_result=":freeform:"
;;
"FreeTube")
icon_result=":freetube:"
;;
"Fusion")
icon_result=":fusion:"
;;
"System Preferences" | "System Settings" | "系统设置" | "Réglages Système" | "システム設定" | "Systemeinstellungen" | "System­einstellungen")
icon_result=":gear:"
;;
"Ghostty")
icon_result=":ghostty:"
;;
"GIMP")
icon_result=":gimp:"
;;
"GitHub Desktop")
icon_result=":git_hub:"
;;
"Godot")
icon_result=":godot:"
;;
"GoLand")
icon_result=":goland:"
;;
"Goodnotes")
icon_result=":goodnotes:"
;;
"Chromium" | "Google Chrome" | "Google Chrome Canary")
icon_result=":google_chrome:"
;;
"Grammarly Editor")
icon_result=":grammarly:"
;;
"Granola")
icon_result=":granola:"
;;
"Grayjay")
icon_result=":grayjay:"
;;
"Helium")
icon_result=":helium:"
;;
"Home Assistant")
icon_result=":home_assistant:"
;;
"Hyper")
icon_result=":hyper:"
;;
"IntelliJ IDEA")
icon_result=":idea:"
;;
"IINA")
icon_result=":iina:"
;;
"Adobe Illustrator"* | "Illustrator")
icon_result=":illustrator:"
;;
"Adobe InDesign"* | "InDesign")
icon_result=":indesign:"
;;
"Infuse")
icon_result=":infuse:"
;;
"Inkdrop")
icon_result=":inkdrop:"
;;
"Inkscape")
icon_result=":inkscape:"
;;
"Insomnia")
icon_result=":insomnia:"
;;
"iPhone Mirroring")
icon_result=":iphone_mirroring:"
;;
"Iris")
icon_result=":iris:"
;;
"iTerm" | "iTerm2")
icon_result=":iterm:"
;;
"Jellyfin Media Player")
icon_result=":jellyfin:"
;;
"JetBrains Gateway")
icon_result=":jetbrains_gateway:"
;;
"JetBrains Toolbox")
icon_result=":jetbrains_toolbox:"
;;
"Joplin")
icon_result=":joplin:"
;;
"카카오톡" | "KakaoTalk")
icon_result=":kakaotalk:"
;;
"Kakoune")
icon_result=":kakoune:"
;;
"KeePassXC")
icon_result=":kee_pass_x_c:"
;;
"Keyboard Maestro")
icon_result=":keyboard_maestro:"
;;
"Keynote" | "Keynote 讲演")
icon_result=":keynote:"
;;
"KiCad")
icon_result=":kicad:"
;;
"Kiro")
icon_result=":kiro:"
;;
"kitty")
icon_result=":kitty:"
;;
"Kodi")
icon_result=":kodi:"
;;
"LanguageTool for Desktop")
icon_result=":languagetool_for_desktop:"
;;
"League of Legends")
icon_result=":league_of_legends:"
;;
"LibreWolf")
icon_result=":libre_wolf:"
;;
"LibreOffice")
icon_result=":libreoffice:"
;;
"Adobe Lightroom")
icon_result=":lightroom:"
;;
"Lightroom Classic")
icon_result=":lightroomclassic:"
;;
"LINE")
icon_result=":line:"
;;
"Linear")
icon_result=":linear:"
;;
"LM Studio")
icon_result=":lm_studio:"
;;
"LocalSend")
icon_result=":localsend:"
;;
"Logic Pro")
icon_result=":logicpro:"
;;
"Logseq")
icon_result=":logseq:"
;;
"MacPass")
icon_result=":macpass:"
;;
"Canary Mail" | "HEY" | "Mail" | "Mailspring" | "MailMate" | "Superhuman" | "Spark" | "邮件" | "メール")
icon_result=":mail:"
;;
"MAMP" | "MAMP PRO")
icon_result=":mamp:"
;;
"Maps" | "Google Maps" | "マップ" | "Karten")
icon_result=":maps:"
;;
"Marta")
icon_result=":marta:"
;;
"Matlab" | "MATLAB" |"MATLABWindow" | "MATLAB_R2024b" | "MATLAB_R2024a" | "MATLAB_R2023b" | "MATLAB_R2023a" | "MATLAB_R2022b" | "MATLAB_R2022a" | "MATLAB_R2021b" | "MATLAB_R2021a")
icon_result=":matlab:"
;;
"Mattermost")
icon_result=":mattermost:"
;;
"Google Meet")
icon_result=":meet:"
;;
"Messages" | "信息" | "Nachrichten" | "メッセージ")
icon_result=":messages:"
;;
"Messenger")
icon_result=":messenger:"
;;
"Microsoft Edge")
icon_result=":microsoft_edge:"
;;
"Microsoft Excel")
icon_result=":microsoft_excel:"
;;
"Microsoft Outlook")
icon_result=":microsoft_outlook:"
;;
"Microsoft PowerPoint")
icon_result=":microsoft_power_point:"
;;
"Microsoft Remote Desktop")
icon_result=":microsoft_remote_desktop:"
;;
"Microsoft Teams" | "Microsoft Teams (work or school)")
icon_result=":microsoft_teams:"
;;
"Microsoft Word")
icon_result=":microsoft_word:"
;;
"Mimestream")
icon_result=":mimestream:"
;;
"Min")
icon_result=":min_browser:"
;;
"Miro")
icon_result=":miro:"
;;
"MongoDB Compass"*)
icon_result=":mongodb:"
;;
"Moonlight")
icon_result=":moonlight:"
;;
"mpv")
icon_result=":mpv:"
;;
"Mullvad Browser")
icon_result=":mullvad_browser:"
;;
"Music" | "音乐" | "Musique" | "ミュージック" | "Musik")
icon_result=":music:"
;;
"Navicat Premium")
icon_result=":navicat:"
;;
"Neovide" | "neovide")
icon_result=":neovide:"
;;
"Neovim" | "neovim" | "nvim")
icon_result=":neovim:"
;;
"网易云音乐" | "NetEaseMusic")
icon_result=":netease_music:"
;;
"News")
icon_result=":news:"
;;
"Nextcloud")
icon_result=":nextcloud:"
;;
"Nicotine+")
icon_result=":nicotine_plus:"
;;
"Nimble Commander" | "NimbleCommander-Unsigned")
icon_result=":nimble_commander:"
;;
"Noodl" | "Noodl Editor")
icon_result=":noodl:"
;;
"NordVPN")
icon_result=":nord_vpn:"
;;
"Notability")
icon_result=":notability:"
;;
"Notes" | "备忘录" | "メモ" | "Notizen")
icon_result=":notes:"
;;
"Notion")
icon_result=":notion:"
;;
"Notion Mail")
icon_result=":notion_mail:"
;;
"Nova")
icon_result=":nova:"
;;
"Numbers" | "Numbers 表格")
icon_result=":numbers:"
;;
"Obsidian")
icon_result=":obsidian:"
;;
"OBS")
icon_result=":obsstudio:"
;;
"OmniFocus")
icon_result=":omni_focus:"
;;
"1Password")
icon_result=":one_password:"
;;
"Open Video Downloader")
icon_result=":open_video_downloader:"
;;
"ChatGPT")
icon_result=":openai:"
;;
"OpenAI Translator")
icon_result=":openai_translator:"
;;
"OpenVPN Connect")
icon_result=":openvpn_connect:"
;;
"Opera")
icon_result=":opera:"
;;
"OrbStack")
icon_result=":orbstack:"
;;
"OrcaSlicer")
icon_result=":orcaslicer:"
;;
"Orion" | "Orion RC")
icon_result=":orion:"
;;
"Overleaf" | "ShareLaTeX")
icon_result=":overleaf:"
;;
"Pages" | "Pages 文稿")
icon_result=":pages:"
;;
"Parallels Desktop")
icon_result=":parallels:"
;;
"Parsec")
icon_result=":parsec:"
;;
"Passepartout")
icon_result=":passepartout:"
;;
"Passwords" | "Passwörter")
icon_result=":passwords:"
;;
"PDF Expert")
icon_result=":pdf_expert:"
;;
"Pearcleaner")
icon_result=":pearcleaner:"
;;
"Perplexity" | "Perplexity AI")
icon_result=":perplexity:"
;;
"Phoenix Slides")
icon_result=":phoenix_slides:"
;;
"Photos" | "Fotos")
icon_result=":photos:"
;;
"Adobe Photoshop"*)
icon_result=":photoshop:"
;;
"PhpStorm")
icon_result=":php_storm:"
;;
"Pi-hole Remote")
icon_result=":pihole:"
;;
"Pine")
icon_result=":pine:"
;;
"Plex")
icon_result=":plex:"
;;
"Plexamp")
icon_result=":plexamp:"
;;
"Podcasts" | "播客")
icon_result=":podcasts:"
;;
"PomoDone App")
icon_result=":pomodone:"
;;
"Postman")
icon_result=":postman:"
;;
"Premiere" | "Adobe Premiere" | "Adobe Premiere Pro 2024")
icon_result=":premiere:"
;;
"Preview" | "预览" | "Skim" | "zathura" | "Aperçu" | "プレビュー" | "Vorschau")
icon_result=":preview:"
;;
"Proton Mail" | "Proton Mail Bridge")
icon_result=":proton_mail:"
;;
"Proton VPN" | "ProtonVPN")
icon_result=":proton_vpn:"
;;
"PrusaSlicer" | "SuperSlicer")
icon_result=":prusaslicer:"
;;
"PyCharm")
icon_result=":pycharm:"
;;
"qBittorrent")
icon_result=":qbittorrent:"
;;
"QLMarkdown")
icon_result=":qlmarkdown:"
;;
"QQ")
icon_result=":qq:"
;;
"QQ音乐" | "QQMusic")
icon_result=":qqmusic:"
;;
"Quantumult X")
icon_result=":quantumult_x:"
;;
"Quip")
icon_result=":quip:"
;;
"qutebrowser")
icon_result=":qute_browser:"
;;
"Raindrop.io")
icon_result=":raindrop_io:"
;;
"Raspberry Pi Imager" | "Raspberry Pi Connect")
icon_result=":raspberry_pi:"
;;
"Raycast")
icon_result=":raycast:"
;;
"Reeder")
icon_result=":reeder5:"
;;
"rekordbox")
icon_result=":rekordbox:"
;;
"Reminders" | "提醒事项" | "Rappels" | "リマインダー" | "Erinnerungen")
icon_result=":reminders:"
;;
"Replit")
icon_result=":replit:"
;;
"Repo Prompt")
icon_result=":repo_prompt:"
;;
"Rider" | "JetBrains Rider")
icon_result=":rider:"
;;
"Rio")
icon_result=":rio:"
;;
"Royal TSX")
icon_result=":royaltsx:"
;;
"RustDesk")
icon_result=":rustdesk:"
;;
"Safari" | "Safari浏览器" | "Safari Technology Preview")
icon_result=":safari:"
;;
"Scribus")
icon_result=":scribus:"
;;
"Seafile")
icon_result=":seafile:"
;;
"Sequel Ace")
icon_result=":sequel_ace:"
;;
"Sequel Pro")
icon_result=":sequel_pro:"
;;
"Session")
icon_result=":session:"
;;
"Setapp")
icon_result=":setapp:"
;;
"SF Symbols" | "SF Symbole" | "SF-Symbole")
icon_result=":sf_symbols:"
;;
"Shortcuts")
icon_result=":shortcuts:"
;;
"Signal")
icon_result=":signal:"
;;
"sioyek")
icon_result=":sioyek:"
;;
"Sketch")
icon_result=":sketch:"
;;
"Skype")
icon_result=":skype:"
;;
"Slack")
icon_result=":slack:"
;;
"Spark Desktop")
icon_result=":spark:"
;;
"Spotify")
icon_result=":spotify:"
;;
"Spotlight")
icon_result=":spotlight:"
;;
"Steam" | "Steam Helper")
icon_result=":steam:"
;;
"Studio 3T")
icon_result=":studio_3t:"
;;
"Sublime Text")
icon_result=":sublime_text:"
;;
"Summoners War")
icon_result=":summoners_war:"
;;
"superProductivity")
icon_result=":superproductivity:"
;;
"Surfshark")
icon_result=":surfshark:"
;;
"T3 Chat")
icon_result=":t3chat:"
;;
"Tabby")
icon_result=":tabby:"
;;
"TablePlus")
icon_result=":tableplus:"
;;
"Tana")
icon_result=":tana:"
;;
"TeamSpeak 3")
icon_result=":team_speak:"
;;
"Telegram")
icon_result=":telegram:"
;;
"Terminal" | "终端" | "ターミナル")
icon_result=":terminal:"
;;
"Termius")
icon_result=":termius:"
;;
"Typora")
icon_result=":text:"
;;
"TextEdit")
icon_result=":textedit:"
;;
"Microsoft To Do" | "Things")
icon_result=":things:"
;;
"Thunderbird" | "Thunderbird Daily")
icon_result=":thunderbird:"
;;
"TickTick")
icon_result=":tick_tick:"
;;
"TIDAL")
icon_result=":tidal:"
;;
"Tiny RDM")
icon_result=":tinyrdm:"
;;
"Todoist")
icon_result=":todoist:"
;;
"Toggl Track")
icon_result=":toggl_track:"
;;
"Tor Browser")
icon_result=":tor_browser:"
;;
"Tower")
icon_result=":tower:"
;;
"TradingView")
icon_result=":trading_view:"
;;
"Transmit")
icon_result=":transmit:"
;;
"Trello")
icon_result=":trello:"
;;
"Tweetbot" | "Twitter")
icon_result=":twitter:"
;;
"UTM")
icon_result=":utm:"
;;
"VeraCrypt")
icon_result=":veracrypt:"
;;
"MacVim" | "Vim" | "VimR")
icon_result=":vim:"
;;
"Vivaldi")
icon_result=":vivaldi:"
;;
"VLC")
icon_result=":vlc:"
;;
"VMware Fusion")
icon_result=":vmware_fusion:"
;;
"Vorta")
icon_result=":vorta:"
;;
"VSCodium")
icon_result=":vscodium:"
;;
"Warp")
icon_result=":warp:"
;;
"Weather" | "Wetter")
icon_result=":weather:"
;;
"WebStorm")
icon_result=":web_storm:"
;;
"Webull Desktop")
icon_result=":webull:"
;;
"微信" | "WeChat")
icon_result=":wechat:"
;;
"企业微信" | "WeCom")
icon_result=":wecom:"
;;
"WezTerm" | "wezterm-gui")
icon_result=":wezterm:"
;;
"WhatsApp" | "WhatsApp")
icon_result=":whats_app:"
;;
"Windows App")
icon_result=":windows_app:"
;;
"WireGuard")
icon_result=":wireguard:"
;;
"Xcode")
icon_result=":xcode:"
;;
"Yandex Browser" | "Yandex Browser" | "Yandex")
icon_result=":yandex_bower:"
;;
"Yandex Music")
icon_result=":yandex_music:"
;;
"Yazi" | "yazi")
icon_result=":yazi:"
;;
"YouTube")
icon_result=":youtube:"
;;
"YouTube Music")
icon_result=":youtube_music:"
;;
"Yuque" | "语雀")
icon_result=":yuque:"
;;
"Zed")
icon_result=":zed:"
;;
"Zen" | "Zen Browser")
icon_result=":zen_browser:"
;;
"Zeplin")
icon_result=":zeplin:"
;;
"zoom.us")
icon_result=":zoom:"
;;
"Zotero")
icon_result=":zotero:"
;;
"Zulip")
icon_result=":zulip:"
;;
*)
icon_result=":default:"
;;
esac
}
### END-OF-ICON-MAP

View file

@ -0,0 +1,50 @@
#!/bin/bash
# General Icons
LOADING=􀖇
APPLE=􀣺
PREFERENCES=􀺽
ACTIVITY=􀒓
LOCK=􀒳
BELL=􀋚
BELL_DOT=􀝗
# Git Icons
GIT_ISSUE=􀍷
GIT_DISCUSSION=􀒤
GIT_PULL_REQUEST=􀙡
GIT_COMMIT=􀡚
GIT_INDICATOR=􀂓
# Spotify Icons
SPOTIFY_BACK=􀊎
SPOTIFY_PLAY_PAUSE=􀊈
SPOTIFY_NEXT=􀊐
SPOTIFY_SHUFFLE=􀊝
SPOTIFY_REPEAT=􀊞
# Yabai Icons
YABAI_STACK=􀏭
YABAI_FULLSCREEN_ZOOM=􀏜
YABAI_PARENT_ZOOM=􀥃
YABAI_FLOAT=􀢌
YABAI_GRID=􀧍
# Battery Icons
BATTERY_100=􀛨
BATTERY_75=􀺸
BATTERY_50=􀺶
BATTERY_25=􀛩
BATTERY_0=􀛪
BATTERY_CHARGING=􀢋
# Volume Icons
VOLUME_100=􀊩
VOLUME_66=􀊧
VOLUME_33=􀊥
VOLUME_10=􀊡
VOLUME_0=􀊣
# WiFi Icons
WIFI=􀙇
WIFI_OFF=􀙈

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 517 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

50
.config/sketchybar/icons.sh Executable file
View file

@ -0,0 +1,50 @@
#!/bin/bash
# General Icons
LOADING=􀖇
APPLE=􀣺
PREFERENCES=􀺽
ACTIVITY=􀒓
LOCK=􀒳
BELL=􀋚
BELL_DOT=􀝗
# Git Icons
GIT_ISSUE=􀍷
GIT_DISCUSSION=􀒤
GIT_PULL_REQUEST=􀙡
GIT_COMMIT=􀡚
GIT_INDICATOR=􀂓
# Spotify Icons
SPOTIFY_BACK=􀊎
SPOTIFY_PLAY_PAUSE=􀊈
SPOTIFY_NEXT=􀊐
SPOTIFY_SHUFFLE=􀊝
SPOTIFY_REPEAT=􀊞
# Yabai Icons
YABAI_STACK=􀏭
YABAI_FULLSCREEN_ZOOM=􀏜
YABAI_PARENT_ZOOM=􀥃
YABAI_FLOAT=􀢌
YABAI_GRID=􀧍
# Battery Icons
BATTERY_100=􀛨
BATTERY_75=􀺸
BATTERY_50=􀺶
BATTERY_25=􀛩
BATTERY_0=􀛪
BATTERY_CHARGING=􀢋
# Volume Icons
VOLUME_100=􀊩
VOLUME_66=􀊧
VOLUME_33=􀊥
VOLUME_10=􀊡
VOLUME_0=􀊣
# WiFi Icons
WIFI=􀙇
WIFI_OFF=􀙈

View file

@ -0,0 +1,107 @@
#!/bin/bash
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
source "$CONFIG_DIR/colors.sh"
# ─── Fast path: workspace switch (color-only update) ─────────────────────────
# When called from exec-on-workspace-change, FOCUSED_WORKSPACE and
# PREV_WORKSPACE are passed as env vars. We can swap highlight colors
# with ZERO aerospace CLI calls — just one sketchybar call (~10ms).
if [ -n "$FOCUSED_WORKSPACE" ] && [ -n "$PREV_WORKSPACE" ] \
&& [ "$FOCUSED_WORKSPACE" != "$PREV_WORKSPACE" ]; then
sketchybar --animate sin 8 \
--set aerospace.workspace.$PREV_WORKSPACE \
background.color=$BACKGROUND_2 \
icon.color=$WHITE \
label.color=$WHITE \
--set aerospace.workspace.$FOCUSED_WORKSPACE \
background.color=$GREEN \
icon.color=$BLACK \
label.color=$BLACK
fi
# ─── Full path: initial load / icon refresh ──────────────────────────────────
# Only source the 986-line icon map when we actually need it.
source "$CONFIG_DIR/helpers/icon_map.sh"
# Use env var if available, otherwise query (1 call)
CURRENT_WORKSPACE="${FOCUSED_WORKSPACE:-$(aerospace list-workspaces --focused 2>/dev/null)}" || exit
[ -z "$CURRENT_WORKSPACE" ] && exit
# ONE aerospace call gets every window across all workspaces
ALL_WINDOWS=$(aerospace list-windows --all --format '%{workspace}|%{app-name}' 2>/dev/null)
# Parse into per-workspace app lists — pure bash, no subprocesses
# (bash 3.2 compatible: no associative arrays)
WS_1_APPS="" WS_2_APPS="" WS_3_APPS="" WS_4_APPS="" WS_5_APPS=""
WS_6_APPS="" WS_7_APPS="" WS_8_APPS="" WS_9_APPS=""
WS_1_ACT=0 WS_2_ACT=0 WS_3_ACT=0 WS_4_ACT=0 WS_5_ACT=0
WS_6_ACT=0 WS_7_ACT=0 WS_8_ACT=0 WS_9_ACT=0
while IFS='|' read -r ws app; do
[ -z "$ws" ] && continue
case "$ws" in
1) WS_1_ACT=1; WS_1_APPS="${WS_1_APPS:+${WS_1_APPS}|}$app" ;;
2) WS_2_ACT=1; WS_2_APPS="${WS_2_APPS:+${WS_2_APPS}|}$app" ;;
3) WS_3_ACT=1; WS_3_APPS="${WS_3_APPS:+${WS_3_APPS}|}$app" ;;
4) WS_4_ACT=1; WS_4_APPS="${WS_4_APPS:+${WS_4_APPS}|}$app" ;;
5) WS_5_ACT=1; WS_5_APPS="${WS_5_APPS:+${WS_5_APPS}|}$app" ;;
6) WS_6_ACT=1; WS_6_APPS="${WS_6_APPS:+${WS_6_APPS}|}$app" ;;
7) WS_7_ACT=1; WS_7_APPS="${WS_7_APPS:+${WS_7_APPS}|}$app" ;;
8) WS_8_ACT=1; WS_8_APPS="${WS_8_APPS:+${WS_8_APPS}|}$app" ;;
9) WS_9_ACT=1; WS_9_APPS="${WS_9_APPS:+${WS_9_APPS}|}$app" ;;
esac
done <<< "$ALL_WINDOWS"
# Always show the focused workspace even if empty
case "$CURRENT_WORKSPACE" in
[1-9]) eval "WS_${CURRENT_WORKSPACE}_ACT=1" ;;
esac
# Build ONE sketchybar call for all 9 workspaces
args=(--animate sin 8)
for i in {1..9}; do
eval "IS_ACTIVE=\$WS_${i}_ACT"
if [ "$IS_ACTIVE" = "1" ]; then
eval "APPS_STR=\$WS_${i}_APPS"
# Build icon strip (up to 3 app icons)
ICON_STRIP=""
APP_COUNT=0
OLD_IFS="$IFS"; IFS='|'
for APP in $APPS_STR; do
[ -z "$APP" ] && continue
APP_COUNT=$((APP_COUNT + 1))
[ $APP_COUNT -gt 3 ] && break
__icon_map "$APP"
if [ -n "$icon_result" ] && [ "$icon_result" != ":default:" ]; then
ICON_STRIP="${ICON_STRIP}${icon_result} "
fi
done
IFS="$OLD_IFS"
ICON_STRIP="${ICON_STRIP% }"
[ -z "$ICON_STRIP" ] && ICON_STRIP="$i"
if [ "$i" = "$CURRENT_WORKSPACE" ]; then
BG_COLOR=$GREEN; ICON_COLOR=$BLACK; TEXT_COLOR=$BLACK
else
BG_COLOR=$BACKGROUND_2; ICON_COLOR=$WHITE; TEXT_COLOR=$WHITE
fi
args+=(
--set aerospace.workspace.$i drawing=on
--set aerospace.workspace.$i icon="$ICON_STRIP"
--set aerospace.workspace.$i icon.color="$ICON_COLOR"
--set aerospace.workspace.$i label="$i"
--set aerospace.workspace.$i label.color="$TEXT_COLOR"
--set aerospace.workspace.$i background.color="$BG_COLOR"
)
else
args+=(--set aerospace.workspace.$i drawing=off)
fi
done
sketchybar "${args[@]}" 2>/dev/null

View file

@ -0,0 +1,62 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
POPUP_OFF="sketchybar --set apple.icon popup.drawing=off"
POPUP_CLICK_SCRIPT="sketchybar --set \$NAME popup.drawing=toggle"
# Apple icon (far left) - opens popup menu on click
apple_icon=(
icon=""
icon.drawing=on
icon.font="SF Pro:Black:28.0"
icon.color=$GREEN
label.drawing=off
background.drawing=off
padding_right=4
padding_left=10
click_script="$POPUP_CLICK_SCRIPT"
)
apple_logo=(
icon.drawing=off
label.drawing=off
padding_right=0
padding_left=0
width=0
)
apple_prefs=(
icon="⚙️"
label="System Preferences"
click_script="open 'x-apple.systempreferences:'; $POPUP_OFF"
)
apple_activity=(
icon="📊"
label="Activity Monitor"
click_script="open -a 'Activity Monitor'; $POPUP_OFF"
)
apple_lock=(
icon="🔒"
label="Lock Screen"
click_script="open -a ScreenSaverEngine; $POPUP_OFF"
)
# Add apple icon first (far left)
sketchybar --add item apple.icon left \
--set apple.icon "${apple_icon[@]}"
sketchybar --add item apple.logo left \
--set apple.logo "${apple_logo[@]}" \
\
--add item apple.prefs popup.apple.icon \
--set apple.prefs "${apple_prefs[@]}" \
\
--add item apple.activity popup.apple.icon \
--set apple.activity "${apple_activity[@]}" \
\
--add item apple.lock popup.apple.icon \
--set apple.lock "${apple_lock[@]}"

View file

@ -0,0 +1,28 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
battery=(
script="$PLUGIN_DIR/battery.sh"
#icon.font="SF Pro:Bold:20.0"
icon.font="0xProto Nerd Font Mono:Bold:20.0"
icon.color=$GREEN
icon.padding_left=4
icon.padding_right=4
label.font="0xProto Nerd Font Mono:Bold:15.0"
label.color=$WHITE
label.padding_left=4
label.padding_right=8
background.color=$BACKGROUND_2
background.corner_radius=8
background.height=28
background.drawing=on
padding_left=4
padding_right=4
update_freq=120
)
sketchybar --add item battery right \
--set battery "${battery[@]}" \
--subscribe battery system_woke power_source_change

View file

@ -0,0 +1,11 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
sketchybar --add item clock right \
--set clock update_freq=10 \
--set clock icon=󰃰 \
--set clock icon.color=$ICON_COLOR \
--set clock label.color=$LABEL_COLOR \
--set clock script="$PLUGIN_DIR/clock.sh" \
--set clock click_script="$PLUGIN_DIR/zen.sh"

View file

@ -0,0 +1,46 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
# Control Center style menu items
# These will be positioned to the right of the workspaces
# Bluetooth
bluetooth=(
script="$PLUGIN_DIR/bluetooth.sh"
icon="󰂯"
icon.font="0xProto Nerd Font Mono:Bold:18.0"
icon.color=0xffffffff
label.drawing=off
update_freq=10
click_script="open 'x-apple.systempreferences:com.apple.BluetoothSettings'"
)
# AirDrop
airdrop=(
icon="󰀦"
icon.font="0xProto Nerd Font Mono:Bold:18.0"
icon.color=0xffffffff
label.drawing=off
click_script="open 'x-apple.systempreferences:com.apple.AirDrop-Handoff-Settings'"
)
# Focus/Do Not Disturb
focus=(
script="$PLUGIN_DIR/focus.sh"
icon="󰂞"
icon.font="0xProto Nerd Font Mono:Bold:18.0"
icon.color=0xffffffff
label.drawing=off
update_freq=30
click_script="shortcuts run 'Toggle Focus'"
)
sketchybar --add item bluetooth right \
--set bluetooth "${bluetooth[@]}" \
\
--add item airdrop right \
--set airdrop "${airdrop[@]}" \
\
--add item focus right \
--set focus "${focus[@]}"

View file

@ -0,0 +1,24 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
mic=(
script="$PLUGIN_DIR/mic/mic.sh"
click_script="$PLUGIN_DIR/mic/mic_click.sh"
icon.color=0xffffffff
icon.padding_right=4
icon.padding_left=4
label.padding_right=4
label.padding_left=4
background.color=$BACKGROUND_2
background.corner_radius=8
background.height=28
background.drawing=on
icon.font="0xProto Nerd Font Mono:Bold:30.0"
label.color=0xffffffff
label.font="0xProto Nerd Font Mono:Bold:15.0"
)
sketchybar --add item mic right \
--set mic "${mic[@]}" \
--subscribe mic volume_change

219
.config/sketchybar/items/mic.sh Executable file
View file

@ -0,0 +1,219 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
SPOTIFY_EVENT="com.spotify.client.PlaybackStateChanged"
POPUP_SCRIPT="sketchybar -m --set spotify.anchor popup.drawing=toggle"
spotify_anchor=(
script="$PLUGIN_DIR/spotify.sh"
click_script="$POPUP_SCRIPT"
popup.horizontal=on
popup.align=right
popup.height=150
icon="󰓇"
icon.font="0xProto Nerd Font Mono:Bold:20.0"
icon.color=$GREEN
icon.padding_left=8
icon.padding_right=8
label.drawing=off
drawing=on
background.color=$BACKGROUND_2
background.corner_radius=8
background.height=28
background.drawing=on
padding_left=4
padding_right=4
)
spotify_cover=(
script="$PLUGIN_DIR/spotify.sh"
click_script="open -a 'Spotify'; $POPUP_SCRIPT"
label.drawing=off
icon.drawing=off
padding_left=12
padding_right=10
background.image.scale=0.2
background.image.drawing=on
background.drawing=on
)
spotify_title=(
icon.drawing=off
padding_left=0
padding_right=0
width=0
label.font="SF Pro:Heavy:15.0"
label.color=$WHITE
y_offset=55
)
spotify_artist=(
icon.drawing=off
y_offset=30
padding_left=0
padding_right=0
width=0
label.color=$GREY
)
spotify_album=(
icon.drawing=off
padding_left=0
padding_right=0
y_offset=15
width=0
label.color=$GREY
)
spotify_state=(
icon.drawing=on
icon.font="SF Pro:Light Italic:10.0"
icon.width=45
icon="00:00"
icon.color=$GREY
label.drawing=on
label.font="SF Pro:Light Italic:10.0"
label.width=45
label="00:00"
label.color=$GREY
padding_left=0
padding_right=0
y_offset=-15
width=0
slider.background.height=6
slider.background.corner_radius=1
slider.background.color=$GREY
slider.highlight_color=$GREEN
slider.percentage=40
slider.width=115
script="$PLUGIN_DIR/spotify.sh"
update_freq=1
updates=when_shown
)
spotify_shuffle=(
icon=$SPOTIFY_SHUFFLE
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
icon.highlight_color=$GREY
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_back=(
icon=$SPOTIFY_BACK
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
script="$PLUGIN_DIR/spotify.sh"
label.drawing=off
y_offset=-45
)
spotify_play=(
icon=􀊄
icon.font="SF Pro:Regular:14.0"
background.height=40
background.corner_radius=20
width=40
align=center
background.color=$BACKGROUND_1
background.border_color=0xffffffff
background.border_width=0
background.drawing=on
icon.padding_left=4
icon.padding_right=5
icon.color=0xff000000
updates=on
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_next=(
icon=$SPOTIFY_NEXT
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_repeat=(
icon=$SPOTIFY_REPEAT
icon.font="SF Pro:Regular:14.0"
icon.highlight_color=$GREY
icon.padding_left=5
icon.padding_right=10
icon.color=0xff000000
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_controls=(
background.color=$GREEN
background.corner_radius=11
background.drawing=on
y_offset=-45
)
sketchybar --add event spotify_change $SPOTIFY_EVENT \
--add item spotify.anchor right \
--set spotify.anchor "${spotify_anchor[@]}" \
--subscribe spotify.anchor mouse.entered mouse.exited \
mouse.exited.global \
\
--add item spotify.cover popup.spotify.anchor \
--set spotify.cover "${spotify_cover[@]}" \
\
--add item spotify.title popup.spotify.anchor \
--set spotify.title "${spotify_title[@]}" \
\
--add item spotify.artist popup.spotify.anchor \
--set spotify.artist "${spotify_artist[@]}" \
\
--add item spotify.album popup.spotify.anchor \
--set spotify.album "${spotify_album[@]}" \
\
--add slider spotify.state popup.spotify.anchor \
--set spotify.state "${spotify_state[@]}" \
--subscribe spotify.state mouse.clicked \
\
--add item spotify.shuffle popup.spotify.anchor \
--set spotify.shuffle "${spotify_shuffle[@]}" \
--subscribe spotify.shuffle mouse.clicked \
\
--add item spotify.back popup.spotify.anchor \
--set spotify.back "${spotify_back[@]}" \
--subscribe spotify.back mouse.clicked \
\
--add item spotify.play popup.spotify.anchor \
--set spotify.play "${spotify_play[@]}" \
--subscribe spotify.play mouse.clicked spotify_change \
\
--add item spotify.next popup.spotify.anchor \
--set spotify.next "${spotify_next[@]}" \
--subscribe spotify.next mouse.clicked \
\
--add item spotify.repeat popup.spotify.anchor \
--set spotify.repeat "${spotify_repeat[@]}" \
--subscribe spotify.repeat mouse.clicked \
\
--add item spotify.spacer popup.spotify.anchor \
--set spotify.spacer width=5 \
\
--add bracket spotify.controls spotify.shuffle \
spotify.back \
spotify.play \
spotify.next \
spotify.repeat \
--set spotify.controls "${spotify_controls[@]}"

View file

@ -0,0 +1,25 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
recording=(
script="$PLUGIN_DIR/recording.sh"
icon=""
icon.font="0xProto Nerd Font Mono:Bold:14.0"
icon.color=$RED
icon.padding_left=8
icon.padding_right=8
label.drawing=off
drawing=off
background.color=$BACKGROUND_2
background.corner_radius=8
background.height=28
background.drawing=off
padding_left=4
padding_right=4
update_freq=2
click_script="$PLUGIN_DIR/recording_click.sh"
)
sketchybar --add item recording right \
--set recording "${recording[@]}"

View file

@ -0,0 +1,15 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
# Simple calendar item for far right
simple_calendar=(
icon="📅"
icon.font="0xProto Nerd Font Mono:Bold:14.0"
icon.color=0xffffffff
label.drawing=off
click_script="open -a Calendar"
)
sketchybar --add item simple_calendar right \
--set simple_calendar "${simple_calendar[@]}"

View file

@ -0,0 +1,219 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
SPOTIFY_EVENT="com.spotify.client.PlaybackStateChanged"
POPUP_SCRIPT="sketchybar -m --set spotify.anchor popup.drawing=toggle"
spotify_anchor=(
script="$PLUGIN_DIR/spotify.sh"
click_script="$POPUP_SCRIPT"
popup.horizontal=on
popup.align=right
popup.height=150
icon="󰓇"
icon.font="0xProto Nerd Font Mono:Bold:20.0"
icon.color=$GREEN
icon.padding_left=8
icon.padding_right=8
label.drawing=off
drawing=on
background.color=$BACKGROUND_2
background.corner_radius=8
background.height=28
background.drawing=on
padding_left=4
padding_right=4
)
spotify_cover=(
script="$PLUGIN_DIR/spotify.sh"
click_script="open -a 'Spotify'; $POPUP_SCRIPT"
label.drawing=off
icon.drawing=off
padding_left=12
padding_right=10
background.image.scale=0.2
background.image.drawing=on
background.drawing=on
)
spotify_title=(
icon.drawing=off
padding_left=0
padding_right=0
width=0
label.font="SF Pro:Heavy:15.0"
label.color=$WHITE
y_offset=55
)
spotify_artist=(
icon.drawing=off
y_offset=30
padding_left=0
padding_right=0
width=0
label.color=$GREY
)
spotify_album=(
icon.drawing=off
padding_left=0
padding_right=0
y_offset=15
width=0
label.color=$GREY
)
spotify_state=(
icon.drawing=on
icon.font="SF Pro:Light Italic:10.0"
icon.width=45
icon="00:00"
icon.color=$GREY
label.drawing=on
label.font="SF Pro:Light Italic:10.0"
label.width=45
label="00:00"
label.color=$GREY
padding_left=0
padding_right=0
y_offset=-15
width=0
slider.background.height=6
slider.background.corner_radius=1
slider.background.color=$GREY
slider.highlight_color=$GREEN
slider.percentage=40
slider.width=115
script="$PLUGIN_DIR/spotify.sh"
update_freq=1
updates=when_shown
)
spotify_shuffle=(
icon=$SPOTIFY_SHUFFLE
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
icon.highlight_color=$GREY
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_back=(
icon=$SPOTIFY_BACK
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
script="$PLUGIN_DIR/spotify.sh"
label.drawing=off
y_offset=-45
)
spotify_play=(
icon=􀊄
icon.font="SF Pro:Regular:14.0"
background.height=40
background.corner_radius=20
width=40
align=center
background.color=$BACKGROUND_1
background.border_color=0xffffffff
background.border_width=0
background.drawing=on
icon.padding_left=4
icon.padding_right=5
icon.color=0xff000000
updates=on
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_next=(
icon=$SPOTIFY_NEXT
icon.font="SF Pro:Regular:14.0"
icon.padding_left=5
icon.padding_right=5
icon.color=0xff000000
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_repeat=(
icon=$SPOTIFY_REPEAT
icon.font="SF Pro:Regular:14.0"
icon.highlight_color=$GREY
icon.padding_left=5
icon.padding_right=10
icon.color=0xff000000
label.drawing=off
script="$PLUGIN_DIR/spotify.sh"
y_offset=-45
)
spotify_controls=(
background.color=$GREEN
background.corner_radius=11
background.drawing=on
y_offset=-45
)
sketchybar --add event spotify_change $SPOTIFY_EVENT \
--add item spotify.anchor right \
--set spotify.anchor "${spotify_anchor[@]}" \
--subscribe spotify.anchor mouse.entered mouse.exited \
mouse.exited.global \
\
--add item spotify.cover popup.spotify.anchor \
--set spotify.cover "${spotify_cover[@]}" \
\
--add item spotify.title popup.spotify.anchor \
--set spotify.title "${spotify_title[@]}" \
\
--add item spotify.artist popup.spotify.anchor \
--set spotify.artist "${spotify_artist[@]}" \
\
--add item spotify.album popup.spotify.anchor \
--set spotify.album "${spotify_album[@]}" \
\
--add slider spotify.state popup.spotify.anchor \
--set spotify.state "${spotify_state[@]}" \
--subscribe spotify.state mouse.clicked \
\
--add item spotify.shuffle popup.spotify.anchor \
--set spotify.shuffle "${spotify_shuffle[@]}" \
--subscribe spotify.shuffle mouse.clicked \
\
--add item spotify.back popup.spotify.anchor \
--set spotify.back "${spotify_back[@]}" \
--subscribe spotify.back mouse.clicked \
\
--add item spotify.play popup.spotify.anchor \
--set spotify.play "${spotify_play[@]}" \
--subscribe spotify.play mouse.clicked spotify_change \
\
--add item spotify.next popup.spotify.anchor \
--set spotify.next "${spotify_next[@]}" \
--subscribe spotify.next mouse.clicked \
\
--add item spotify.repeat popup.spotify.anchor \
--set spotify.repeat "${spotify_repeat[@]}" \
--subscribe spotify.repeat mouse.clicked \
\
--add item spotify.spacer popup.spotify.anchor \
--set spotify.spacer width=5 \
\
--add bracket spotify.controls spotify.shuffle \
spotify.back \
spotify.play \
spotify.next \
spotify.repeat \
--set spotify.controls "${spotify_controls[@]}"

View file

@ -0,0 +1,18 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
volume=(
script="$PLUGIN_DIR/volume.sh"
icon.color=0xffffffff
icon.font="0xProto Nerd Font Mono:Bold:18.0"
label.color=0xffffffff
label.font="0xProto Nerd Font Mono:Bold:15.0"
click_script="open -a 'Audio MIDI Setup'"
scroll_script="$PLUGIN_DIR/volume_scroll.sh"
)
sketchybar --add item volume right \
--set volume "${volume[@]}" \
--subscribe volume volume_change mouse.scrolled

View file

@ -0,0 +1,17 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
source "$CONFIG_DIR/icons.sh"
wifi=(
script="$PLUGIN_DIR/wifi.sh"
icon.color=0xffffffff
icon.font="0xProto Nerd Font Mono:Bold:18.0"
label.color=0xffffffff
label.font="0xProto Nerd Font Mono:Bold:15.0"
click_script="open 'x-apple.systempreferences:com.apple.Network-Settings.extension'"
update_freq=10
)
sketchybar --add item wifi right \
--set wifi "${wifi[@]}"

View file

@ -0,0 +1,23 @@
#!/bin/bash
# Handle left/right click on aerospace spaces
# Left click: focus workspace
# Right click: destroy workspace (if using yabai with SIP disabled)
WORKSPACE_NUMBER=$(echo "$NAME" | grep -o '[0-9]\+$')
case "$BUTTON" in
"left")
aerospace workspace "$WORKSPACE_NUMBER"
;;
"right")
# Destroy space (requires yabai with SIP disabled)
# For aerospace, we'll just move all windows from this space to space 1 and focus space 1
aerospace list-windows --workspace "$WORKSPACE_NUMBER" --format '%{window-id}' | while read -r window_id; do
if [ -n "$window_id" ]; then
aerospace move-node-to-workspace --window-id "$window_id" 1
fi
done
aerospace workspace 1
;;
esac

View file

@ -0,0 +1,26 @@
#!/bin/sh
source "$CONFIG_DIR/colors.sh"
PERCENTAGE="$(pmset -g batt | grep -Eo "\d+%" | cut -d% -f1)"
CHARGING="$(pmset -g batt | grep 'AC Power')"
if [ "$PERCENTAGE" = "" ]; then
exit 0
fi
case "${PERCENTAGE}" in
9[0-9]|100) ICON="󰂂 " ; COLOR="0xffa8ff60" ;;
[6-8][0-9]) ICON="󰁿 " ; COLOR="0xffa8ff60" ;;
[3-5][0-9]) ICON="󰁼 " ; COLOR="0xfffffeb7" ;;
[1-2][0-9]) ICON="󰁺 " ; COLOR="0xfffcb6b0" ;;
*) ICON="󰁹 " ; COLOR="0xfffa6c60" ;;
esac
if [ "$CHARGING" != "" ]; then
ICON=" "
#COLOR="0xffa8ff60"
COLOR=$GREEN
fi
sketchybar --set "$NAME" icon="$ICON" icon.color="$COLOR" label="${PERCENTAGE}%" label.drawing=on

View file

@ -0,0 +1,16 @@
#!/bin/bash
# Check Bluetooth status
BT_STATUS=$(system_profiler SPBluetoothDataType 2>/dev/null | grep "Bluetooth Power" | awk '{print $3}')
if [ "$BT_STATUS" = "On" ]; then
# Check if any devices are connected
CONNECTED=$(system_profiler SPBluetoothDataType 2>/dev/null | grep "Connected: Yes" | wc -l)
if [ $CONNECTED -gt 0 ]; then
sketchybar --set "$NAME" icon="󰂯" icon.color=0xfffacc15
else
sketchybar --set "$NAME" icon="󰂲" icon.color=0xffffffff
fi
else
sketchybar --set "$NAME" icon="󰂲" icon.color=0xff6272a4
fi

View file

@ -0,0 +1,14 @@
#!/bin/bash
# Calendar plugin with proper date formatting
# Get current date components
DAY=$(date '+%d')
MONTH_DAY=$(date '+%a %b %d')
TIME=$(date '+%H:%M')
# Remove leading zero from day for icon
ICON_DAY=$(date '+%-d')
# Format the display
sketchybar --set "$NAME" icon="$ICON_DAY" label="$MONTH_DAY $TIME"

View file

@ -0,0 +1,9 @@
#!/bin/bash
# Enhanced clock script with better date formatting
DATE=$(date '+%a %b %d')
TIME=$(date '+%H:%M')
sketchybar --set "$NAME" icon="$(date '+%d')" label="$DATE $TIME"

View file

@ -0,0 +1,21 @@
#!/bin/bash
# Dato integration with clean 12-hour format
# Simple, clean date and time display
# Get current date and time in 12-hour format
DAY=$(date '+%-d')
MONTH=$(date '+%B')
YEAR=$(date '+%Y')
TIME=$(date '+%-I:%M %p %Z')
# Add ordinal suffix to day
case $DAY in
1|21|31) SUFFIX="st";;
2|22) SUFFIX="nd";;
3|23) SUFFIX="rd";;
*) SUFFIX="th";;
esac
# Set clean label with full format
sketchybar --set "$NAME" label="$MONTH ${DAY}${SUFFIX}, $YEAR $TIME"

View file

@ -0,0 +1,18 @@
#!/bin/bash
# Check Focus/Do Not Disturb status
# This is a simplified version - macOS Focus status is complex to detect
# Try to detect if Focus is active
FOCUS_ACTIVE=0
# Check if Do Not Disturb is enabled (basic detection)
if plutil -extract dnd_prefs xml1 -o - ~/Library/Preferences/com.apple.ncprefs.plist 2>/dev/null | grep -q "userPref.*1"; then
FOCUS_ACTIVE=1
fi
if [ $FOCUS_ACTIVE -eq 1 ]; then
sketchybar --set "$NAME" icon="󰂞" icon.color=0xfffacc15
else
sketchybar --set "$NAME" icon="󰂞" icon.color=0xff6272a4
fi

View file

@ -0,0 +1,15 @@
#!/bin/bash
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
source "$CONFIG_DIR/helpers/icon_map.sh"
if [ "$SENDER" = "front_app_switched" ]; then
__icon_map "$INFO"
# Use smooth animation for app switching - sin 6 for quick buttery transition
if [ -n "$icon_result" ] && [ "$icon_result" != ":default:" ]; then
sketchybar --animate sin 6 --set "$NAME" label="$INFO" icon="$icon_result"
else
sketchybar --animate sin 6 --set "$NAME" label="$INFO" icon=":default:"
fi
fi

View file

@ -0,0 +1,33 @@
#!/bin/bash
# Detect microphone usage from various apps
# Check for apps that commonly use microphone
MIC_USAGE=0
# Check for Zoom
if pgrep -f "zoom.us" > /dev/null; then
MIC_USAGE=1
fi
# Check for Teams
if pgrep -f "Microsoft Teams" > /dev/null; then
MIC_USAGE=1
fi
# Check for Discord
if pgrep -f "Discord" > /dev/null; then
MIC_USAGE=1
fi
# Check for QuickTime recording
if pgrep -f "QuickTime Player" > /dev/null && lsof | grep -q "AppleH13CamIn"; then
MIC_USAGE=1
fi
# Show/hide mic indicator based on usage
if [ $MIC_USAGE -eq 1 ]; then
sketchybar --set "$NAME" drawing=on background.drawing=on
else
sketchybar --set "$NAME" drawing=off background.drawing=off
fi

View file

@ -0,0 +1,35 @@
#!/bin/bash
# Filename: ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/mic.sh
# https://github.com/FelixKratz/SketchyBar/discussions/12#discussioncomment-1216899
source "$CONFIG_DIR/colors.sh"
# Attempt to get the current input device name
MIC_NAME=$(SwitchAudioSource -t input -c)
# I just want the first word, in case it's too long
MIC_NAME=$(echo $MIC_NAME | awk '{print $1}')
# When no microphone is connected, SwitchAudioSource gives me back random
# characters and sketchybar shows "Warning: Malformed UTF-8 string"
# Validate MIC_NAME as UTF-8, replace invalid sequences with a '?', then compare with original
VALIDATED_MIC_NAME=$(echo "$MIC_NAME" | iconv -f UTF-8 -t UTF-8//IGNORE)
# Get the current microphone volume
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
# Check if MIC_NAME is not meaningful
if [[ "$MIC_NAME" != "$VALIDATED_MIC_NAME" || -z "$MIC_NAME" ]]; then
# If the mic name is not valid or empty
sketchybar -m --set mic label="" icon= icon.color=$YELLOW label.color=$YELLOW
else
# Update SketchyBar with the microphone's name and volume
if [[ $MIC_VOLUME -eq 0 ]]; then
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$RED label.color=$RED
elif [[ $MIC_VOLUME -gt 0 && $MIC_VOLUME -lt 100 ]]; then
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$ORANGE label.color=$ORANGE
elif [[ $MIC_VOLUME -eq 100 ]]; then
sketchybar -m --set mic label="$MIC_NAME $MIC_VOLUME" icon= icon.color=$GREEN label.color=$WHITE
fi
fi

View file

@ -0,0 +1,16 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
if [[ $MIC_VOLUME -eq 0 ]]; then
ICON=" "
COLOR=$RED
#sketchybar -m --set mic icon.color=$RED icon= icon.font="0xProto Nerd Font Mono:Bold:20"
elif [[ $MIC_VOLUME -gt 0 ]]; then
ICON=" "
COLOR=$GREEN
fi
#sketchybar -m --set mic icon= icon.color=$GREEN icon.font="0xProto Nerd Font Mono:Bold:25"
sketchybar -m --set mic icon="$ICON" icon.color="$COLOR" icon.font="0xProto Nerd Font Mono:Bold:30"

View file

@ -0,0 +1,64 @@
#!/bin/bash
# Filename: ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/mic_click.sh
# https://github.com/FelixKratz/SketchyBar/discussions/12#discussioncomment-1216899
source "$CONFIG_DIR/colors.sh"
# This is basically the same as the `toggle_devices()` function in:
# ~/github/dotfiles-latest/sketchybar/felixkratz/plugins/volume_click.sh
toggle_mics() {
which SwitchAudioSource >/dev/null || exit 0
source "$CONFIG_DIR/colors.sh"
args=(--remove '/mic.device\.*/' --set "$NAME" popup.drawing=toggle popup.align=left popup.horizontal=on)
COUNTER=0
CURRENT="$(SwitchAudioSource -t input -c)"
while IFS= read -r device; do
COLOR=$GREY
if [ "${device}" = "$CURRENT" ]; then
COLOR=$WHITE
fi
args+=(--add item mic.device.$COUNTER popup."$NAME"
--set mic.device.$COUNTER label="${device}"
label.color="$COLOR"
click_script="SwitchAudioSource -t input -s \"${device}\" && sketchybar --set /mic.device\.*/ label.color=$GREY --set \$NAME label.color=$WHITE --set $NAME popup.drawing=off")
COUNTER=$((COUNTER + 1))
done <<<"$(SwitchAudioSource -a -t input)"
sketchybar -m "${args[@]}" >/dev/null
}
if [ "$BUTTON" = "left" ]; then
# Attempt to get the current input device name
MIC_NAME=$(SwitchAudioSource -t input -c)
# I just want the first word, in case it's too long
MIC_NAME=$(echo $MIC_NAME | awk '{print $1}')
# When no microphone is connected, SwitchAudioSource gives me back random
# characters and sketchybar shows "Warning: Malformed UTF-8 string"
# Validate MIC_NAME as UTF-8, replace invalid sequences with a '?', then compare with original
VALIDATED_MIC_NAME=$(echo "$MIC_NAME" | iconv -f UTF-8 -t UTF-8//IGNORE)
# Get the current microphone volume
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
# Check if MIC_NAME is not meaningful
if [[ "$MIC_NAME" != "$VALIDATED_MIC_NAME" || -z "$MIC_NAME" ]]; then
# If the mic name is not valid or empty
sketchybar -m --set mic label="" icon=
else
# Update SketchyBar with the microphone's name and volume
if [[ $MIC_VOLUME -lt 100 ]]; then
osascript -e 'set volume input volume 100'
sketchybar -m --set mic label="$MIC_NAME 100" icon= icon.color=$GREEN label.color=$WHITE
elif [[ $MIC_VOLUME -gt 0 ]]; then
osascript -e 'set volume input volume 0'
sketchybar -m --set mic label="$MIC_NAME 0" icon= icon.color=$RED label.color=$RED
fi
fi
# Check for right-click or shift modifier to show the microphone selection popup
elif [ "$BUTTON" = "right" ] || [ "$MODIFIER" = "shift" ]; then
toggle_mics
fi

View file

@ -0,0 +1,18 @@
#!/bin/bash
source "$CONFIG_DIR/colors.sh"
MIC_VOLUME=$(osascript -e 'input volume of (get volume settings)')
if [[ $MIC_VOLUME -eq 0 ]]; then
osascript -e 'set volume input volume 25'
ICON=""
COLOR=$GREEN
#sketchybar -m --set mic icon="" icon.color=$GREEN
elif [[ $MIC_VOLUME -gt 0 ]]; then
osascript -e 'set volume input volume 0'
ICON=""
COLOR=$RED
#sketchybar -m --set mic icon="" icon.color=$RED
fi
sketchybar -m --set mic icon="$ICON" icon.color=$COLOR

View file

@ -0,0 +1,19 @@
#!/bin/bash
SCREEN_RECORDING=0
# Check for active screencapture process (macOS screenshot/recording tool)
if pgrep -x screencapture > /dev/null 2>&1; then
SCREEN_RECORDING=1
fi
# Check for common recording applications
if pgrep -x OBS > /dev/null 2>&1 || pgrep -x Kap > /dev/null 2>&1 || pgrep -x "CleanShot X" > /dev/null 2>&1 || pgrep -x Camtasia > /dev/null 2>&1; then
SCREEN_RECORDING=1
fi
if [ $SCREEN_RECORDING -eq 1 ]; then
sketchybar --set "$NAME" drawing=on background.drawing=on
else
sketchybar --set "$NAME" drawing=off background.drawing=off
fi

View file

@ -0,0 +1,10 @@
#!/bin/bash
# Stop screen recording when clicked
# This simulates the macOS menu bar behavior
# Try to stop screen recording via keyboard shortcut
osascript -e 'tell application "System Events" to key code 28 using {shift down, command down}'
# Or try to quit QuickTime Player if it's recording
pkill -f "QuickTime Player"

View file

@ -0,0 +1,7 @@
#!/bin/sh
# The $SELECTED variable is available for space components and indicates if
# the space invoking this script (with name: $NAME) is currently selected:
# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
sketchybar --set "$NAME" background.drawing="$SELECTED"

View file

@ -0,0 +1,175 @@
#!/bin/bash
next ()
{
osascript -e 'tell application "Spotify" to play next track'
}
back ()
{
osascript -e 'tell application "Spotify" to play previous track'
}
play ()
{
osascript -e 'tell application "Spotify" to playpause'
}
repeat ()
{
REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
if [ "$REPEAT" = "false" ]; then
sketchybar -m --set spotify.repeat icon.highlight=on
osascript -e 'tell application "Spotify" to set repeating to true'
else
sketchybar -m --set spotify.repeat icon.highlight=off
osascript -e 'tell application "Spotify" to set repeating to false'
fi
}
shuffle ()
{
SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
if [ "$SHUFFLE" = "false" ]; then
sketchybar -m --set spotify.shuffle icon.highlight=on
osascript -e 'tell application "Spotify" to set shuffling to true'
else
sketchybar -m --set spotify.shuffle icon.highlight=off
osascript -e 'tell application "Spotify" to set shuffling to false'
fi
}
update ()
{
PLAYING=1
if [ "$(echo "$INFO" | jq -r '.["Player State"]')" = "Playing" ]; then
PLAYING=0
TRACK="$(echo "$INFO" | jq -r .Name | sed 's/\(.\{20\}\).*/\1.../')"
ARTIST="$(echo "$INFO" | jq -r .Artist | sed 's/\(.\{20\}\).*/\1.../')"
ALBUM="$(echo "$INFO" | jq -r .Album | sed 's/\(.\{25\}\).*/\1.../')"
SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
COVER=$(osascript -e 'tell application "Spotify" to get artwork url of current track')
fi
args=()
if [ $PLAYING -eq 0 ]; then
curl -s --max-time 20 "$COVER" -o /tmp/cover.jpg
if [ "$ARTIST" == "" ]; then
args+=(--set spotify.title label="$TRACK"
--set spotify.album label="Podcast"
--set spotify.artist label="$ALBUM" )
else
args+=(--set spotify.title label="$TRACK"
--set spotify.album label="$ALBUM"
--set spotify.artist label="$ARTIST")
fi
args+=(--set spotify.play icon="􀊆"
--set spotify.shuffle icon.highlight=$SHUFFLE
--set spotify.repeat icon.highlight=$REPEAT
--set spotify.cover background.image="/tmp/cover.jpg"
background.color=0x00000000
--set spotify.anchor drawing=on
--set spotify.anchor icon.color=0xfffacc15 )
else
args+=(--set spotify.anchor drawing=on popup.drawing=off
--set spotify.anchor icon.color=0xfffacc15
--set spotify.play icon="􀊄" )
fi
sketchybar -m "${args[@]}"
}
scrubbing() {
DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
DURATION=$((DURATION_MS/1000))
TARGET=$((DURATION*PERCENTAGE/100))
osascript -e "tell application \"Spotify\" to set player position to $TARGET"
sketchybar --set spotify.state slider.percentage=$PERCENTAGE
}
scroll() {
DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
DURATION=$((DURATION_MS/1000))
FLOAT="$(osascript -e 'tell application "Spotify" to get player position')"
TIME=${FLOAT%.*}
sketchybar --animate linear 10 \
--set spotify.state slider.percentage="$((TIME*100/DURATION))" \
icon="$(date -r $TIME +'%M:%S')" \
label="$(date -r $DURATION +'%M:%S')"
}
mouse_clicked () {
case "$NAME" in
"spotify.next") next
;;
"spotify.back") back
;;
"spotify.play") play
;;
"spotify.shuffle") shuffle
;;
"spotify.repeat") repeat
;;
"spotify.state") scrubbing
;;
*) exit
;;
esac
}
popup () {
# Toggle popup instead of just on/off - stays open until clicked elsewhere
sketchybar --set spotify.anchor popup.drawing=toggle
}
routine() {
case "$NAME" in
"spotify.state") scroll
;;
*) update
;;
esac
}
case "$SENDER" in
"mouse.clicked")
if [ "$NAME" = "spotify.anchor" ]; then
sketchybar --set spotify.anchor popup.drawing=toggle
else
mouse_clicked
fi
;;
"mouse.entered")
if [ "$NAME" = "spotify.anchor" ]; then
sketchybar --set spotify.anchor popup.drawing=on
fi
;;
"mouse.exited")
# Close popup after a brief moment to avoid flickering
sleep 0.3
sketchybar --set spotify.anchor popup.drawing=off
;;
"mouse.exited.global")
sketchybar --set spotify.anchor popup.drawing=off
;;
"routine") routine
;;
"forced")
if pgrep -x Spotify > /dev/null 2>&1; then
STATE=$(osascript -e 'tell application "Spotify" to get player state as string' 2>/dev/null)
if [ "$STATE" = "playing" ]; then
TRACK=$(osascript -e 'tell application "Spotify" to get name of current track' 2>/dev/null)
ARTIST=$(osascript -e 'tell application "Spotify" to get artist of current track' 2>/dev/null)
ALBUM=$(osascript -e 'tell application "Spotify" to get album of current track' 2>/dev/null)
INFO=$(jq -n --arg t "$TRACK" --arg a "$ARTIST" --arg al "$ALBUM" \
'{"Player State":"Playing","Name":$t,"Artist":$a,"Album":$al}')
update
fi
fi
;;
*) update
;;
esac

View file

@ -0,0 +1,7 @@
#!/bin/bash
# Trigger the workspace update
/Users/zion/.config/sketchybar/plugins/aerospace_workspaces.sh
# Also trigger a sketchybar update
sketchybar --trigger aerospace_workspace_change

View file

@ -0,0 +1,20 @@
#!/bin/sh
# The volume_change event supplies a $INFO variable in which the current volume
# percentage is passed to the script.
if [ "$SENDER" = "volume_change" ]; then
VOLUME="$INFO"
case "$VOLUME" in
[6-9][0-9]|100) ICON="󰕾"
;;
[3-5][0-9]) ICON="󰖀"
;;
[1-9]|[1-2][0-9]) ICON="󰕿"
;;
*) ICON="󰖁"
esac
sketchybar --set "$NAME" icon="$ICON" label="$VOLUME%"
fi

View file

@ -0,0 +1,17 @@
#!/bin/bash
# Volume scroll script - allows changing volume with mouse scroll
VOLUME_STEP=5
case "$SCROLL_DIRECTION" in
"up")
osascript -e "set volume output volume (output volume of (get volume settings) + $VOLUME_STEP)"
;;
"down")
osascript -e "set volume output volume (output volume of (get volume settings) - $VOLUME_STEP)"
;;
esac
# Trigger volume update
sketchybar --trigger volume_change

View file

@ -0,0 +1,29 @@
#!/bin/bash
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
source "$CONFIG_DIR/icons.sh"
# Check overall internet connection status
INTERNET_CONNECTED=0
# First check if we can reach the internet
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then
INTERNET_CONNECTED=1
fi
if [ $INTERNET_CONNECTED -eq 1 ]; then
# Check if WiFi is on and connected
WIFI_STATUS=$(networksetup -getairportpower en0 2>/dev/null | awk '{print $4}')
SSID=$(networksetup -getairportnetwork en0 2>/dev/null | cut -d' ' -f4-)
if [ "$WIFI_STATUS" = "On" ] && [ "$SSID" != "You are not associated with an AirPort network." ] && [ "$SSID" != "" ]; then
# Connected via WiFi
sketchybar --set "$NAME" icon="📶" label="$SSID"
else
# Connected via Ethernet or other means
sketchybar --set "$NAME" icon="📶" label="Ethernet"
fi
else
# No internet connection at all
sketchybar --set "$NAME" icon="🚫" label="No Internet"
fi

View file

@ -0,0 +1,7 @@
#!/bin/bash
# Simple zen script - toggles between 12h and 24h format
# You can customize this to do whatever you want when clicking the clock
# For now, just open the Calendar app
open -a Calendar

137
.config/sketchybar/sketchybarrc Executable file
View file

@ -0,0 +1,137 @@
#!/bin/bash
# Ensure CONFIG_DIR is set
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/sketchybar}"
export CONFIG_DIR
source "$CONFIG_DIR/colors.sh" # Loads all defined colors
source "$CONFIG_DIR/icons.sh" # Loads all defined icons
ITEM_DIR="$CONFIG_DIR/items" # Directory where the items are configured
PLUGIN_DIR="$CONFIG_DIR/plugins" # Directory where all the plugin scripts are stored
FONT="0xProto Nerd Font Mono" # Match user's preferred font
PADDINGS=3 # All paddings use this value (icon, label, background)
# Unload the macOS on screen indicator overlay for volume change
launchctl unload -F /System/Library/LaunchAgents/com.apple.OSDUIHelper.plist > /dev/null 2>&1 &
# Setting up the general bar appearance of the bar
bar=(
height=39
color=$BAR_COLOR
shadow=on
position=top
sticky=on
padding_right=10
padding_left=10
corner_radius=9
y_offset=10
margin=10
blur_radius=20
notch_width=200
)
sketchybar --bar "${bar[@]}"
# Setting up default values
defaults=(
updates=when_shown
icon.font="$FONT:Bold:16.0"
icon.color=$ICON_COLOR
icon.padding_left=8
icon.padding_right=4
label.font="$FONT:Bold:15.0"
label.color=$LABEL_COLOR
label.padding_left=4
label.padding_right=8
padding_right=8
padding_left=8
background.height=30
background.corner_radius=9
popup.background.border_width=2
popup.background.corner_radius=9
popup.background.border_color=$POPUP_BORDER_COLOR
popup.background.color=$POPUP_BACKGROUND_COLOR
popup.blur_radius=20
popup.background.shadow.drawing=on
)
sketchybar --default "${defaults[@]}"
# Create aerospace workspace events
sketchybar --add event aerospace_workspace_change
sketchybar --add event window_focus
sketchybar --add event space_change
# Left: Apple + Aerospace workspaces + Current App
source "$ITEM_DIR/apple.sh"
# Pre-create all workspace items for smooth updates (no add/remove cycle)
for i in {1..9}; do
sketchybar --add space aerospace.workspace.$i left \
--set aerospace.workspace.$i associated_display=1 \
--set aerospace.workspace.$i icon.padding_left=8 \
--set aerospace.workspace.$i icon.padding_right=4 \
--set aerospace.workspace.$i icon.font="sketchybar-app-font:Regular:16.0" \
--set aerospace.workspace.$i label.padding_left=4 \
--set aerospace.workspace.$i label.padding_right=8 \
--set aerospace.workspace.$i label.font="SF Pro:Semibold:13.0" \
--set aerospace.workspace.$i background.border_width=0 \
--set aerospace.workspace.$i background.corner_radius=8 \
--set aerospace.workspace.$i background.height=28 \
--set aerospace.workspace.$i background.drawing=on \
--set aerospace.workspace.$i click_script="aerospace workspace $i &" \
--set aerospace.workspace.$i drawing=off
done
# Now run aerospace.sh to set initial state
source "$ITEM_DIR/aerospace.sh"
# Add current app right after aerospace workspaces
sketchybar --add item front_app left \
--set front_app background.color=$BACKGROUND_2 \
--set front_app icon.color=$BLUE \
--set front_app icon.font="sketchybar-app-font:Regular:16.0" \
--set front_app label.color=0xffffffff \
--set front_app label.font="0xProto Nerd Font Mono:Bold:15.0" \
--set front_app script="$PLUGIN_DIR/front_app.sh" \
--subscribe front_app front_app_switched
# Volume
#source "$ITEM_DIR/volume.sh"
# Center: Spotify popup player
#source "$ITEM_DIR/spotify.sh"
# Subscribe to Spotify events
#sketchybar --trigger spotify_change
# Right: System indicators and Dato
#source "$ITEM_DIR/recording.sh"
source "$ITEM_DIR/mic.sh"
source "$ITEM_DIR/clock.sh"
source "$ITEM_DIR/battery.sh"
#sketchybar -m --add item mic right \
# --set mic update_freq=3 \
# script="$PLUGIN_DIR/mic/mic.sh" \
# click_script="$PLUGIN_DIR/mic/mic_click.sh" \
# --subscribe mic volume_change
# Event listener for aerospace changes
# aerospace_workspace_change → fast path (color swap via env vars from exec-on-workspace-change)
# front_app_switched → full path (icon refresh when apps open/close/move)
sketchybar --add item aerospace_listener left \
--set aerospace_listener script="$CONFIG_DIR/items/aerospace.sh" \
--set aerospace_listener icon.drawing=off \
--set aerospace_listener label.drawing=off \
--set aerospace_listener background.drawing=off \
--set aerospace_listener width=0 \
--subscribe aerospace_listener aerospace_workspace_change front_app_switched
# Forcing all item scripts to run (never do this outside of sketchybarrc)
sketchybar --update
echo "sketchybar configuration loaded.."

View file

@ -0,0 +1,91 @@
# This is a demo config to showcase some of the most important commands.
# It is meant to be changed and configured, as it is intentionally kept sparse.
# For a (much) more advanced configuration example see my dotfiles:
# https://github.com/FelixKratz/dotfiles
PLUGIN_DIR="$CONFIG_DIR/plugins"
##### Bar Appearance #####
# Configuring the general appearance of the bar.
# These are only some of the options available. For all options see:
# https://felixkratz.github.io/SketchyBar/config/bar
# If you are looking for other colors, see the color picker:
# https://felixkratz.github.io/SketchyBar/config/tricks#color-picker
sketchybar --bar position=top height=40 blur_radius=30 color=0x40000000
##### Changing Defaults #####
# We now change some default values, which are applied to all further items.
# For a full list of all available item properties see:
# https://felixkratz.github.io/SketchyBar/config/items
default=(
padding_left=5
padding_right=5
icon.font="Hack Nerd Font:Bold:17.0"
label.font="Hack Nerd Font:Bold:14.0"
icon.color=0xffffffff
label.color=0xffffffff
icon.padding_left=4
icon.padding_right=4
label.padding_left=4
label.padding_right=4
)
sketchybar --default "${default[@]}"
##### Adding Mission Control Space Indicators #####
# Let's add some mission control spaces:
# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
# to indicate active and available mission control spaces.
SPACE_ICONS=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10")
for i in "${!SPACE_ICONS[@]}"
do
sid="$(($i+1))"
space=(
space="$sid"
icon="${SPACE_ICONS[i]}"
icon.padding_left=7
icon.padding_right=7
background.color=0x40ffffff
background.corner_radius=5
background.height=25
label.drawing=off
script="$PLUGIN_DIR/space.sh"
click_script="yabai -m space --focus $sid"
)
sketchybar --add space space."$sid" left --set space."$sid" "${space[@]}"
done
##### Adding Left Items #####
# We add some regular items to the left side of the bar, where
# only the properties deviating from the current defaults need to be set
sketchybar --add item chevron left \
--set chevron icon= label.drawing=off \
--add item front_app left \
--set front_app icon.drawing=off script="$PLUGIN_DIR/front_app.sh" \
--subscribe front_app front_app_switched
##### Adding Right Items #####
# In the same way as the left items we can add items to the right side.
# Additional position (e.g. center) are available, see:
# https://felixkratz.github.io/SketchyBar/config/items#adding-items-to-sketchybar
# Some items refresh on a fixed cycle, e.g. the clock runs its script once
# every 10s. Other items respond to events they subscribe to, e.g. the
# volume.sh script is only executed once an actual change in system audio
# volume is registered. More info about the event system can be found here:
# https://felixkratz.github.io/SketchyBar/config/events
sketchybar --add item clock right \
--set clock update_freq=10 icon= script="$PLUGIN_DIR/clock.sh" \
--add item volume right \
--set volume script="$PLUGIN_DIR/volume.sh" \
--subscribe volume volume_change \
--add item battery right \
--set battery update_freq=120 script="$PLUGIN_DIR/battery.sh" \
--subscribe battery system_woke power_source_change
##### Force all scripts to run the first time (never do this in a script) #####
sketchybar --update

View file

@ -0,0 +1,80 @@
# Modern Sketchybar config with Aerospace integration
# Shows only active aerospace workspaces with app icons
PLUGIN_DIR="$CONFIG_DIR/plugins"
##### Bar Appearance #####
sketchybar --bar position=top height=40 blur_radius=30 color=0x20000000 margin=8
##### Changing Defaults #####
default=(
padding_left=4
padding_right=4
icon.font="SF Pro Display:Bold:16.0"
label.font="SF Pro Display:Medium:13.0"
icon.color=0xffffffff
label.color=0xffffffff
background.border_width=0
background.corner_radius=8
background.height=32
)
sketchybar --default "${default[@]}"
##### Adding Dynamic Aerospace Workspaces #####
# This will be populated by the aerospace_workspaces.sh script
# Only shows workspaces that actually have windows
##### Adding Left Items #####
# Separator and current app
sketchybar --add item separator left \
--set separator icon="󰿟" \
icon.color=0xff9ca0a4 \
icon.padding_left=8 \
icon.padding_right=8 \
label.drawing=off \
--add item front_app left \
--set front_app icon.drawing=off \
script="$PLUGIN_DIR/front_app.sh" \
label.font="SF Pro Display:Semibold:13.0" \
--subscribe front_app front_app_switched
##### Adding Right Items #####
# Modern right-side items with proper icons
# Dato (Date/Time)
sketchybar --add item dato right \
--set dato update_freq=30 \
icon="󰸗" \
icon.color=0xff9ca0a4 \
icon.padding_right=8 \
script="$PLUGIN_DIR/dato.sh" \
# Volume
sketchybar --add item volume right \
--set volume script="$PLUGIN_DIR/volume.sh" \
icon.color=0xff9ca0a4 \
icon.padding_right=8 \
--subscribe volume volume_change \
# Battery
sketchybar --add item battery right \
--set battery update_freq=120 \
script="$PLUGIN_DIR/battery.sh" \
icon.color=0xff9ca0a4 \
icon.padding_right=8 \
--subscribe battery system_woke power_source_change
##### Initialization #####
# Run the aerospace workspace script to populate workspaces
sketchybar --add event aerospace_workspace_change \
--add item aerospace_trigger left \
--set aerospace_trigger script="$PLUGIN_DIR/aerospace_workspaces.sh" \
label.drawing=off \
icon.drawing=off \
--subscribe aerospace_trigger aerospace_workspace_change
# Initial population of workspaces
"$PLUGIN_DIR/aerospace_workspaces.sh"
##### Force all scripts to run #####
sketchybar --update

67
.local/bin/sidestep Executable file
View file

@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Prints the target path; use with:
# cd "$(sidestep <region> [nonprod|prod])"
# Or add this wrapper to ~/.zshrc so plain "sidestep <region>" cds directly:
# sidestep() { local d; d="$(command sidestep "$@")" && cd "$d"; }
set -euo pipefail
region="${1-}"
env="${2-}"
if [[ -z "$region" ]]; then
echo "sidestep: usage: sidestep <region> [nonprod|prod]" >&2
exit 1
fi
# Split PWD into path segments; IFS scoped to read only — avoids the bash 3.2
# bug that corrupts ${array[*]:offset:N} when a local IFS is set.
IFS='/' read -ra segs <<< "$PWD"
# Locate the *-hosting segment (0-indexed).
idx=-1
for i in "${!segs[@]}"; do
if [[ "${segs[$i]}" == *-hosting ]]; then
idx=$i
break
fi
done
if [[ $idx -eq -1 ]]; then
echo "sidestep: not inside a *-hosting directory" >&2
exit 1
fi
# Determine the target tier: keep current unless an env was given.
tier="${segs[$idx]}"
case "$env" in
'') ;;
nonprod) tier="staging-hosting" ;;
prod) tier="prod-hosting" ;;
*)
echo "sidestep: unknown env '$env' (expected nonprod or prod)" >&2
exit 1
;;
esac
# prefix = everything before the tier segment, joined by /.
# Uses printf to avoid the bash 3.2 0x7f corruption from ${array[*]:...} with custom IFS.
prefix=$(printf '%s/' "${segs[@]:0:$idx}")
prefix="${prefix%/}"
# subpath = everything after the region segment (tier+2 onward), preserved as-is.
sub_start=$((idx + 2))
sub=("${segs[@]:$sub_start}")
dest="${prefix}/${tier}/${region}"
if [[ ${#sub[@]} -gt 0 ]]; then
subpath=$(printf '%s/' "${sub[@]}")
dest="${dest}/${subpath%/}"
fi
if [[ ! -d "$dest" ]]; then
echo "sidestep: directory does not exist: $dest" >&2
exit 1
fi
printf '%s\n' "$dest"

65
.local/bin/tsh-proxy-db Executable file
View file

@ -0,0 +1,65 @@
#!/usr/bin/env bash
# Usage: run from a directory containing terragrunt.hcl with a postgres provider block
set -euo pipefail
TERRAGRUNT_HCL="${PWD}/terragrunt.hcl"
if [[ ! -f "$TERRAGRUNT_HCL" ]]; then
echo "error: no terragrunt.hcl found in current directory" >&2
exit 1
fi
# Extract the db_ports key from the postgres provider block
# Matches: port = "${local.common_vars.locals.db_ports["some_key"]}"
DB_PORT_KEY=$(grep -oP 'db_ports\["\K[^"]+' "$TERRAGRUNT_HCL" | head -1)
if [[ -z "$DB_PORT_KEY" ]]; then
echo "error: could not find db_ports key in postgres provider block of terragrunt.hcl" >&2
exit 1
fi
# Walk up directory tree to find common.hcl
find_parent_file() {
local dir
dir="$(dirname "$1")"
while [[ "$dir" != "/" ]]; do
if [[ -f "$dir/$2" ]]; then
echo "$dir/$2"
return 0
fi
dir="$(dirname "$dir")"
done
return 1
}
COMMON_HCL=$(find_parent_file "$TERRAGRUNT_HCL" "common.hcl" || true)
if [[ -z "$COMMON_HCL" ]]; then
echo "error: could not find common.hcl in any parent directory" >&2
exit 1
fi
# Extract port value for the key using yq
DB_PORT=$(yq -oy -r ".[].db_ports[\"${DB_PORT_KEY}\"]" "$COMMON_HCL")
if [[ -z "$DB_PORT" || "$DB_PORT" == "null" ]]; then
echo "error: no port found for key '${DB_PORT_KEY}' in ${COMMON_HCL}" >&2
exit 1
fi
# Derive teleport DB name: saas_psql_prod_usw2 -> saas-psql-prod-usw2
TSH_DB_NAME=$(echo "$DB_PORT_KEY" | tr '_' '-')
echo "db port key : ${DB_PORT_KEY}"
echo "common.hcl : ${COMMON_HCL}"
echo "port : ${DB_PORT}"
echo "tsh db name : ${TSH_DB_NAME}"
echo ""
echo "running: tsh proxy db --tunnel --db-user immuta_admin --db-name postgres --port ${DB_PORT} ${TSH_DB_NAME}"
echo ""
exec tsh proxy db --tunnel \
--db-user immuta_admin \
--db-name postgres \
--port "$DB_PORT" \
"$TSH_DB_NAME"

87
.zshrc.d/cd_history.zsh Normal file
View file

@ -0,0 +1,87 @@
#!/bin/bash
# --- CONFIGURATION ---
# File where the history of directories will be stored
CD_HISTORY_FILE="$HOME/.cd_history"
# --- FUNCTIONS ---
# 1. History Logging Function
# Logs the current directory path, ensuring it's an absolute path.
_cd_log_history() {
local current_dir=$(pwd -P) # -P ensures physical path (no symlinks)
# Check if the history file exists, if not, create it.
if [[ ! -f "$CD_HISTORY_FILE" ]]; then
echo "# cd_history file created on $(date)" > "$CD_HISTORY_FILE"
fi
# Optimization: Prevent adding the exact same directory path consecutively.
# We read the last few lines of the file to check if the path is already there.
local last_entries=$(tail -n 5 "$CD_HISTORY_FILE" | grep "$current_dir$")
if [[ -z "$last_entries" ]]; then
echo "$current_dir" >> "$CD_HISTORY_FILE"
fi
}
# 2. The Main Wrapper Function (Overrides built-in 'cd')
# This function intercepts all calls to 'cd'.
cd() {
# 1. LOGGING: Always log the directory we are leaving.
_cd_log_history
# 2. ARGUMENT HANDLING: Check if the user provided a target directory argument.
if [ $# -gt 0 ]; then
# Standard behavior: User explicitly provided a path (e.g., cd /etc/ssh)
# We skip fzf and use the standard built-in 'cd' command.
builtin cd "$@"
return $?
fi
# 3. INTERACTIVE HISTORY SEARCH: No arguments provided (just "cd").
echo ""
echo "--- CD History Search ---"
echo "Select a directory from your history list:"
echo "-------------------------"
# Check if fzf is available
if ! command -v fzf &> /dev/null; then
echo "Error: fzf could not be found. Please install it (e.g., 'sudo apt install fzf')."
echo "Falling back to standard 'cd' behavior..."
builtin cd
return $?
fi
# Use fzf on the history file content
local selected_dir=$(
cat "$CD_HISTORY_FILE" | \
grep -vE '^(#|$)' | \
fzf --header="Select directory (Use 'Ctrl+C' to cancel search)" --reverse
)
# Check if the user selected a directory
if [ -n "$selected_dir" ]; then
echo ""
echo "=> Changing directory to: $selected_dir"
# Perform the actual directory change
builtin cd "$selected_dir"
return $?
else
# User pressed ESC or Ctrl+C
echo ""
echo "Search cancelled. Remaining in current directory."
# Replicate the behavior of calling 'cd' with no args (usually returns to HOME)
builtin cd
return $?
fi
}
# 3. Installation Function
# This function overwrites the existing 'cd' command with our wrapper.
install_cd_wrapper() {
# Ensure the wrapper function replaces the built-in command
export -f cd
echo "✅ Successfully installed custom 'cd' wrapper."
echo "You can now use 'cd' and it will prompt for history lookup."
}

View file

@ -2,9 +2,7 @@
[ -f $HOME/.vault-token ] && source ~/.vault-token
export AWS_VAULT_BACKEND=keychain
export AWS_VAULT_KEYCHAIN_NAME="aws-vault"
export AWS_VAULT_KEYCHAIN_NAME="aws-vault.keychain-db"
export AWS_LOGIN_BROWSER="firefox"
#export KUBECONFIG=/Users/steve.briggs/.kube/config:/Users/steve.briggs/.kube/minikube
export KUBECONFIG="${HOME}/.kube/teleport-kubeconfig:${HOME}/.kube/config:${HOME}/.kube/minikube"
export PATH=$PATH:/private/var/folders/ky/m6p32md91_n2q6z94fdn8fsw0000gq/T/AppTranslocation/F252CD76-5A71-4D7F-8826-12175DB43E32/d/Visual\ Studio\ Code.app/Contents/Resources/app/bin