darkly 0.5.0

A GPU-native paint engine on wgpu: brushes, layers, blend modes, masks, selections, and undo.
Documentation
# Krita overlay. Carries every binding where Krita's choice differs from
# at least one other reference editor, plus Darkly fallbacks for actions
# where Krita has no opinion but some other editor does. Unanimous
# bindings (those all three reference editors agree on) live in
# defaults.yaml; see the rule in defaults.yaml's header.
name: Krita
description: Krita-style keybindings

hotkeys:
  # Edit / clipboard (non-unanimous slice). Krita matches PS on these but
  # GIMP differs (Redo: <primary>Y, Paste-In-Place: <primary><alt>V — see
  # gimp/app/actions/edit-actions.c), so each value is pinned per-overlay.
  redo: $mod+Shift+KeyZ
  pasteInPlace: $mod+Shift+KeyV
  # Krita has no native Preferences hotkey. Fall through to Darkly's
  # macOS-convention pick; users can rebind via the settings UI.
  openSettings: $mod+Comma
  # Krita's `file_export_file` is explicitly `none` (see
  # kritamenu.action). GIMP binds Export As to <primary><shift>E
  # (gimp/app/actions/file-actions.c — `file-export-as`); Darkly inherits
  # that key here.
  exportImage: $mod+Shift+KeyE
  # View > Mirror View. Krita binds M (kritamenu.action `mirror_canvas`,
  # <shortcut>M</shortcut>). Photoshop and GIMP have no opinion; their
  # overlays leave mirrorViewH unbound rather than reuse M (Photoshop's
  # M is rectSelectTool).
  mirrorViewH: KeyM
  # Tools.
  brushTool: KeyB
  fillTool: KeyF
  gradientTool: KeyG
  colorPickerTool: KeyP
  rectSelectTool: KeyR
  ellipseSelectTool: Shift+KeyR
  magicWandTool: KeyW
  transformTool: KeyT
  toggleEraseMode: KeyE
  # Krita's selection-tool .action files have empty <shortcut>. Fall
  # through to Photoshop's L / Shift+L convention.
  lassoSelectTool: KeyL
  polygonSelectTool: Shift+KeyL
  # Layers.
  isolateLayer: KeyI
  deleteLayer: Shift+Delete
  duplicateLayer: $mod+KeyJ
  # Krita's "Add Paint Layer" is bound to Insert (kritamenu.action).
  newLayer: Insert
  # Krita binds "Quick Group" to Ctrl+G (krita.action).
  newGroup: $mod+KeyG
  # Krita binds "Merge with Layer Below" to Ctrl+E (krita.action
  # `merge_layer`, <shortcut>Ctrl+E</shortcut>). The action handler is
  # selection-aware: with ≥2 selected it bakes the selection via
  # merge_layers, with 1 it does the classic single-layer merge-down.
  mergeDown: $mod+KeyE
  # Selection.
  clearSelection: $mod+Shift+KeyA
  invertSelection: $mod+Shift+KeyI
  # Colors. Krita binds Ctrl+I to Invert (`krita_filter_invert`); Invert
  # Selection is the Shift variant above. Photoshop agrees (Ctrl+I → Image >
  # Adjustments > Invert); GIMP does NOT (Ctrl+I is its Invert Selection), so
  # this is per-overlay, not a default.
  adjustInvert: $mod+KeyI

mouse_clicks:
  # Krita's default "Sample FG color from merged image" — Ctrl+drag on
  # Linux/Win, Cmd+drag on macOS (Qt::CTRL auto-maps to Command).
  sampleColor: canvas@paint:$mod+drag
  # Krita's "Change Primary Setting" — shift+drag scrubs brush size.
  brushSizeAdjust: canvas@paint:shift+drag
  # Krita uses Alt+click on a layer/mask thumbnail to isolate the node.
  isolateLayer:
    - layerThumb:alt+click
    - maskThumb:alt+click

settings:
  tools.colorPickerSampleSource: merged