Documentation

Advanced Configuration

Configure Snapzy programmatically using config.toml for portable preferences, automated backups, and dotfile workflow sync.

Overview

For power users, developers, and system administrators, Snapzy supports advanced programmatic configuration using a standard TOML file (config.toml). This allows you to manage all application preferences in plain text, sync them using dotfiles repositories, and set up automated deployments across macOS environments.

Onboarding Requirement — Due to macOS sandbox security, Snapzy requires a one-time folder permission grant before it can read or write files under your home directory. Ensure you set this up in the Advanced Preferences panel.


Getting Started

1. Enable Configuration Access

  1. Open Snapzy Preferences (Cmd + ,) and navigate to the Advanced tab.
  2. Click Set Up config.toml.
  3. A native file dialog will prompt you to select or grant access to the configuration directory. Select the directory (usually ~/.config/snapzy/) and click Grant Access.

Once access is granted, Snapzy will automatically generate a default config.toml at:

~/.config/snapzy/config.toml

2. Synchronization & Background Loading

  • Auto-Apply on Launch: Snapzy parses and validates config.toml every time the application launches.
  • Background Sync: The app monitors config.toml for changes in the background. Edits made directly in your editor are validated and applied automatically within seconds (debounced to avoid incomplete reads).
  • Manual Sync: You can click Sync config.toml under Advanced Preferences to reload configurations instantly.
  • Restore Defaults: Clicking Restore Defaults in the UI regenerates the default TOML file, overwriting existing properties with original factory values.

Fully Commented Example TOML

Below is a complete template of a valid config.toml file with all available configurations and comments explaining each attribute.

# Snapzy TOML Configuration Schema Version (Must be 1)
schema_version = 1

# Minimum required Snapzy version for this file
snapzy_min_version = "1.20.0"

[general]
language = "system"                # "system" or language code: "en", "vi", "ja", "ko", "ru", "zh", "zh-tw"
appearance = "system"              # "system", "light", or "dark"
play_sounds = true                 # Play sound effects on capture/recording events
start_at_login = false             # Automatically launch Snapzy at macOS startup
export_location = "~/Pictures"     # Target folder for saving local captures (supports ~ expansions)

[updates]
check_automatically = true         # Automatically check for updates using Sparkle
download_automatically = false     # Download updates in the background without prompting

[diagnostics]
enabled = true                     # Enable local diagnostic logging for problem reporting
retention_days = 7                 # Number of days to retain logs (1 to 30)

[capture]
hide_desktop_icons = false         # Temporarily hide desktop icons during capture
hide_desktop_widgets = false       # Temporarily hide desktop widgets during capture

[capture.naming]
screenshot_template = "Snapzy_{year}-{month}-{day}_{hour}-{minute}-{second}_{milliseconds}" # Filename format
recording_template = "Snapzy_{year}-{month}-{day}_{hour}-{minute}-{second}_{milliseconds}"  # Filename format

[capture.screenshot]
format = "png"                     # "png", "jpeg", or "webp"
include_snapzy = false             # Include Snapzy's own UI overlay windows in screenshots
show_cursor = false                # Include the macOS mouse pointer in screenshots

[capture.scrolling]
show_hints = true                  # Show interactive guides during scrolling capture workflows

[capture.ocr]
success_notification = false       # Send a system notification when OCR finishes successfully

[capture.object_cutout]
auto_crop = true                   # Automatically crop cutout image bounds to the subject size

[capture.after.screenshot]
save = true                        # Save screenshots to local export location
quick_access = true                # Show Quick Access overlay after capture
copy_file = true                   # Copy generated file data to system clipboard
open_annotate = false              # Open image in Annotate editor automatically
upload_to_cloud = false            # Instantly upload captured image to configured cloud bucket

[capture.after.recording]
save = true                        # Save recordings to local export location
quick_access = true                # Show Quick Access overlay after recording
copy_file = true                   # Copy video file to system clipboard
open_annotate = false              # Open video in Video Editor automatically
upload_to_cloud = false            # Instantly upload video to configured cloud bucket

