← Guides
Guide · feature

Profiles & context-aware switching

A profile is a complete menu — its own wedge layout, its own appearance config — that Swik can switch into automatically when your context changes. Connecting to your office Wi-Fi can swap to a work menu; docking your laptop to an external display can swap to a docked-desk layout; the clock crossing 5pm can swap to a personal-evening menu. This guide covers what triggers profiles can match on, how the evaluation runs, the priority order when multiple triggers compete, and the recipes that actually hold up.

Pro feature. Free tier supports one profile (your default menu). Multi-profile and all auto-switching is part of Pro ($9 one-time). The mechanics below describe Pro-only behavior.

What a profile holds

Each profile contains a complete snapshot of what the menu looks like and how it's configured:

What it does not hold: the global hotkey, your Pro license, your clipboard history, or analytics. Those live outside profiles and don't change when you switch.

Setting up a profile

Open Settings → Profiles. The first profile is your current default. To add a new one:

  1. Click + New profile. Pick a name (e.g. "Work"), optionally an emoji.
  2. Choose how to start: from a built-in template (Work, Creative, Development, Communication, Browsing, Music), from a duplicate of an existing profile, or empty.
  3. Customize the wedges in the editor — same flow as configuring your default menu.
  4. Set trigger conditions in the profile detail panel (see below).

Profiles persist immediately — there's no "save" button. You can switch between profiles manually at any time via the dropdown in the Profiles tab, or let auto-switching do it.

The four trigger types

Each profile has up to four optional trigger fields. A profile activates when any of its triggers matches the current context. Setting no triggers means the profile is manual-only — it'll only activate when you switch to it explicitly.

App-foreground trigger

Activates this profile when a specific app comes to the foreground. Useful for "always show my design menu when Figma is active."

Setup: Profile detail → Auto-switch when… → pick an app. The trigger is stored as the app's bundle ID, so renaming the app doesn't break it.

Caveat: app triggers fire on app activation. If you switch back to a previously-active app within 5 seconds, the trigger doesn't re-fire. This prevents alt-tab flickering between profiles.

Wi-Fi SSID trigger

Activates when you're connected to a specific Wi-Fi network. The match is on the network name (SSID), not the BSSID — so a single SSID across multiple access points (e.g. mesh routers) all match the same profile.

Setup: Profile detail → Wi-Fi network → type the SSID exactly as it appears in your menu bar Wi-Fi list. Capitalization and spaces matter.

Implementation: Swik reads the SSID via Apple's CoreWLAN framework, falling back to networksetup -getairportnetwork en0 if CoreWLAN doesn't return a value (some macOS configurations restrict CoreWLAN). No extra permissions are needed beyond Accessibility.

Display trigger

Activates when a specific external display is connected. Built-in laptop displays are filtered out — you can't trigger on "MacBook Pro built-in screen" because that's always present. Use this for "docked-at-desk vs laptop-only" workflows.

Setup: Profile detail → External display → pick from currently-detected displays. The trigger stores the display's localized name (e.g. "Studio Display", "LG UltraFine").

Caveat: when you unplug all external displays, no display-triggered profile matches, and Swik falls through to the next trigger type or to the default profile.

Time-of-day trigger

Activates within a daily time range. Stores start and end as minutes since midnight (e.g. 9:00 = 540, 17:00 = 1020). Overnight ranges are supported (e.g. 22:00 to 6:00 wraps midnight correctly).

Setup: Profile detail → Time range → pick start and end hours. Use 24-hour format internally; the UI shows 12-hour or 24-hour based on your macOS preference.

Caveat: "Time of day" matches the system clock, not your real local time if you're traveling and haven't changed time zones. The check runs every 60 seconds, so the swap may take up to a minute to fire after the boundary crosses.

Priority — what wins when triggers compete