[recording]
format = "mov"                     # Video container format: "mov" or "mp4"
quality = "high"                   # Quality preset: "high", "medium", or "low"
fps = 30                           # Video frames-per-second target (1 to 120)
output_mode = "video"              # Export target: "video" (MP4/MOV) or "gif" (animated GIF)
capture_system_audio = true        # Record system output audio (requires virtual audio loopback)
capture_microphone = false         # Record microphone input audio
microphone_device_id = ""          # CoreAudio device UID string for microphone capture
remember_last_area = true          # Remember last selected region coordinates for subsequent captures
include_snapzy = false             # Include Snapzy overlays/toolbars in final recording outputs
show_cursor = true                 # Include macOS cursor in video stream
highlight_clicks = false           # Draw overlay highlight rings around clicks
show_keystrokes = false            # Display on-screen keystroke overlays during recording

[recording.mouse_highlight]
size = 50                          # Cursor highlight circle diameter in pixels (20 to 120)
animation_duration = 0.7           # Click animation ripple duration in seconds (0.1 to 3.0)
color = "#FF000080"                # Highlight circle color hex format (#RRGGBB or #RRGGBBAA)
opacity = 0.5                      # Alpha opacity for mouse overlay (0.0 to 1.0)
ripple_count = 3                   # Number of ripples per click animation (1 to 6)

[recording.keystrokes]
font_size = 18.0                   # Size of display font in points (10.0 to 48.0)
position = "bottomCenter"          # Overlay location: "topLeft", "topRight", "bottomLeft", "bottomRight", "bottomCenter", etc.
display_duration = 2.0             # Keystroke display duration in seconds (0.3 to 10.0)

[recording.annotation_shortcuts]
modifier = "shift"                 # Hold modifier key for annotation toolbar: "shift", "option", "command", "control"
hold_duration = 1.0                # Press-and-hold activation time in seconds (0.1 to 5.0)

[quick_access]
enabled = true                     # Enable Quick Access thumbnail overlay after capture
position = "bottomRight"           # Anchor corner: "topLeft", "topRight", "bottomLeft", "bottomRight"
auto_dismiss = true                # Automatically fade out panel after delay
auto_dismiss_delay = 10.0          # Delay duration in seconds before panel dismisses (3.0 to 30.0)
pause_countdown_on_hover = true    # Suspend auto-dismiss countdown timer when mouse hovers over panel
overlay_scale = 1.0                # Size scaling factor for the preview thumbnail (0.75 to 1.5)
drag_drop = true                   # Enable drag-and-drop actions for preview file paths
actions_order = ["copy", "annotate", "save", "cloud", "delete"] # Custom action button arrangement
enabled_actions = ["copy", "annotate", "save", "cloud", "delete"] # List of active buttons

[quick_access.slots]
center_top = "copy"                # Quick Access Action mapping for Slot
center_bottom = "annotate"         # Quick Access Action mapping for Slot
top_trailing = "save"              # Quick Access Action mapping for Slot
top_leading = "cloud"              # Quick Access Action mapping for Slot
bottom_leading = "delete"          # Quick Access Action mapping for Slot
bottom_trailing = ""               # Empty means unassigned slot

[history]
enabled = true                     # Enable local capture history logging
retention_days = 30                # Days to keep history records before purge (0 for infinite)
max_count = 500                    # Maximum allowed historical logs (0 to 1000)
background_style = "hud"           # Theme background: "hud" (transparent glass) or "solid"
open_on_launch = false             # Open history browser automatically when starting Snapzy

[history.floating]
enabled = true                     # Show floating history HUD bar on screen
position = "topCenter"             # Floating bar alignment: "topCenter", "bottomCenter", "center"
default_filter = "all"             # Initial filter: "all", "screenshot", "recording", "ocr", "cutout"
max_displayed_items = 10           # Max entries inside the HUD view (3 to 20)
scale = 1.0                        # Layout scale scaling modifier (0.8 to 1.2)
auto_clear_days = 0                # Clean up history entries older than X days (0 to 365)