Multiple profiles can theoretically all match at once (you're at the office, on office Wi-Fi, with the external display plugged in, during work hours). When that happens, Swik picks one in this priority order:

RankTrigger typeWhy this priority
1 App foreground Most specific — explicit user intent ("I'm in Figma right now"). Overrides everything else for 5 seconds after firing.
2 Wi-Fi SSID Strong location signal — your office network is unique to your office.
3 External display Locational but secondary — multiple displays might match different setups (home vs office).
4 Time of day Weakest — same time of day applies regardless of where you are.

Within each rank, Swik returns the first profile in your profiles list whose trigger matches — so order matters. Drag profiles up and down in Settings → Profiles to control which one wins ties.

If no profile's trigger matches the current context, the most-recently-active profile stays active. Auto-switching never leaves you in a "no profile" state.

When evaluation runs

Auto-switching listens on three independent signals plus a polling fallback. Each one fires evaluateContextTriggers() on the main thread:

TriggerLatencyWhat it catches
App activation event Immediate App-foreground triggers fire as soon as macOS reports the app activated.
Wi-Fi SSID change event ~1 second CoreWLAN posts an SSID-change notification when you join, leave, or roam between APs. Triggers Wi-Fi profile re-evaluation immediately.
Post-wake delay 3 seconds after wake When the Mac wakes from sleep, Swik waits 3 seconds for Wi-Fi and displays to stabilize, then re-evaluates. Without the delay you'd briefly switch to "no Wi-Fi" during wake.
60-second polling timer Up to 60 seconds Catches drift and the time-of-day boundary cross. Also covers display changes if the display event somehow doesn't fire.

Once a swap is decided, there's a 1-second debounce before the actual switch lands. This prevents flicker when context briefly changes (e.g. SSID flicks during a roam) — if the matching profile is no longer the best match by the time the debounce fires, the switch is skipped.

And one more guard: after an app-foreground trigger fires, context-trigger evaluation is suppressed for 5 seconds. This prevents app and context triggers from fighting each other when they want different profiles.

Enabling auto-switching

Auto-switch is off by default — even on Pro. The master toggle is Settings → Profiles → Auto-switch profiles based on context. Until that's on, profiles can only be switched manually via the Profiles tab dropdown.

Two reasons to leave it off: (a) you only want manual control, or (b) you only have one profile and don't need it. Once you have two or more profiles with at least one set of triggers configured, turn it on and the swaps start firing.

Recipes that hold up

Office vs Home

Two profiles, each with a Wi-Fi trigger. Office profile's Wi-Fi trigger = OfficeWiFi; layout has Mail, Calendar, Slack, Notion, Linear. Home profile's Wi-Fi trigger = HomeWiFi; layout has Spotify, Photos, Safari, Notes, Mail.

The swap happens within ~1 second of joining either network — instant adaptation when you walk in the door at either end of the day.

Docked at desk vs laptop alone

One profile triggered by your external display name (e.g. "Studio Display"), with a 6–8 wedge layout that takes advantage of having more screen space. The default profile (no triggers) takes over when the display unplugs — typically a tighter 4–5 wedge layout you've memorized for laptop-only use.

Bonus: combine with Menu Scale (Advanced → Accessibility) — the docked profile can use 1.5× scale for the bigger 5K display, the laptop-alone profile stays at 1.0×.

Work hours vs evening

Two profiles, each with time triggers. Work: 9:00–17:00, work apps. Evening: 17:00–23:00, personal apps. Outside both windows, the default profile (no triggers) takes over for late-night and early-morning sessions.

Time triggers are the lowest priority, so this composes well with Wi-Fi: at home during work hours, the Home Wi-Fi trigger wins (rank 2) over Work time trigger (rank 4).

App-specific design menu

One profile with an app-foreground trigger on Figma's bundle ID (com.figma.Desktop). Layout includes color-pickers as custom-action wedges, Slack, the file manager — design-flow-specific tools.

This profile only activates while Figma is in the foreground. Click out of Figma, the previous profile reappears within 5 seconds. Especially powerful when paired with Apple Shortcuts wedges that automate Figma plugin actions.

Meeting mode

App-foreground trigger on Zoom or Google Meet. Layout includes mute/unmute toggles (Apple Shortcut wedges), camera flip, "send link" custom action, plus your notes app. Auto-activates the moment a video call starts; auto-deactivates when you click away.

Debugging — "why didn't my profile switch?"

There's no UI surface for context-trigger debugging today. To diagnose:

  1. Check the master toggle — Settings → Profiles → Auto-switch profiles based on context. This is the single most common gotcha.
  2. Check Pro status — context triggers are Pro-only. Settings → About should show "Pro" near the version.
  3. Match SSID exactly — for Wi-Fi triggers, the SSID is case-sensitive and includes spaces. Open menu bar Wi-Fi → take the name verbatim. "My Office""my office".
  4. Verify the order — a higher-priority profile in your list might be capturing the context. Profiles → drag the one you want to win to the top.
  5. Wait 60 seconds — for time triggers, the polling check runs once a minute, so a swap can lag by up to 60 seconds after a clock boundary crosses.
  6. Check the 5-second cooldown — if you just app-switched, context triggers are suppressed briefly. Wait 5 seconds and recheck.
  7. Look at currently-detected displays — for display triggers, plug/unplug events on some monitors can take a second to propagate. If the trigger doesn't fire after replugging, check System Settings → Displays sees the screen first.

If you've checked all of these and the swap still doesn't fire, switch the profile manually once via the Profiles dropdown. That confirms the profile is wired correctly and isolates the problem to the trigger condition specifically.

Caveats & current limits

Frequently asked questions

Do profiles share my hotkey, or can each have its own?

Shared. The global hotkey is set once in Settings → Hotkey and used by every profile. The per-profile triggers decide which menu opens, not how the menu opens.

What happens to my wedge layout when a profile auto-switches?

The active profile's slots, rings, and appearance are loaded into the live menu. Your other profiles remain saved untouched. Switching is non-destructive — your edits to the previously-active profile are preserved.

Can I disable a single profile's auto-switching without deleting it?

Yes — clear all four trigger fields on the profile (Wi-Fi, display, time, app). The profile becomes manual-only. You can still switch to it via the Profiles dropdown, but it won't activate from context.

How many profiles can I have?

No hard limit on Pro. Free is capped at 1 (your default). Practically, more than 5–6 profiles becomes unwieldy to maintain — most setups settle around 3 profiles (work / personal / one specialized like meetings or design).

Does Wi-Fi monitoring drain battery?

Negligibly. Swik registers for the macOS-level SSID-change notification, which CoreWLAN already maintains for system Wi-Fi UI. Adding an observer is essentially free.

What's the difference between a profile and a sub-menu?

A sub-menu is a wedge inside the current profile that opens another ring of wedges — it's part of one profile's hierarchy. A profile is a complete alternate menu — different wedges, different rings, different appearance. Sub-menus are about depth within a layout; profiles are about swapping the entire layout for context.

Swik — a radial menu for macOS

Launch anything. One gesture. Free for five wedges, $9 one-time for unlimited. Requires macOS 14 Sonoma or later.

Download for macOS