[cloud]
provider = "aws_s3"                # Storage provider target: "aws_s3" or "cloudflare_r2"
bucket = "my-snapzy-bucket"        # AWS S3 / Cloudflare R2 bucket name
region = "us-east-1"               # Bucket region identifier (required for S3)
endpoint = ""                      # Custom endpoint URL string (required for Cloudflare R2)
custom_domain = ""                 # Base domain for clean public shareable links
expire_time = "7d"                 # Pre-signed links / lifecycle expire duration: "1d", "3d", "7d", "14d", "30d", "60d", "90d", "permanent"
uploads_window_position = "center" # Upload panel layout target: "top", "center", "bottom"

[annotate]
clipboard_image_open_behavior = "ask" # Open clipboard behavior: "ask", "loadAutomatically", "doNothing"
close_after_drag = true            # Dismiss annotate window automatically after dragging image out
bring_forward_after_drag = false   # Bring target application to front after drag operations finish
quick_properties_sync = true       # Synchronize property values (color, stroke) instantly between tool options

[shortcuts]
enabled = true                     # Global hotkey listener toggle (must be true to register hotkeys)

[shortcuts.global.fullscreen]
enabled = true
key = "3"
modifiers = ["command", "shift"]

[shortcuts.global.area]
enabled = true
key = "4"
modifiers = ["command", "shift"]

[shortcuts.global.areaAnnotate]
enabled = true
key = "7"
modifiers = ["command", "shift"]

[shortcuts.global.scrollingCapture]
enabled = true
key = "6"
modifiers = ["command", "shift"]

[shortcuts.global.recording]
enabled = true
key = "5"
modifiers = ["command", "shift"]

[shortcuts.global.annotate]
enabled = true
key = "A"
modifiers = ["command", "shift"]

[shortcuts.global.videoEditor]
enabled = true
key = "E"
modifiers = ["command", "shift"]

[shortcuts.global.cloudUploads]
enabled = true
key = "L"
modifiers = ["command", "shift"]

[shortcuts.global.shortcutList]
enabled = true
key = "K"
modifiers = ["command", "shift"]

[shortcuts.global.ocr]
enabled = true
key = "2"
modifiers = ["command", "shift"]

[shortcuts.global.objectCutout]
enabled = true
key = "1"
modifiers = ["command", "shift"]

[shortcuts.global.history]
enabled = true
key = "H"
modifiers = ["command", "shift"]

[shortcuts.overlay.area_application_capture]
enabled = true
key = "SPACE"                      # Target specific hotkeys during selection overlay
modifiers = []

[shortcuts.overlay.recording_application_capture]
enabled = true
key = "SPACE"
modifiers = []

[shortcuts.annotate_tools]
disabled = []
# Map keys directly to annotation tool triggers: "1" to "8" (e.g. pen, rectangle, text)
"1" = "pen"
"2" = "arrow"
"3" = "rect"
"4" = "oval"
"5" = "text"
"6" = "blur"

[shortcuts.annotate_actions.copyAndClose]
enabled = true
key = "C"
modifiers = ["command"]

[shortcuts.annotate_actions.toggleSidebar]
enabled = true
key = "B"
modifiers = ["command"]

[shortcuts.annotate_actions.togglePin]
enabled = true
key = "P"
modifiers = ["command"]

[shortcuts.annotate_actions.cloudUpload]
enabled = true
key = "U"
modifiers = ["command"]

Configuration Properties Reference

General Section ([general])

PropertyTypeDefault ValueValid Options / RangeDescription
languageString"system""system", "en", "vi", "ja", "ko", "ru", "zh", "zh-tw"Language configuration for Snapzy UI.
appearanceString"system""system", "light", "dark"UI appearance theme mode.
play_soundsBooleantruetrue, falseEnable/disable sound effects upon captures.
start_at_loginBooleanfalsetrue, falseStart application automatically on user login.
export_locationString"~/Pictures"Valid directory pathLocal destination path for outputs.

Updates & Diagnostics

PropertyTypeDefault ValueValid Options / RangeDescription
updates.check_automaticallyBooleantruetrue, falseAutomatically poll Sparkle app cast for updates.
updates.download_automaticallyBooleanfalsetrue, falseAuto-download new releases silently.
diagnostics.enabledBooleantruetrue, falseWrite runtime telemetry diagnostic logs to disk.
diagnostics.retention_daysInteger71 to 30Number of days to persist log files before purging.

Screenshot & Naming ([capture])

PropertyTypeDefault ValueValid Options / RangeDescription
hide_desktop_iconsBooleanfalsetrue, falseTemporarily toggle desktop files visibility.
hide_desktop_widgetsBooleanfalsetrue, falseTemporarily hide widgets during capture.
naming.screenshot_templateString"Snapzy_{year}...Template formatFile name layout patterns for screenshots.
naming.recording_templateString"Snapzy_{year}...Template formatFile name layout patterns for video files.
screenshot.formatString"png""png", "jpeg", "webp"Target format for screen screenshots.
screenshot.include_snapzyBooleanfalsetrue, falseCapture Snapzy's utility window panels.
screenshot.show_cursorBooleanfalsetrue, falseCapture mouse cursor pointer arrow.
scrolling.show_hintsBooleantruetrue, falseShow visual hints during scrolling captures.
ocr.success_notificationBooleanfalsetrue, falseSend notifications on successful text extraction.
object_cutout.auto_cropBooleantruetrue, falseTrim whitespace borders around object cutout boundaries.

After Capture Events

PropertyTypeDefault ValueValid Options / RangeDescription
capture.after.screenshot.saveBooleantruetrue, falseWrite screenshot files automatically to export folder.
capture.after.screenshot.quick_accessBooleantruetrue, falseSpawn Quick Access float panel thumbnail.
capture.after.screenshot.copy_fileBooleantruetrue, falseCopy saved file directory path to clipboard.
capture.after.screenshot.open_annotateBooleanfalsetrue, falseLaunch screenshot directly in the Annotate editor.
capture.after.screenshot.upload_to_cloudBooleanfalsetrue, falseInstantly trigger upload to cloud storage.
capture.after.recording.saveBooleantruetrue, falseSave recording files to local destination directory.
capture.after.recording.quick_accessBooleantruetrue, falseSpawn Quick Access float panel thumbnail.
capture.after.recording.copy_fileBooleantruetrue, falseCopy generated video location path to clipboard.
capture.after.recording.open_annotateBooleanfalsetrue, falseLaunch video directly in the Video Editor.
capture.after.recording.upload_to_cloudBooleanfalsetrue, falseAutomatically initiate background cloud uploads.

Screen Recording ([recording])

PropertyTypeDefault ValueValid Options / RangeDescription
formatString"mov""mov", "mp4"Video container format wrapper.
qualityString"high""high", "medium", "low"Target compression level.
fpsInteger301 to 120Captured frame rate density.
output_modeString"video""video", "gif"Export format.
capture_system_audioBooleantruetrue, falseCapture computer sound outputs.
capture_microphoneBooleanfalsetrue, falseCapture voice microphone inputs.
microphone_device_idString""Valid Audio Device IDSpecific hardware input selector.
remember_last_areaBooleantruetrue, falseCache area capture coordinates context.
show_cursorBooleantruetrue, falseCapture system mouse pointer path.
highlight_clicksBooleanfalsetrue, falseEnable mouse highlight animation overlays.
show_keystrokesBooleanfalsetrue, falseDraw pressed shortcuts overlay on stream.
mouse_highlight.sizeDouble50.020.0 to 120.0Outer diameter of mouse click circles.
mouse_highlight.colorString"#FF000080"HEX code (#RRGGBBAA)Mouse click visual indicator stroke color.
mouse_highlight.opacityDouble0.50.0 to 1.0Hover highlight alpha transparency.
mouse_highlight.ripple_countInteger31 to 6Ripple animations loop limit.
keystrokes.font_sizeDouble18.010.0 to 48.0Keystroke font text size in points.
keystrokes.positionString"bottomCenter"Screen corner enumPosition layout for keystrokes text HUD.
keystrokes.display_durationDouble2.00.3 to 10.0Keystroke panel persist timer on screen.
annotation_shortcuts.modifierString"shift"Modifier key enumKey to activate recording annotation toolbar.
annotation_shortcuts.hold_durationDouble1.00.1 to 5.0Activation hold threshold timer in seconds.

Quick Access Panel ([quick_access])

PropertyTypeDefault ValueValid Options / RangeDescription
enabledBooleantruetrue, falseToggle post-capture overlay thumbnail.
positionString"bottomRight"Screen corner enumPosition anchor on target displays.
auto_dismissBooleantruetrue, falseEnable automatic hide countdown timer.
auto_dismiss_delayDouble10.03.0 to 30.0Dismiss countdown timer duration.
pause_countdown_on_hoverBooleantruetrue, falseSuspend dismiss timer on cursor hover.
overlay_scaleDouble1.00.75 to 1.5Preview panel scale layout modifier.
drag_dropBooleantruetrue, falseAllow direct dragging files from overlay.
actions_orderString ArrayDefaultsArray of action UIDsButton arrangement ordering.
enabled_actionsString ArrayDefaultsArray of action UIDsActive actions inside Quick Access grid.

History Browser ([history])

PropertyTypeDefault ValueValid Options / RangeDescription
enabledBooleantruetrue, falseLog capture events metadata.
retention_daysInteger300 to 90Automatic record removal limits (0 = infinite).
max_countInteger5000 to 1000Log density storage quota threshold.
background_styleString"hud""hud", "solid"Panel styling visual presentation.
open_on_launchBooleanfalsetrue, falseSpawn browser window on startup.
floating.enabledBooleantruetrue, falseShow floating history HUD overlay.
floating.positionString"topCenter"Position HUD enumPosition alignment of floating browser panel.
floating.max_displayed_itemsInteger103 to 20Max visible item cards inside float panel.
floating.scaleDouble1.00.8 to 1.2Layout scale scaling modifier.

Cloud Storage Settings ([cloud])

PropertyTypeDefault ValueValid Options / RangeDescription
providerString"aws_s3""aws_s3", "cloudflare_r2"Target cloud backend provider target.
bucketString""Bucket name stringRemote storage folder identification bucket.
regionString"us-east-1"AWS S3 regionsGeographical location region code for AWS S3.
endpointString""Target HTTP API endpointDedicated target URL endpoint (R2 specific).
custom_domainString""Domain URLCustom hostname mapping for public sharing URLs.
expire_timeString"7d""1d", "3d", "7d", "14d", "30d", "60d", "90d", "permanent"Pre-signed upload download expire timer.
uploads_window_positionString"center""top", "center", "bottom"Align location of floating cloud upload HUD.

Security Notice — Sensitive cloud storage credentials (AWS Access Keys, Secret Tokens, etc.) are never stored in the plain text config.toml file to prevent accidental exposures in public dotfiles repositories. Instead, they remain securely encrypted within the native macOS Keychain.

Annotate Editor Settings ([annotate])

PropertyTypeDefault ValueValid Options / RangeDescription
clipboard_image_open_behaviorString"ask""ask", "loadAutomatically", "doNothing"Import clipboard images behavior when launching empty editor.
close_after_dragBooleantruetrue, falseClose editor after dragging output image out.
bring_forward_after_dragBooleanfalsetrue, falseFocus destination app layout after drag-and-drop.
quick_properties_syncBooleantruetrue, falseSync tools stroke size and colors instantly.

Validation & Issues

Snapzy strictly validates config.toml attributes when parsing:

  • Value Constraints: If an attribute exceeds valid ranges (e.g. fps = 150 or overlay_scale = 3.0), Snapzy will report an warning, ignore the invalid property, and use the default values instead.
  • Malformed Types: Specifying values of incorrect types (e.g. putting a string for a boolean property) results in an error. The app will ignore the parsing segment and retain previously loaded config attributes.
  • Issue Warnings: You can review TOML configuration validation warnings and errors directly inside the Advanced Preferences tab under the config sync status view.

Ready to capture
your best work?

Join the open source community building the best screen capture tool for macOS.

macOS 13+ · Intel & Apple Silicon