Pipette Operation Guide

日本語版はこちら

This document explains how to use the Pipette desktop application. Screenshots were taken using a GPK60-63R keyboard unless otherwise noted.


1. Device Connection

1.1 Device Selection Screen

When you launch the app, a list of connected Vial-compatible keyboards is displayed.

Device Selection Screen
  • USB-connected keyboards are automatically detected
  • If multiple keyboards are connected, select one from the list
  • On Linux, udev rules may need to be configured if no devices are found

File Tab

File Tab

The File tab allows offline editing of .pipette files without a physical keyboard connected:

  • Browse previously saved keyboards and select an entry to load
  • Load an external .pipette file from disk
  • A virtual keyboard is created from the embedded definition in the file
  • An unsaved changes indicator is shown when edits have not been saved

Use case: You want to tweak your keyboard's keymap, but the keyboard isn't with you right now. If you've previously saved its data, you can load it from the File tab, make your edits offline, and later connect the keyboard and load the modified data to apply your changes.

Feature Availability: Device vs File Mode

FeatureDevice (USB)File (.pipette)
Keymap editingYesYes
Macro / Tap Dance editingYesYes
Combo / Key Override / Alt Repeat KeyYesYes
QMK SettingsYes (device)Yes (local data)
Typing TestYesYes
Export (.vil / .c / .pdf)YesYes
Lighting controlYesNo
Matrix TesterYesNo
Lock / UnlockYesNo
Snapshot save / loadYesNo
Hub uploadYesNo
JSON sideloadYesNo
Device probe (Keyboard tab)YesNo
Cloud SyncYesNo

1.2 Connecting a Keyboard

Click a keyboard name in the list to open the keymap editor. A connecting overlay shows loading progress while the keyboard data is read.

If Cloud Sync is configured, sync progress is also displayed during connection (favorites first, then keyboard-specific data).

1.3 Data

The Data button on the device selection screen opens the Data panel for centralized management of keyboards, favorites, sync data, and Hub posts.

Data — Favorites

The left sidebar provides a tree navigation with the following structure:

  • Local
    • Keyboards: Browse saved keyboard snapshots. Click a keyboard to view, load, export, or delete entries
    • Favorites: Tap Dance, Macro, Combo, Key Override, Alt Repeat Key — each type shows its saved entries with rename, delete, export, and Hub actions
    • Application: Import/export local data or reset selected targets (keyboard data, favorites, app settings)
  • Sync (when Cloud Sync is configured): Lists keyboards that exist only in Google Drive (not yet downloaded on this device). Each entry is labeled with the keyboard's real name, resolved from the synced name index rather than from the raw UID. Click a remote-only keyboard to download it on demand — a spinner is shown while fetching, and a failure message appears inline if the download cannot complete. Once downloaded, the keyboard moves into the Local › Keyboards branch. To clean up orphaned encrypted files that can no longer be decrypted, use Undecryptable Files in the Settings Data tab instead (see §6.1)
  • Hub (when Hub is connected): Manage Hub posts grouped by keyboard name
Data — Keyboard Saves
Data — Application

Per-entry actions in the favorites list:

  • Click to rename, delete, or Export individual entries
  • Hub actions: When Hub is connected, each entry shows Upload to Hub / Update on Hub / Remove from Hub buttons
  • Import / Export All buttons at the footer for bulk operations

A breadcrumb navigation at the top of the content area shows the current path (e.g., "Local › Favorites › Tap Dance")

1.4 Analyze

The Analyze page shows how you actually type — per-key heatmaps, WPM trends, inter-keystroke intervals, hour-by-day activity, per-finger load, key-pair (bigram) timing, and per-layer usage. Data is recorded while you are in Typing View (the compact window opened from the status bar) and the Record toggle in the typing-test pane is set to Start. Typing-test results are recorded in the same stream.

Access

There are two entry points:

  • Analyze tab on the device selection screen — open the page without connecting a keyboard. Useful for reviewing data from keyboards that are currently unplugged
  • View Analytics button in the Typing Test pane — jumps to Analyze for the keyboard you are currently using, then returns to the typing view when you go back

Keyboard selector

The Keyboards select at the top of the filter row lists every keyboard that has recorded typing data — pick one to populate the charts. Keyboards with no data never appear in the list. The Back button at the bottom of the page returns to the previous view (e.g. the device selector).

Analysis tabs

The tab bar above the chart groups ten analyses by intent — overview, performance, behavior, load, and optimization:

GroupTabWhat it shows
OverviewSummaryToday / last-7-days deltas, typing profile cards (Speed / Hand balance / SFB / Fatigue), goal streak record
PerformanceWPMWords-per-minute over time, or by hour of day
PerformanceIntervalKeystroke interval percentiles (min / p25 / median / p75 / max), as a time series or a distribution
BehaviorActivityHour × day-of-week grid or sliding-month calendar, colored by keystrokes / WPM / sessions
BehaviorBy AppActive-application breakdown — App Usage Distribution donut and WPM by App horizontal bars. Requires Monitor App data
LoadHeatmapPress count per physical key, overlaid on the keymap (per layer). Requires a keymap snapshot in range
LoadErgonomicsPer-finger keystroke totals, with a manual finger-assignment editor and a Learning curve view. Requires a snapshot
LoadBigramsTop key-pair counts, pair-interval ranking, and per-finger IKI bar chart
LoadLayerPer-layer keystroke counts or layer-op activations
OptimizationLayout ComparisonSimulate how your recorded typing would land on alternative layouts (Colemak / Dvorak / etc.). Requires a snapshot

The Heatmap, Ergonomics, Bigrams > Finger IKI, Layout Comparison, and Layer > Activations views need a keymap snapshot that overlaps the selected range. Pipette saves a snapshot automatically when typing recording is enabled on the keyboard; the empty state tells you when to start a recording session to capture one.

Common filters

The following filters are always available:

  • Keymap snapshots — picks which recorded keymap to analyze against. Editing From / To stays inside the selected snapshot's active window so charts that need a snapshot (Heatmap / Ergonomics / Bigrams Finger IKI / Layer activations) never mix two layouts in one view. Snapshots are listed on the Keymap snapshot timeline so you can flip between recorded keymap revisions and "Current keymap" without leaving the page
  • From / To — the time range to analyze. Both inputs are clamped to the active snapshot's window (or to the most recent 7 days when the keyboard has no snapshot recorded yet)
  • Device — multi-select. Pick any combination of This device and remote-machine hashes to merge or isolate per-machine data. Hidden on the Interval tab when View is set to Distribution (distribution bins don't split by device)
  • App — multi-select dropdown listing every active application name observed during the range. Defaults to All apps (no filter); selecting one or more apps narrows every chart except By App to minutes tagged with one of the chosen apps. The dropdown only populates after Monitor App has been enabled and at least one minute has been tagged with an app name. Persisted per keyboard

Individual tabs add their own filters above the chart (view mode, granularity, unit, etc.); those are described per tab in the sections below. The Heatmap tab keeps its Normalize / Aggregate / Group / Top N controls with the ranking row underneath the keyboard itself.

Saved search conditions

The bookmark icon in the panel header opens the Saved search conditions side panel. Save the active filters under a label, restore a saved set later, rename / delete entries, or export the current condition's chart data as CSV. Each saved entry shows a one-line summary of the filters (devices, apps, snapshot, range) under its label.

  • Up to 50 entries per keyboard — the panel surfaces a cap warning when you reach the limit; delete an existing entry to make room
  • Synced via Cloud Sync (when enabled) so the same set is available on other signed-in machines
  • Loading an entry written by a newer Pipette release shows an unsupported-version error rather than guessing at unknown fields
  • Overwrite: typing a label that already exists swaps the Save button to a danger-styled Overwrite? + Cancel pair. Editing the label clears the pending confirmation so you cannot overwrite a different entry by accident
  • Load behavior: loading a saved entry always opens on the Summary tab regardless of which tab was active when the condition was saved
  • Hub actions: when Pipette Hub is connected, each saved entry shows an additional Hub row with Upload to Hub / Update on Hub / Remove from Hub + Open in Browser — the same pattern as the keymap and favorites save panels (see §7.4)

Summary

The Summary tab is the default landing view. It collects four read-only cards built from the same minute-bucket aggregates as the rest of the page, so you can scan the latest highs / averages / streaks before drilling into a specific tab.

Analyze — Summary
  • Today — Keystrokes, WPM, Typing duration for the current local day
  • Last 7 days — Keystrokes, WPM, Typing duration, Active days, each with a delta arrow comparing the prior 7 days. Insufficient prior data renders as
  • Typing profile (last N days) — Four qualitative read-outs computed over the recent window:
    • Speed — overall WPM bucketed into Slow (<30) / Medium (30–50) / Fast (≥50)
    • Hand balance — share of bigram keystrokes per hand. Within ±5% of 50/50 reads as Balanced
    • SFB rate — share of bigrams typed with the same finger. <4% Low / 4–8% Medium / ≥8% High
    • Fatigue risk — drop from peak hour to slowest hour WPM. Wider gap = higher risk
  • Goal streak record — Current cycle progress (current / goalDays), longest historical streak, and editable Goal settings (consecutive days × keystrokes/day). Changing the goal clears the current cycle counter. The Achievement history button opens a modal that lists every completed cycle with period, goal, days, total keystrokes, and average per day

The Summary tab respects the App filter — selecting one or more apps narrows every card to minutes tagged with those apps.

Heatmap

The Heatmap tab counts every press per physical key and paints the result on the keymap layout, one layer at a time. It's useful for spotting over- or under-used keys per layer and for tuning the layout.

Keymap panel

Keys are tinted by press count (dim = low, saturated accent = high). When a keyboard has more than one layer, a layer toggle bar appears above the panel (Layer 0, Layer 1, …) and each button shows the per-layer count. Hovering a key opens a tooltip inside the chart with the bound keycode and the count; the tooltip never spills outside the heatmap frame.

Ranking controls

Below the heatmap is a ranking table. Four filters control what it shows:

  • NormalizeAbsolute (raw count), Per hour (count ÷ active hours), Share of total (% of total presses in range)
  • AggregateBy cell collapses every press of the same physical cell; By character collapses every press of the same keycode regardless of where on the keymap it sits
  • GroupAll, Character, Modifier, Layer op
  • Top N — 10 / 20 / 30 / … / 100

Columns are Key, Layer (only when the group spans multiple layers), Matrix, Count.

Analyze — Heatmap

Empty states

  • No snapshot — "No keymap snapshot recorded for this range. Start a record session to capture one."
  • No layout — "Layout data not available for this snapshot." The snapshot exists but lacks KLE geometry
  • No activity — "No key presses in this range." Ranking table only

WPM

The WPM tab charts Words Per Minute — keystrokes per minute divided by 5 — either as a time series or binned by hour of day.

View Mode

  • Time series — WPM over the selected range as a line chart. A red dashed Bksp % line is always overlaid on a secondary right-hand axis (0–100 %) so speed and error rate sit together; click the Bksp legend entry to hide it if you only want the WPM line
Analyze — WPM Time Series
  • Time of day — Bar chart of the 24 hours in the local day. Each bar is the average WPM for that hour across the range. Bars that did not meet Min sample render in a muted tone
Analyze — WPM Time of Day

Min sample (both views)

30s, 1 min, 2 min, 5 min. Minutes with fewer keystrokes than the chosen WPM-worth-of-keys threshold are dropped from the chart so very light sessions don't skew the line.

Granularity (Time series only)

Bucket width of the time series (Auto, 1 min, 5 min, … 1 week, 1 month).

Summary cards

  • Time series — Total keystrokes, Active typing time, Overall WPM, Peak WPM, Lowest WPM, Weighted median WPM, Peak K/min, Peak K/day, Total Bksp, Overall Bksp %
  • Time of day — Total keystrokes, Active typing time, Overall WPM, Peak hour, Slowest hour, Active hours (N / 24)

Interval

The Interval tab visualizes the time between consecutive keystrokes, either as percentile lines over time or as a distribution histogram.

View Mode

  • Time series — Five percentile lines on a log-scale Y axis: Min, p25, Median, p75, Max. The Median line is drawn thickest. Click a legend entry to hide a line. The Y-axis label reads sec (log) or ms (log) depending on Display
Analyze — Interval Time Series
  • Distribution — Bar chart of nine fixed bins (<50ms, 50-100ms, 100-200ms, 200-500ms, 500ms-1s, 1-2s, 2-5s, 5-10s, >10s). Bars are colored by band: Fast (green, <200ms), Normal (blue, 200–500ms), Slow (orange, 500ms–2s), Pause (red, ≥2s). The Device filter is hidden in Distribution mode because bins are always computed from this device alone
Analyze — Interval Distribution

Display (both views)

Seconds / Milliseconds. Switches the unit used in tooltips and on the Y axis. The distribution bin labels stay in their native unit.

Granularity (Time series only)

Same options as WPM.

Summary cards

  • Time series — Total keystrokes, Active typing time, Weighted median interval, Shortest interval (per min), Longest interval (per min)
  • Distribution — Total keystrokes, Median interval, Fast (<200ms) share, Normal (200–500ms) share, Slow (500ms–2s) share, Pause (≥2s) share, Longest interval (per min), Longest session

Activity

The Activity tab groups typing by day-of-week × hour so you can see when you actually type. The filter row offers two orthogonal pickers: View (chart geometry) and Metric (what each cell measures).

View

  • Hour — the historical 24 × 7 hour-of-day × day-of-week grid (or sessions histogram when Metric = Sessions). Driven by the top-level Period picker
  • Day — sliding-window day calendar. Adds a Range selector (1 / 3 / 6 / 12 months) plus prev / next month cursor buttons so you can browse the month-by-month heatmap. For 3 / 6 / 12-month ranges the current month stops at today so future days stay blank; the 1-month range shows the full calendar month including future empty days

Metric

  • Keystrokes — keystroke count. Empty cells are dim, the busiest cell is fully saturated. In Grid view a non-empty cell tooltip shows both the raw count and its share of the range total (e.g. Mon 09:00 — 1,234 keys (5.2% of total))
Analyze — Activity Keystrokes
  • WPM — average WPM per cell. In Grid view, cells that don't meet Min sample are desaturated instead of pinning the color scale
  • Sessions — In Grid view this swaps to a histogram of session lengths in seven bins (<5 min, 5-15 min, 15-30 min, 30-60 min, 1-2 h, 2-4 h, >4 h); in Calendar view each cell counts the sessions whose start fell on that date (not sessions active on that date)

Day-only controls (View = Day)

  • NormalizeAbsolute colors by the peak day in the rendered window, Share of week divides each cell by the column's weekly total, Share of total divides by the grand total of the rendered range
  • Range1 month, 3 months, 6 months, 12 months. Sets the visible window relative to the cursor month
  • Prev / Next month buttons — slide the visible window one month earlier or later. The current month is the right-most column; future days stay blank (except in the 1-month view which shows the full month)
Analyze — Activity Calendar

A gradient legend bar below the calendar shows the color scale from low to peak value, so the intensity mapping is always visible at a glance.

Clicking a populated cell jumps the rest of the Analyze pane to that single day. The snapshot picker auto-selects the snapshot that contains the date so dependent tabs (Heatmap, Ergonomics, Layer activations) stay aligned with the keymap that was active.

Min sample (View = Grid, Metric = WPM)

Same options as the WPM tab.

Peak records

Four stat cards above the grid summarize the peaks across the selected range: Peak WPM, Peak K/min, Peak K/day, Longest session (min). They stay visible for every metric so you always see the overall highs at a glance.

Summary cards

Under the grid, the summary depends on the metric:

  • Keystrokes — Total keystrokes, Active typing time, Busiest day, Busiest hour, Peak cell, Active cells (N / 168). The count context under each card also carries its share of the range total (e.g. 800 keys (40.0%))
  • WPM — Total keystrokes, Active typing time, Overall WPM, Peak cell, Slowest cell, Active cells (N / 168)
  • Sessions — Session count, Total duration, Mean duration, Median duration, Longest session, Shortest session

Ergonomics

The Ergonomics tab reports the physical load of your typing — per finger, per hand, per row — based on the key → finger assignment in the snapshot keymap.

Like Heatmap, this view needs a keymap snapshot that overlaps the range.

Sections

Three bar charts stack vertically:

  1. Finger Load — 10 vertical bars, one per finger from left pinky to right pinky
  2. Hand Balance — 2 horizontal bars (Left / Right)
  3. Row Usage — 6 horizontal bars (Function / Number / Top / Home / Bottom / Thumb)
Analyze — Ergonomics

Finger assignment

Each key is auto-assigned to a finger based on the layout's KLE metadata (column position and the standard column-to-finger mapping). Click the Finger assignment button at the top of the tab to override any key manually:

Analyze — Finger Assignment
  • Each key shows a short finger code (Lp, Lr, Lm, Li, Lt / Rt, Ri, Rm, Rr, Rp). Manually overridden keys are prefixed with *
  • Click a key → popover to pick a finger
  • Save persists the overrides; Reset all clears every override (disabled when there are none). Reset to estimate in the per-key popover clears just that key
  • Overrides apply immediately once you close the modal — Finger Load, Hand Balance, and Row Usage all recompute

Learning curve

Set the View filter to Learning curve to swap the four-pane snapshot for a weekly / monthly trend chart. The view buckets per-day matrix counts into the chosen Period (week / month) and folds each bucket into three sub-scores plus a composite score:

  • Finger load — how evenly the 10 fingers share the load (1 = perfectly even, 0 = one-finger lock-in)
  • Hand balance — how close the left / right split is to 50 / 50
  • Home row stay — fraction of keystrokes on the home row

The bold line is the composite Overall score (weighted mean of the three sub-scores); the dashed lines are the individual sub-scores. The summary cards at the top show the latest bucket's overall score, the delta against the prior buckets, and the qualified bucket count (a bucket is qualified once its keystroke total clears the min-sample threshold; below-threshold buckets stay visible but are flagged in the tooltip).

Analyze — Ergonomic Learning Curve

The composite score is a relative trend indicator, not a calibrated absolute metric. The weights are heuristic and finger-stddev is sensitive to layout choices. Read the curve as "is my distribution improving over time?" rather than as a numeric grade.

Empty states

  • No snapshot — same message as Heatmap
  • No layout — "Layout data not available for this snapshot."
  • No activity — "No keystrokes recorded in this range."
  • No data (Learning curve only) — "Not enough matrix activity in this range. Type more or widen the period filter."

Bigrams

The Bigrams tab analyzes consecutive key-press pairs (bigrams) and the inter-key interval (IKI) between them. Bigrams are aggregated per minute as the typing happens, so the tab works over any selected range without re-scanning raw events.

Quadrant layout

The view is a 3-quadrant grid; each quadrant has its own list-size selector (10 / 20 / 30 / … / 100). Bars are rendered with recharts so tooltips track the cursor.

QuadrantWhat it shows
Top pairsPair ranking by total occurrence count. Click the Count or Avg IKI column to flip the sort
Pair intervalPair ranking by average IKI (slowest first). Click any of Count, Avg IKI, or p95 to re-sort. The Avg interval threshold (see Common filters) hides faster-than-threshold pairs
Finger IKIPer-(from-finger → to-finger) average IKI bar chart. Bars are coloured blue for left-hand starts and red for right-hand starts. Same Avg interval threshold applies
Analyze — Bigrams

Snapshot requirement

Only the Finger IKI quadrant needs a keymap snapshot — it has to map each numeric keycode in the bigram pairs to a finger, which depends on the snapshot's keymap and layout. The Top pairs and Pair interval quadrants both render directly from the recorded pair counts and work without a snapshot.

Common filters

  • Range — same From / To pickers as the rest of Analyze. The view re-aggregates over the chosen window
  • DeviceThis device only or all synced devices, identical to the other tabs
  • Avg interval (ms or slower) — minimum-IKI threshold rendered inline in both the Finger IKI and Slow pairs quadrant headers. Pairs whose average IKI is below the threshold are hidden in both quadrants at once (the input is shared, so editing it in one quadrant updates the other). 0 disables the filter; the value is persisted per keyboard via PipetteSettings. The IKI used for comparison is approximate (histogram bucket-center weighted average), so the cut-off is best treated as a coarse "ignore pairs faster than ~N ms" filter

Empty states

  • No bigram data — "No bigram data in this range yet. Record some typing and try again." Shown when the range has no recorded pair activity
  • No snapshot (Finger IKI quadrant only) — "Finger heatmap needs a keymap snapshot. Start a record session or pick a range with one." The other three quadrants still render
  • Threshold filtered everything out — when Avg interval is set high enough that no pair survives, the Finger IKI and Pair interval quadrants both fall back to "No bigram data in this range yet." Lower the threshold to bring rows back

By App

The By App tab breaks the recorded data down by the active application name captured during typing. It only populates after Monitor App has been enabled in the Typing View and at least one minute has been tagged with an app name. This tab intentionally ignores the App filter — applying it would collapse the chart to a single slice / bar.

Analyze — By App

App Usage Distribution (donut)

Per-app share of total keystrokes for the selected range. Minutes tagged with multiple apps fold into an Unknown / Mixed slice; minutes that pre-date Monitor App or were captured while it was disabled go to Other. Hover for the tooltip with the per-slice keystrokes count and share percentage.

WPM by App (horizontal bars)

Per-app median WPM as a horizontal bar chart, ranked by share of activity. Bars below the configured min-sample threshold render in a muted tone. Hover for the per-bar WPM and keystroke count.

Empty state

  • "No app data — turn on Monitor App and start REC to populate this chart." Shown when no app-tagged minutes exist in the range

Layout Comparison

The Layout Comparison simulates how your recorded typing would land on a different keyboard layout — Colemak, Dvorak, Colemak DH, and 30+ others — without touching your firmware. Pick a candidate from the dropdown and the tab folds your matrix activity through that layout's character map to show how your finger / hand / row workload would shift.

Pickers

  • Current layout — what character convention to interpret your recorded events with. Defaults to QWERTY; change it if your firmware fires keycodes for a different layout natively
  • Compare to — the candidate layout to simulate against. Picks are persisted per keyboard so the comparison reopens to the same target after a reload

Panels

Once a target is picked, all three panels render at once so you can read the spatial, per-finger, and tabular views together without flipping a sub-view:

PanelWhat it shows
Heatmap diff (top, full width)Per-physical-key delta painted over the keyboard. Red shades where the candidate sends more activity to that key, blue shades where it sends less
Finger diff (bottom-left)Per-finger signed delta bar chart. Red bars mark fingers that take more load on the candidate, green bars mark fingers that take less
Metric table (bottom-right)Side-by-side share-of-events table with finger load (per finger), hand balance (left / right), row distribution, and home-row stay rate
Analyze — Layout Comparison Heatmap Diff
Analyze — Layout Comparison Finger Diff
Analyze — Layout Comparison Metric

Skip-rate warning

Some events can't be mapped onto a candidate — for example, when the source character has no equivalent on the target layout, or the firmware hasn't bound the candidate's keycode anywhere. When that share rises above 5% the view shows a warning so you know the metrics are approximate.

Empty states

  • No snapshot — same empty state as the rest of the snapshot-bound tabs. Start a record session in the chosen range to capture one
  • No target picked — the empty hint stays until you pick a comparison layout from the dropdown
  • Fetch error — generic "failed to compute the layout comparison" message; reload or pick a smaller range and retry

The Layer tab breaks usage down by keyboard layer.

View Mode

  • Keystrokes — sums every press at the layer that was active at the time. Reflects MO, LT, TG, and any other layer op live, because the active layer is recorded when the press happens. Works with or without a keymap snapshot
Analyze — Layer Keystrokes
  • Activations — counts how many times each layer was reached through a layer-op keycode. Requires a keymap snapshot so the layer-op target can be resolved:
    • MO / TG / TO / DF / PDF / OSL / TT — counted on press
    • LT / LM — counted only on hold (so a tapped LT0(KC_ESC) doesn't look like a layer transition)
Analyze — Layer Activations

Base Layer

Appears only in Activations mode on keyboards with two or more layers. Selects the layer you are analyzing from — that layer is dropped from the bar list so a "hold the same layer you're already on" press (e.g., LT0(KC_ESC) while base = 0) doesn't show up as a transition.

Layer names

If you have named layers in the layer panel (see §2.3), the name is appended to the axis label (e.g., Layer 0 · Base) so you can tell layers apart without counting.

Empty states

  • Keystrokes, no activity — nothing pressed in range
  • Activations, no activity — no layer-op keys pressed in range
  • Activations, no snapshot — "Layer activations need a keymap snapshot. Start a record session in this range to capture one." Keystrokes mode keeps working without a snapshot

Export / Upload

The Export button on the panel header opens a category-pick modal that writes the chart data for the active filters as a .csv file. Ten categories can be ticked independently:

  • Summary — today / last-7-days overview cards
  • WPM — per-bucket WPM time series
  • Interval — per-bucket interval percentiles
  • Activity — hour × day-of-week or day-cell counts depending on the View setting
  • By App — per-application breakdown
  • Heatmap — per-cell press counts (snapshot-bound)
  • Ergonomics — per-finger / per-hand / per-row totals (snapshot-bound)
  • Bigrams — Top pairs / Pair interval / Finger IKI rows
  • Layer — per-layer keystroke or activation counts
  • Layout Comparison — per-finger / row / hand deltas (snapshot-bound)

The modal lists the active conditions (Device, App, Keymap, Period) above the category list so the file you save is unambiguous about which slice it captures. Heatmap, Ergonomics, and Layout Comparison entries are unavailable when the range has no overlapping snapshot — the modal shows a "snapshot missing" notice for those categories. Manual finger overrides are noted next to the Ergonomics row.

Upload mode

The same modal opens in upload mode when triggered from a saved entry's Hub action row (Upload to Hub / Update on Hub). In this mode the confirm button reads Upload or Update and the data is sent to Pipette Hub instead of written to a CSV file. Upload mode adds two additional selectors:

  • Layout Comparison targets — a multi-select popover listing all installed key-label sets and built-in layouts. Pick one or more target layouts to include in the Hub post; the Layout Comparison toggle is disabled when no targets are selected
  • Per-app data — a multi-select popover listing every app observed in the range. Select which apps to include as per-app breakdowns on Hub

See §7.4 for the full analytics upload flow and validation rules.


2. Keymap Editor

2.1 Screen Layout

The keymap editor consists of two main areas: the keyboard layout display and the keycode palette.

Keymap Editor Overview
  • Top area: Physical keyboard layout (shows the current keycode assigned to each key)
  • Left side: Toolbar (zoom, undo/redo, etc.)
  • Bottom area: Keycode palette (tabbed interface) with overlay panel toggle
  • Right side (when open): Keycodes Overlay Panel (tools, save, layout options)
  • Bottom bar: Status bar

2.2 Changing Keys

  1. Click a key on the keyboard layout to select it
  2. Click a keycode from the keycode palette to assign it
  3. The key display updates immediately
  4. Changes are automatically sent to the keyboard
  • Ctrl+click to select multiple keys
  • Shift+click for range selection
  • Press Escape to deselect all keys

Instant Key Selection controls how keycode assignment behaves:

  • ON (default): A single click on a keycode immediately assigns it and closes the selection. Fast workflow for quick edits.
  • OFF: A single click selects a keycode (highlighted), double-click or press Enter to confirm and assign. A hint is shown at the bottom of the palette. Useful when you want to browse keycodes before committing.

This setting can be toggled per-keyboard in the Keycodes Overlay Panel (§3.14), and the global default can be set in Settings → Defaults (§6.1).

2.3 Layer Switching

Layer switching buttons are located on the left side of the keyboard layout.

Layer 0
Layer 1
Layer 2
  • Click layer number buttons to switch between layers
  • Layer 0 is the default layer
  • The number of available layers depends on the keyboard configuration

The layer panel can be collapsed to save space:

Layer Panel Collapsed

Click the collapse button (chevron) to minimize the layer panel to just numbers. Click the expand button to restore full layer names.

Layer Panel Expanded

2.4 Key Popover

Double-click a key on the keyboard layout to open the Key Popover — a quick way to search and assign keycodes without scrolling through the palette.

Layer Sidebar

Key Popover — Layer Sidebar

A vertical layer sidebar appears on the left side of the popover, matching the layer panel buttons. Click a layer number to switch layers without closing the popover. If the number of layers exceeds the popover height, the sidebar scrolls independently.

Key Tab

Key Popover — Key Tab
  • The search input is pre-filled with the current keycode name
  • Type to search by name, keycode name, or alias — results are ranked by relevance
  • Click a result to assign it immediately
  • The popover also appears when double-clicking key fields in detail editors (Tap Dance, Combo, Key Override, etc.)

Code Tab

Key Popover — Code Tab
  • Enter a keycode value directly in hexadecimal (e.g., 0x0029 for Escape)
  • The resolved keycode name is displayed below the hex input
  • Click Apply to assign the entered keycode

Wrapper Modes

The mode buttons at the top of the popover let you build composite keycodes:

Key Popover — Modifier Mode
  • Mod Mask: Combine a modifier with a key (e.g., LSFT(KC_ESCAPE))
  • Mod-Tap: Modifier on hold, key on tap (e.g., LSFT_T(KC_ESCAPE))

Both modes show the modifier checkbox strip to select Left/Right Ctrl, Shift, Alt, or GUI. Left and Right modifiers cannot be mixed — selecting one side disables the other.

Key Popover — LT Mode
  • LT: Layer-Tap — activate a layer on hold, send a key on tap (e.g., LT0(KC_ESCAPE)). A layer selector appears to choose the target layer.
  • SH_T: Swap Hands Tap — swap hands on hold, send a key on tap (e.g., SH_T(KC_ESCAPE))
  • LM: Layer-Mod — activate a layer with modifiers (e.g., LM(0, MOD_LSFT)). Shows both the layer selector and the modifier checkbox strip.

Click an active mode button to toggle it off and revert to a basic keycode.

Undo / Redo: The popover footer shows context-sensitive Undo and Redo buttons. Undo displays the previous keycode and reverts to it; Redo displays the next keycode and re-applies it. These buttons only appear when the most recent undo/redo history entry matches the key currently open in the popover (i.e., the last single change). For multi-step history navigation, use the toolbar buttons or keyboard shortcuts (see §4.2).

Key Popover — Undo Key Popover — Redo

Confirmation: Press Enter to confirm the current selection and close the popover. Press Escape or click outside the popover to close it without changes.

2.5 Layout Options

Some keyboards support multiple physical layouts (e.g., split backspace, ISO enter, different bottom row configurations). When a keyboard has layout options, a Layout Options button (grid icon) appears at the right end of the keycode palette tab bar.

Layout Options Panel
  • Click the grid icon to open the Layout Options panel
  • Checkbox options: Toggle a layout variant on or off (e.g., "Macro Pad", "Split Backspace", "ISO Enter")
  • Dropdown options: Select from multiple layout variants (e.g., "Bottom Section" with Full Grid / Macro Pad / Arrow Keys choices)
  • Changes are applied immediately — the keyboard layout display updates in real time to reflect the selected options
Layout Options Changed
  • Selecting a different option updates the visible keys on the keyboard layout
  • Layout options are saved to the keyboard and persist across sessions
  • Click outside the panel or press Escape to close it

Note: The Layout Options button only appears for keyboards that define multiple layout variants. Most keyboards with a single fixed layout do not show this button. Screenshots in this section were taken using a dummy JSON definition loaded via "Load from JSON file".


3. Keycode Palette

Select keycodes from different categories using the tabbed palette at the bottom of the screen.

3.1 Basic

Standard character keys, function keys, modifier keys, and navigation keys. The Basic tab supports four view types, selectable from the view selector at the bottom of the Basic tab:

ANSI Keyboard View (default)

Basic Tab — ANSI View

Displays keycodes as an ANSI keyboard layout. Click a key on the visual keyboard to assign it.

ISO Keyboard View

Basic Tab — ISO View

Displays keycodes as an ISO keyboard layout with the ISO-specific keys.

JIS Keyboard View

Basic Tab — JIS View

Displays keycodes as a JIS keyboard layout with JIS-specific keys (Yen, Ro, Henkan, Muhenkan, Katakana/Hiragana).

List View

Basic Tab — List View

Displays keycodes in the traditional scrollable list format.

All views include:

  • Character keys (A-Z, 0-9, symbols)
  • Function keys (F1-F24)
  • Editing keys (Enter, Tab, Backspace, Delete)
  • Navigation keys (arrows, Home, End, PageUp/Down)
  • Numpad keys
  • International keys (KC_INT1–KC_INT5)
  • Language keys (KC_LANG1–KC_LANG5)

3.2 Layers

Keycodes for layer operations.

Layers Tab
  • MO(n): Momentarily activate layer n while held
  • DF(n): Set default layer to n
  • TG(n): Toggle layer n
  • LT(n, kc): Layer on hold, keycode on tap
  • OSL(n): Activate layer n for the next keypress only
  • TO(n): Switch to layer n

3.3 Modifiers

Keycodes for modifier key combinations and tap behavior settings.

Modifiers Tab
  • One-Shot Modifier (OSM): Activate modifier for the next keypress only
  • Mod-Tap: Modifier on hold, regular key on tap
  • Mod Mask: Modifier key combinations

3.4 System

Keycodes for mouse control, media playback, system utilities, and audio/haptic feedback.

System Tab
  • Mouse: buttons, movement, and scrolling
  • Joystick: axis and button keycodes
  • Audio: audio toggle and control keycodes
  • Haptic: haptic feedback toggle and control keycodes
  • Media Playback: play/stop/volume/track controls
  • Locking Keys: Locking Caps Lock, Num Lock, Scroll Lock
  • App / Browser: application launcher and browser navigation keys
  • System Control: system power, sleep, wake
  • Boot: enter bootloader mode (QK_BOOT)

Note: The MIDI tab is only displayed for MIDI-capable keyboards. When available, it appears between System and Lighting.

3.5 Lighting

Keycodes for backlight and RGB lighting controls.

Lighting Tab
  • RGB Matrix controls
  • RGB Lighting controls
  • Backlight controls
  • LED Matrix controls

3.6 Tap-Hold / Tap Dance

Keycodes that assign different actions to tap and hold.

Tap-Hold / Tap Dance Tab

The Tap Dance section displays a tile grid preview showing all entries at a glance:

Tap Dance Tile Grid
  • Each tile shows the entry number and a summary of configured actions
  • Configured entries display their tap/hold actions; unconfigured tiles show the number only
  • Click a tile to open the Tap Dance edit modal directly to that entry
  • Configure tap, hold, double-tap, and other actions for each entry
  • Edit JSON button at the bottom opens a JSON editor for bulk editing all entries (see §5.6)

3.7 Macro

Macro keycodes.

Macro Tab

The Macro section displays a tile grid preview showing all entries at a glance:

Macro Tile Grid
  • Each tile shows the macro number and a preview of the recorded sequence
  • Configured entries display a summary of key actions; unconfigured tiles show the number only
  • Click a tile to open the Macro edit modal directly to that entry
  • Record sequences of key inputs as macros
  • Edit JSON button at the bottom opens a JSON editor for bulk editing all entries (see §5.6)

Macro Edit Modal — List Mode and Edit Mode

Opening a macro action brings up the Macro Modal with two display modes that share the same row:

  • List mode (default): The action's keycodes are shown as clickable tiles followed by a dashed add slot. Single-click a keycode tile to switch that index into edit mode. Single-click the dashed add slot to select it; double-click the dashed slot to open the keycode popover with an empty query (mirrors the keymap editor). The pencil "edit" icon from earlier versions is gone — clicking is the only affordance
  • Edit mode: The keycode picker stays visible below the row. Each keycode tile shows a hover X button to delete that index, and the Tap row exposes a Close button to leave edit mode. Picker and popover selections are staged — they update the row visually but are not committed until you press the bottom Save button or Enter. The footer also shows a Revert ConfirmButton when you are editing an action that already existed (it is hidden when you just added the action via Add Action, since there is nothing prior to revert to). Save and Revert are disabled until a pick actually changes something. Pressing Escape, the per-row Close button, Revert, or clicking outside the picker / action list / footer / key popover rolls back the entire in-flight edit — including newly-appended Add-keycode slots or an entirely newly-added action — and leaves edit mode. Deleting a slot during edit shifts the selection so the session continues rather than exiting.

Empty keycode actions are tolerated while editing; they are normalized out silently when the macro is saved or exported to a favorite.

Recording Lock

While the built-in recorder is capturing keystrokes, the Macro Modal enters a strict disabled state to prevent accidental edits:

  • The Add Action select, Text Editor toggle, Clear, Revert, and bottom Save buttons are all disabled
  • Every existing MacroActionItem and its KeycodeField is disabled (native disabled attribute — Tab / hover / click are all suppressed)
  • The inline favorites panel is made invisible with its width preserved, so the layout does not jump
  • The modal's top-right Close button and backdrop click are inert — the modal cannot be dismissed until recording stops
  • The list-mode footer's Clear / Revert / Save buttons remain visible but disabled during recording. In per-action edit mode the list-level Clear / Revert are hidden, but the edit-mode Save (and Revert, for existing edits) are kept visible and disabled so you can see the affordance

3.8 Combo

Combo keycodes for simultaneous key-press combinations.

Combo Tab

The Combo tab displays a tile grid preview showing all entries. A note reads: "These features apply to the entire keyboard, not just the current layer."

  • Each tile shows the combo number and a summary (e.g., "A + B → C")
  • Click a tile to open the Combo edit modal directly to that entry (§5.2)
  • Combo keycodes (CMB_000–CMB_031) can be assigned to keys for triggering combos
  • Settings: Configuration button at the bottom opens a settings modal for combo-related timeout configuration (e.g., Combo time out period)
  • Edit JSON button at the bottom opens a JSON editor for bulk editing all entries (see §5.6)

3.9 Key Override

Key Override keycodes for replacing key outputs when specific modifiers are held.

Key Override Tab

The Key Override tab displays a tile grid preview showing all entries and a settings area.

  • Each tile shows the override number and a summary
  • Click a tile to open the Key Override edit modal directly to that entry (§5.3)
  • Edit JSON button at the bottom opens a JSON editor for bulk editing all entries (see §5.6)

3.10 Alt Repeat Key

Alt Repeat Key keycodes for context-aware alternate repeat key bindings.

Alt Repeat Key Tab

The Alt Repeat Key tab displays a tile grid preview showing all entries and a settings area.

  • Each tile shows the entry number and a summary
  • Click a tile to open the Alt Repeat Key edit modal directly to that entry (§5.4)
  • Edit JSON button at the bottom opens a JSON editor for bulk editing all entries (see §5.6)

3.11 Behavior

Keycodes for advanced QMK behavior features.

  • Magic: Magic keycodes for swapping and toggling keyboard behaviors
  • Mode: NKRO toggle, mode switching keycodes
  • Auto Shift: Auto Shift toggle and configuration keycodes
  • Swap Hands: Swap Hands keycodes and Swap Hands Tap variants
  • Caps Word: Caps Word toggle

3.12 User

User-defined keycodes.

User Tab
  • Custom keycodes defined in firmware (e.g., CUSTOM_1, CUSTOM_2)
  • When exporting keymap.c, custom keycodes use their configured names instead of generic USER00/USER01 identifiers, and an enum custom_keycodes block is generated automatically

3.13 Keyboard (Device Picker)

The Keyboard tab lets you copy keycodes from other connected keyboards or from saved files.

Use case: While editing a keyboard, you wonder how another keyboard's keymap is set up — but that keyboard isn't connected right now. If you've previously saved its data (via the Save panel), you can load it from the File source in this tab to browse its keymap and copy keycodes directly into your current layout.

Device List

Keyboard Tab — Device List

When you open the Keyboard tab, a list of all connected Vial-compatible keyboards is displayed. This list updates in real time as you plug in or unplug devices.

  • Click a device to load its keymap — the currently connected keyboard shows its live keymap instantly; other devices are probed via a temporary USB connection
Keyboard Tab — Keymap View
  • Once loaded, click any key on the displayed keyboard to assign that keycode to the selected key on the main keymap
  • Use Ctrl+click for multi-select, Shift+click for range select
  • Layer buttons at the bottom right let you browse different layers
  • Zoom controls (+ / numeric input / −) adjust the picker keyboard size (30%–200%). When viewing another keyboard, its saved zoom level is loaded automatically
  • Press Escape to clear the picker selection

File Source

Click the File button at the bottom to switch to the file source. This shows saved keyboard snapshots and allows loading .pipette files — the same keycode picking workflow applies.

Note: Only V2 format (undefined) files are supported in the key picker. If a legacy V1 format file is selected, a warning is displayed prompting you to connect the keyboard and open the keymap to migrate the data.

Composite Keycodes

When clicking a composite key (e.g., LT1(KC_SPC)) in the picker, the full keycode is assigned as-is. Inner/outer parts are not split — the complete keycode is copied to the target key.

Note: The Keyboard tab is hidden when editing the inner part of a mask key (e.g., choosing the undefined inside undefined), since composite keycodes cannot be assigned to the inner byte.

3.14 Keycodes Overlay Panel

The Keycodes Overlay Panel provides quick access to editor tools and save functions. Toggle it with the panel button at the right end of the keycode tab bar.

Settings Tab

Overlay Panel — Settings
  • Key Editor Zoom: Set the UI zoom level (50–200%) applied while in key editor mode. Defaults to the global UI zoom (§6.5) when not configured. Saved and synced per keyboard
  • Auto Advance: Toggle automatic advancement to the next key after assigning a keycode
  • Instant Key Selection: Toggle instant key selection mode (see §2.2 for behavior details)
  • Separate Shift in Key Picker: Toggle split display for combined keycodes (e.g., show Mod-Tap as two halves)
  • Key Tester: Toggle Matrix Tester mode (supported keyboards only)
  • Security: Shows lock status (Locked/Unlocked) with a Lock button
  • Import: Restore from .vil files or sideload custom JSON definitions
  • Reset Keyboard Data: Reset keyboard to factory defaults

Save Tab

Overlay Panel — Save
  • Export Current State: Download keymap as .vil, keymap.c, PDF keymap cheat sheet, or PDF layout export (key outlines with summary pages for Tap Dance, Macro, Combo, Key Override, and Alt Repeat Key entries)
  • Save Current State: Save a snapshot of the current keyboard state with a label
  • Synced Data: List of saved snapshots with Load, Rename, Delete, and Export actions
  • This is the same Save panel as the standalone editor settings (§6)

Layout Tab (when available)

Some keyboards support layout options (see §2.5). When available, a Layout tab appears as the first tab in the overlay panel, providing access to the same layout options.


4. Toolbar

The toolbar on the left side of the keymap editor provides the following features.

Toolbar

4.1 Zoom

Adjusts the keyboard layout display scale. Range: 30%–200% (default 100%).

Zoom In
  • (+) button to zoom in
  • (-) button to zoom out
  • Can also be adjusted in editor settings
  • Zoom level is saved per keyboard and restored automatically on reconnect

4.2 Undo / Redo (Keymap History)

The keymap editor automatically records a history of keycode changes. You can navigate through this history to undo or redo changes.

MethodScopeHow to use
Keyboard shortcutsFull history (up to Max Keymap History, default 100)Ctrl/Cmd+Z (Undo), Ctrl+Y / Ctrl/Cmd+Shift+Z (Redo)
Toolbar buttonsFull historyUndo / Redo buttons in the left toolbar
Popover buttonsLast single change only (must match the open key)Undo / Redo buttons in the popover footer (see §2.4)
  • History is cleared when switching keyboards or disconnecting
  • The maximum history size can be configured in Settings → Defaults → Max Keymap History (see §6.1)
  • All keymap mutation paths are tracked: single key edits, popover selections, mod-mask changes, paste, and copy-layer operations

4.3 Typing Test

A typing practice feature. Test your typing with the current keymap while viewing the keyboard layout below. The layout highlights key presses in real time, so you can verify that your physical keymap matches the on-screen display.

Click the Typing Test button in the status bar to enter typing test mode.

Modes

Three test modes are available, selectable from the mode tabs at the top:

Words Mode

Typing Test — Words Mode
  • Type a fixed number of random words (15 / 30 / 60 / 120)
  • The test ends when all words are completed

Time Mode

Typing Test — Time Mode
  • Type as many words as possible within a time limit (15 / 30 / 60 / 120 seconds)
  • A countdown timer shows remaining time

Quote Mode

Typing Test — Quote Mode
  • Type a real-world quote (short / medium / long / all)
  • The quote source is shown after completion

Options

Typing Test — With Options

In Words and Time modes, you can toggle additional options:

  • Punctuation: Adds punctuation marks (commas, periods, etc.) to the word list
  • Numbers: Adds numbers to the word list

These toggles are not available in Quote mode, which uses the original text as-is.

During a Test

Typing Test — Running

While typing, the following stats are displayed in real time:

  • WPM: Words Per Minute (current typing speed)
  • Accuracy: Percentage of correctly typed characters
  • Time: Elapsed time (or remaining time in Time mode)
  • Words: Current word / total words

Correctly typed words turn green. Incorrect characters are highlighted in red with an underline. The cursor advances as you type, and words scroll automatically.

  • Press the restart button (↺) to restart the test at any time
  • Press Escape to exit typing test mode
  • The status bar's Disconnect button is hidden while Typing Test is active. To disconnect, first return to the editor with Escape or the Typing Test button
  • The keyboard layout below the test area shows key presses in real time via the Vial matrix tester protocol

Typing View (View-Only Mode)

Typing View displays only the keyboard layout in a compact, resizable window — ideal for overlaying on top of other applications while practicing.

Click the Typing View button in the status bar (visible when Typing Test is not active) to enter view-only mode.

View-Only — Compact Window
  • The window shows only the keyboard layout with real-time key press highlighting
  • The toolbar, keycode palette, typing test UI, and status bar are hidden
  • The window maintains its aspect ratio when resized

Menu Pane

View-Only — Controls

Click anywhere on the keyboard area to toggle the menu pane (bottom-right popup). The pane is split into Window and REC tabs at the top, with a shared Base layer selector and Exit Typing View button at the bottom.

Window tab (default)

  • Default Size: Reset the window to its default calculated size
  • Fit Size: Adjust the window height to match the current width while preserving the aspect ratio
  • Top: Keep the window above other windows (always-on-top; not available on Wayland)

REC tab

Recording controls and the Monitor App toggle. Detailed in Typing analytics recording below.

Shared controls (visible in both tabs)

  • Base: Select which layer to display (when the keyboard has multiple layers)
  • Exit Typing View: Return to the full editor

Press Escape or click the keyboard area again to close the pane. A hint text appears at the bottom when hovering over the window. The window size, always-on-top preference, and the active menu tab are saved per keyboard.

Note: Auto-lock is suspended while in Typing View mode. If the keyboard is disconnected while in view-only mode, the window automatically restores to its normal size.

Typing analytics recording

While Typing View is open, the REC tab in the Menu Pane records per-key and per-minute statistics that feed the Analyze page (§1.4). Recording stays off by default.

Typing Test — REC Tab

Start / Stop

Press the toggle once to start recording — the button shows Start while idle and Stop while recording. The Recording indicator appears at the top of the Typing View window so you can tell at a glance whether data is being captured.

The very first time you press Start, a consent dialog appears:

Typing Test — Recording Consent
SectionItems
What we collectPer-minute character frequency · Per-key press counts (row / col / layer / keycode, tap vs hold) · Typing speed distribution (interval percentiles) · Active application name (only when Monitor App is on; minutes that observe multiple apps are recorded as unknown)
What we do NOT collectIndividual keystroke timing · Text content / passwords / specific words · Window title / URL / file path

Click Enable to opt in — your consent is persisted in app settings (not synced) and the dialog never appears again. Click Cancel to back out without starting; you can press Start later to see the dialog again.

Monitor App

When the Monitor App toggle is on (and REC is in the Stop / recording state), Pipette resolves the foreground application name once per data flush so each minute can be tagged with the app that owned the keystrokes. Minutes that observed only one app carry that app's name; minutes that observed multiple apps are tagged as Unknown / Mixed. The tags drive the App filter and the By App tab in Analyze.

  • The button is greyed out while REC is Start (not recording) state — turning it on without REC has no effect, so the UI funnels you through Start first
  • The on/off state is global (AppConfig), not per-keyboard, and is not synced to other machines
  • Linux / Wayland: requires the FocusedWindow GNOME Shell extension (see README). Without it, every minute is recorded as null
  • macOS: requires the Accessibility permission (see README). Without it, every minute is recorded as null
  • Turning Monitor App off keeps existing tags in the database; only newly recorded minutes go untagged

View Analytics

Jumps directly to the Analyze page for this keyboard so you can review the stream you just recorded. Going back returns you to Typing View.

View Mode Memory and Auto-Restore

The last view mode (Editor / Typing Test / Typing View) is remembered per keyboard and automatically restored the next time you connect that keyboard:

  • Editor: The editor view is shown as usual
  • Typing Test: Typing Test mode is re-entered automatically. If the keyboard is locked, the Unlock dialog appears first and the test starts after unlocking
  • Typing View: The compact view-only window is re-entered automatically. If the keyboard is locked, the Unlock dialog appears first

View mode is stored per keyboard alongside preferences like keyboard layout, zoom scale, and window size. When Pipette Hub sync is enabled, view mode is synced to other devices as well (see §7).


5. Detail Setting Editors

Open detail setting modals from their dedicated keycode tabs. Lighting opens via a Settings: Configuration button at the bottom of its tab; Combo, Key Override, and Alt Repeat Key detail editors open by clicking an entry on their respective tabs.

5.1 Lighting Settings

Open from the Settings: Configuration button on the Lighting tab. Configure RGB lighting colors and effects.

Lighting Settings
  • Select colors with the HSV color picker
  • Choose colors from preset palette
  • Adjust effects and speed
  • Click Save to apply

5.2 Combo

Configure simultaneous key press combinations to trigger different keys. The Combo tab displays an inline tile grid; clicking an entry opens the detail editor modal directly.

Tile Grid (Combo tab)

Combo List

The Combo tab shows entries as a numbered list (0--31). Configured entries display a summary (e.g., "A + B → C"). Click an entry to open the detail editor. Combo keycodes (Combo On, Combo Off, Combo Toggle) are shown below the list. A Settings: Configuration button at the bottom opens a settings modal for QMK Combo timeout configuration (e.g., Combo time out period).

Detail Editor

Combo Detail
  • Left panel: Combo editor with Key 1--4 and Output fields.
  • Right panel: Inline favorites panel (Save Current State / Synced Data / Import / Export All)
  • Clear resets all fields; Revert restores the last saved state. Both use two-step confirmation.
  • Save writes changes to the keyboard

5.3 Key Override

Replace specific key inputs with different keys. The Key Override tab displays an inline tile grid; clicking an entry opens the detail editor modal directly.

Tile Grid (Key Override tab)

Key Override List

Shows entries as a numbered list. Configured entries display a summary. Click an entry to open the detail editor.

Detail Editor

Key Override Detail
  • Left panel: Trigger Key, Replacement Key, enabled toggle, layer and modifier options
  • Right panel: Inline favorites panel (Save Current State / Synced Data / Import / Export All)
  • Clear resets all fields; Revert restores the last saved state. Both use two-step confirmation.
  • Save writes changes to the keyboard

5.4 Alt Repeat Key

Configure alternative actions for the Repeat Key. The Alt Repeat Key tab displays an inline tile grid; clicking an entry opens the detail editor modal directly.

Tile Grid (Alt Repeat Key tab)

Alt Repeat Key List

Shows entries as a numbered list. Configured entries display a summary. Click an entry to open the detail editor.

Detail Editor

Alt Repeat Key Detail
  • Left panel: Last Key, Alt Key, enabled toggle, Allowed Mods, Options (DefaultToThisAltKey, Bidirectional, IgnoreModHandedness)
  • Right panel: Inline favorites panel (Save Current State / Synced Data / Import / Export All)
  • Clear resets all fields; Revert restores the last saved state. Both use two-step confirmation.
  • Save writes changes to the keyboard

5.5 Favorites

Each editor modal (Tap Dance, Macro, Combo, Key Override, Alt Repeat Key) includes an inline Favorites panel on the right side of the editor.

Inline Favorites Panel

The inline favorites panel provides:

  • Save Current State: Enter a label and click Save to store the current entry configuration
    • Import / Export buttons: Import a .pipette-fav file to apply to the current entry, or export the current entry settings as a .pipette-fav file without saving to the store. Inline "Imported" / "Exported" feedback is shown after each action.
  • Synced Data: Previously saved entries are listed with Load, Rename, Delete, and Export actions
  • Import / Export All: Footer buttons for bulk import/export of favorites

Within the Synced Data list:

  • Load: Apply a saved configuration to the current entry
  • Rename: Change the label of a saved entry (also synced to Hub if the entry is uploaded)
  • Delete: Remove a saved entry
  • Export: Download an individual saved entry as a file

When Pipette Hub is connected, each saved entry also shows Hub actions:

Inline Favorites — Hub Actions
  • Upload to Hub: Upload the favorite entry to Pipette Hub as a feature post
  • Update on Hub: Re-upload the latest configuration to update the existing Hub post
  • Remove from Hub: Delete the entry from Pipette Hub (two-step confirmation)
  • Open in Browser: Open the individual Hub post page in your browser

5.6 JSON Editor

Each feature tab (Tap Dance, Macro, Combo, Key Override, Alt Repeat Key) provides an Edit JSON button at the bottom of the tab. This opens a JSON editor modal for bulk editing all entries as raw JSON text.

JSON Editor — Tap Dance
  • Text area: Edit all entries as a JSON array. Changes are validated in real time — parse errors are shown below the editor
  • Export (left): Save the current JSON as a .pipette-fav file for backup or sharing
  • Cancel (right): Close without saving
  • Save (right): Apply the parsed JSON and write changes to the keyboard
JSON Editor — Macro

For Macros, a warning is displayed indicating that keyboard unlock is required to save changes.

Note: The JSON editor modifies all entries at once. Use with caution — invalid JSON will be rejected, but valid JSON with incorrect values may cause unexpected behavior.

Note: Favorites are not tied to a specific keyboard — saved entries can be loaded on any compatible keyboard. When Cloud Sync is enabled, favorites are also synced across devices (see §6.1). Favorites can also be managed from the Data modal on the device selection screen (see §1.3).


6. Editor Settings Panel

Open the editor settings panel from the save button (floppy disk icon) in the keycode tab bar, or use the Save tab in the Keycodes Overlay Panel (§3.14).

Editor Settings — Save

The editor settings panel now provides a single Save panel with the following features:

  • Export Current State: Download keymap as .vil, keymap.c, PDF keymap cheat sheet, or PDF layout export (key outlines with summary pages for Tap Dance, Macro, Combo, Key Override, and Alt Repeat Key entries). An "Exported" inline feedback message appears after a successful export.
  • Save Current State: Save a snapshot of the current keyboard state with a label. Enter a name in the Label field and click Save. If the Label field is left empty, the Save button is disabled. Saved snapshots appear in the Synced Data list below and can be loaded or deleted later
  • Synced Data: List of saved snapshots. Click to load, rename, or delete entries
  • Reset Keyboard Data: Reset keyboard to factory defaults (use with caution)

Note: Tool settings (auto advance, key tester, security) are in the Keycodes Overlay Panel (§3.14). Keyboard layout is available in the status bar quick settings (§9); Basic tab view type is selectable at the bottom of the Basic tab. Zoom is available in the toolbar (§4.1). Layer settings are managed directly via the layer panel on the left side of the editor.

6.1 Cloud Sync (Google Drive appDataFolder)

Pipette can sync your saved snapshots, favorites, and per-keyboard settings across multiple devices via Google Drive.

Sync is configured in the Settings modal (gear icon on the device selection screen), under the Data tab:

Data Tab

The Data tab contains the following sections: Google Account, Data Sync, and Pipette Hub. Additional troubleshooting and data management options are available in the Data panel (§1.3).

Google Account

  • Click Connect to sign in with your Google account
  • Click Disconnect to sign out. If Pipette Hub is also connected, a warning confirms that Hub will be disconnected as well

Sync Encryption Password

  • Set a password to encrypt all synced data (required). A strength indicator helps you choose a strong password
  • If a password already exists on the server (set from another device), a hint is shown asking you to enter the same password
  • Change Password: Click Change Password to re-encrypt all synced files with a new password. No data is deleted — existing files are decrypted and re-encrypted in place

Change Password error conditions

When a password change cannot proceed, Pipette shows a localized message instead of the raw error. The common cases are listed below; other underlying errors (network, Drive) may appear as their own messages.

Credential failures (the 5 reasons come from the same typed SyncCredentialFailureReason set used for readiness — only 3 of them surface in Sync Status below):

ReasonMessageTrigger
unauthenticated"Please sign in to Google before changing the password."Not signed in with Google
noPasswordFile"No saved password to change. Set a password first."No local sync password has ever been set
decryptFailed"Couldn't read the existing password (OS keychain rejected it)."The OS keychain entry is unreadable (keychain reset, profile move, etc.)
keystoreUnavailable"OS keychain is not available; password cannot be changed here."safeStorage.isEncryptionAvailable() returns false (typical on headless Linux without a keyring)
remoteCheckFailed"Couldn't reach Google Drive to verify the current password."Network or Drive outage — retry later

Operational errors (shown as the message directly, no reason code):

MessageTrigger
"Cannot change password while sync is in progress."A sync is already running — wait for it to finish
"New password must be different from the current password."The new password matches the existing one
"Some files cannot be decrypted. Please scan and delete undecryptable files first."Drive has files the current password cannot decrypt — use Undecryptable Files first
"Sync password does not match. Please check your encryption password."The current password fails to decrypt the remote password check — reconfirm the password you are providing

Sync Controls

  • Auto Sync: Toggle automatic sync on or off. When enabled, changes sync automatically with a 10-second debounce and periodic 3-minute polling
  • Sync: Manually sync favorites and connected keyboard data. Only favorites and the currently connected keyboard are synced (not all keyboards)

Sync Status

  • Displays current sync progress with the sync unit name and an item counter (current / total)
  • Shows error or partial-sync details if any units failed

Readiness reasons

If sync cannot run because the client is not ready, a specific readiness reason is shown in place of the generic "Not synced yet" label. Only three reasons surface here; detailed keystore failures (decryptFailed, keystoreUnavailable) come through the password set/change flow instead.

ReasonMessage
unauthenticated"Sign in to Google to sync."
noPasswordFile"Set a sync password to start syncing."
remoteCheckFailed"Couldn't reach Google Drive — sync is paused."

Undecryptable Files

  • Files that cannot be decrypted with the current password or are otherwise unreadable (e.g., encrypted with a forgotten previous password)
  • Click Scan to detect undecryptable files, select the ones to remove, then click Delete Selected to permanently delete them from Google Drive

Sync Unavailable Alert

  • Displayed when the sync backend cannot be reached. Click Retry to attempt reconnection

Data Storage

Synced data is stored in Google Drive appDataFolder — a hidden, app-specific folder that only Pipette can access. Your personal Drive files are never touched.

See the Data Guide for details on what is synced and how your data is protected.

Data Management

Troubleshooting and data management functions are available in the Data panel (see §1.3):

  • Local > Application: Import/export local data or reset selected targets (keyboard data, favorites, app settings)
  • Sync: List remote-only keyboards by real name and download any one on demand (see §1.3). To delete encrypted files that cannot be decrypted, use the Undecryptable Files section above

Settings — Defaults

Settings — Defaults

The Tools tab in the Settings modal includes a Defaults section for setting initial preferences for new keyboard connections:

  • Keyboard Layout: Default key labels for new keyboards. The dropdown lists every entry currently installed in the Key Labels store (see §6.2). QWERTY ships built-in; install more from Pipette Hub or import a .json via Key Labels Manage. The drop-down preserves the manual order set in the modal — drag a row up or down there and the dropdown follows
  • Auto Advance: Default auto-advance behavior
  • Instant Key Selection: Default instant key selection behavior (see §2.2)
  • Layer Panel Open: Whether the layer panel starts expanded or collapsed
  • Basic View Type: Default view type for the Basic tab (ANSI/ISO/JIS/List)
  • Separate Shift in Key Picker: Default setting for separating Shift in the key picker
  • Max Keymap History: Maximum number of keymap changes to keep in the current keyboard's edit history (default: 100). History is cleared on disconnect or keyboard switch. See §4.2 for details.

6.2 Key Labels Manage

The Tools tab also exposes a Key Labels Manage row (next to the Language Packs row). Click Edit to open the Key Labels modal, which manages every label set the app uses to render keycaps in the editor, the Analyze view, and the Layout Comparison.

QWERTY is built-in; every other label set (Dvorak, Colemak, French, Brazilian, …) is downloaded from Pipette Hub or imported from a local .json file. Installed entries sync across devices via Cloud Sync, so the same drag order and selection appear on every machine signed into the same account.

Installed tab

Key Labels — Installed

Lists every label set already on this device. Each row shows the label name, the uploader name (when the entry came from Hub), the Hub-side last-update time (YYYY-MM-DD HH:mm, mirrors what the Hub website displays), an .json export shortcut, and a Delete button. Drag the grip handle on the left to reorder rows — the order is propagated to the Settings dropdown and to every Key Labels picker in the editor.

A second line under each row exposes the Hub actions:

  • Open: open the entry's Hub page in the system browser (only when the row is linked to a Hub post)
  • Upload: publish a new Hub post from this local entry (only for entries that have not been uploaded yet)
  • Update: push the current local content to the existing Hub post (owner only)
  • Sync: pull the latest Hub content into this local entry without losing the local rename or drag position (shown for downloaded entries you do not own). A pulsing green dot appears next to the Sync button when the Hub-side post is newer than your local cache — opening the modal triggers a bulk freshness check (throttled to once per 5 min) so you can spot updates without manually clicking each row
  • Remove: take the post down from Hub. Confirms inline before running

If the Hub freshness check finds a row whose post has been deleted upstream, the Updated column reads (removed) in red instead of a timestamp; clicking Sync on such a row will fail because the Hub no longer serves it.

QWERTY shows no Hub actions and cannot be deleted, but it can be reordered like any other row.

Find on Hub tab

Key Labels — Find on Hub

Searches Pipette Hub for label sets. Type 2 or more characters to start an automatic search (debounced); the Search button and Enter still work as manual triggers. Results show the label name, the uploader, and either a Download action or an Installed marker when the same name is already present locally. Re-importing a file with a name that already exists overwrites the local entry in place (.json content replaced, the Hub link is preserved).

Authoring a Key Label

A Key Label .json file is a small JSON object with three fields:

{
  "name": "Brazilian (QWERTY)",
  "map": {
    "KC_2": "2\n@",
    "KC_3": "3\n#",
    "KC_LBRC": "´\n`",
    "KC_QUOT": "ç",
    "KC_GRAVE": "KC_LALT"
  },
  "compositeLabels": {
    "LSFT(KC_2)": "@",
    "LALT(KC_L)": "KC_LALT"
  }
}

In the example above, "KC_GRAVE": "KC_LALT" makes the editor render whichever cap is currently bound to KC_GRAVE with the canonical "LAlt" legend — the value is a keycode id, so keycodeLabel() resolves it on the fly.

FieldRequiredPurpose
nameYesDisplay name shown in the modal, in the Settings → Defaults dropdown, and in the Keycodes Overlay Panel
mapYesQMK keycode id → label string. Used as the keycap legend in the Keymap Editor whenever this label set is active
compositeLabelsNoSame shape as map, but for composite keycodes (e.g. LSFT(KC_2), LT(0,KC_A), MT(MOD_LCTL,KC_ESC)). Used to override the inner / outer text of the composite key. Omit the field if you don't need any composite override

A value can also be a plain QMK keycode id — the editor passes it through keycodeLabel() so something like "LALT(KC_L)": "KC_LALT" resolves to the canonical "LAlt" label without you having to spell the legend out by hand. The same shortcut works in map, so "KC_8": "KC_LALT" would render the cap as "LAlt".

The label string controls how the legend is rendered. Lines are separated by \n and the layout is chosen by part count:

PartsLayoutExample
1Centred (existing behaviour)"8"
2Stacked top / bottom"(\n8"( over 8
3Three horizontal slices (top / middle / bottom)"a\nb\nc"
42 × 2 quadrants — top-left, top-right, bottom-left, bottom-right"1\n2\n3\n4"1\|2 / 3\|4
5+Excess parts beyond 4 are dropped

An empty string between separators leaves the corresponding slot blank, so "1\n2\n\n4" renders as:

1 | 2
-----
  | 4

Composite keycodes (LT, MT, modifier+key, …) render the inner key inside an inset rectangle that occupies the lower half of the cap, so only the first two \n parts of the outer label are honoured. Parts 3 and 4 are silently dropped to avoid colliding with the inner rect.

name is also the uniqueness key inside the local store: importing a .json whose name already exists overwrites the matching entry in place (the Hub post link, if any, is preserved). To start a brand-new entry, change the name before importing.

6.3 Language Packs Manage

The Tools tab shows a Language Packs row displaying the currently active UI language. Click Edit to open the Language Packs modal.

English is built-in; every other language is imported from a local .json file or downloaded from Pipette Hub. Installed packs sync across devices via Cloud Sync. Hub-linked packs are automatically checked for updates at app startup and refreshed silently when newer versions are available.

Installed tab

Language Packs — Installed

Lists every language pack on this device. Each row has a check circle on the left — click it to switch the active UI language immediately. The active row is highlighted with an accent border.

Each row shows:

  • Name (click to rename inline)
  • Updated timestamp (YYYY-MM-DD HH:mm)
  • Version chip when the pack covers every key of the current English baseline, or a not set keys button that opens a modal listing the missing translation keys
  • Export / Delete actions on the first line
  • Open / Upload / Update / Sync / Remove Hub actions on the second line (same pattern as Key Labels §6.2)

A pulsing green dot next to the Sync button indicates that the Hub-side post is newer than the local copy (freshness check runs once per 5 minutes when the modal is open).

The Import button in the toolbar opens a file dialog to import a .json language pack. Re-importing a pack with the same name overwrites the existing entry.

Find on Hub tab

Language Packs — Find on Hub

Searches Pipette Hub for language packs. Type 2 or more characters to start an automatic search (debounced). Results show the pack name, version, uploader, and either a Download action or an Installed marker.

Authoring a Language Pack

A language pack .json mirrors the structure of the built-in English pack. Export the English pack (built-in row → Export) to get a template with every key, then translate the values:

{
  "name": "Japanese",
  "version": "0.1.0",
  "common": {
    "save": "保存",
    "cancel": "キャンセル"
  },
  "editor": {
    "keymap": {
      "title": "キーマップ"
    }
  }
}
FieldRequiredPurpose
nameYesDisplay name and uniqueness key for overwrite-on-import
versionYesSemver string (e.g. 0.1.0)
(other keys)YesNested translation tree matching the English structure

Keys use dot-separated namespaces (e.g. editor.keymap.title). A pack that covers every key of the English baseline shows the version chip; partial packs show a "not set keys" link so translators can see what remains. Example language packs (including Japanese variants) are also available in the sample-packs/i18n/ directory in the repository.

6.4 Theme Packs Manage

The Tools tab shows a Theme Packs row displaying the currently active theme pack (if any). Click Edit to open the Theme Packs modal.

Theme packs override the application's colour palette. The built-in Light / Dark / System themes remain available; a theme pack layers its colours on top. Installed packs sync across devices via Cloud Sync.

For theme pack authors: See the Theme Pack Authoring Guide for a complete colour token reference and design tips.

Installed section

Theme Packs — Installed

Lists every theme pack on this device. Each row has a radio circle on the left — click it to apply that theme pack immediately. Click the active row again to deselect it and revert to the built-in theme. The three built-in options (Light / Dark / System) appear at the top.

Each row shows:

  • Name (click to rename inline)
  • Updated timestamp (YYYY-MM-DD HH:mm)
  • Version chip
  • .json export shortcut and Delete button on the first line
  • Open / Upload / Update / Sync / Remove Hub actions on the second line (same pattern as Key Labels §6.2)

A pulsing green dot next to the Sync button indicates that the Hub-side post is newer than the local copy (freshness check runs once per 5 minutes when the modal is open).

The Import button in the toolbar opens a file dialog to import a .json theme pack. Re-importing a pack with the same name overwrites the existing entry.

Find on Hub tab

Theme Packs — Find on Hub

Searches Pipette Hub for theme packs. Type 2 or more characters to start an automatic search (debounced). Each result shows the pack name, version, uploader, a Preview button, and either a Download action or an Installed marker.

Click Preview to temporarily apply the theme's colours without installing. The preview resets when you close the modal, switch to the Installed tab, or click Preview again to toggle it off.

Authoring a Theme Pack

A theme pack .json defines a name, version, and a colors object mapping every colour token to a CSS colour value:

{
  "name": "Nord",
  "version": "1.0.0",
  "colorScheme": "dark",
  "colors": {
    "surface": "#2e3440",
    "surface-alt": "#3b4252",
    "surface-dim": "#272c36",
    "surface-raised": "#434c5e",
    "content": "#eceff4",
    "content-secondary": "#d8dee9",
    "content-muted": "#7b88a1",
    "content-inverse": "#2e3440",
    "edge": "#4c566a",
    "edge-subtle": "#3b4252",
    "edge-strong": "#d8dee9",
    "accent": "#88c0d0",
    "accent-hover": "#81a1c1",
    "accent-alt": "#5e81ac",
    "success": "#a3be8c",
    "warning": "#ebcb8b",
    "danger": "#bf616a",
    "pending": "#b48ead",
    "key-bg": "#3b4252",
    "key-bg-hover": "#434c5e",
    "key-bg-active": "#4c566a",
    "key-border": "#4c566a",
    "key-shadow": "rgba(0,0,0,0.3)",
    "key-label": "#eceff4",
    "key-sublabel": "#d8dee9",
    "key-label-remap": "#88c0d0",
    "key-bg-multi-selected": "#434c5e",
    "tab-bg-active": "#3b4252",
    "tab-text": "#7b88a1",
    "tab-text-active": "#eceff4",
    "picker-bg": "#2e3440",
    "picker-item-bg": "#3b4252",
    "picker-item-hover": "#434c5e",
    "picker-item-text": "#eceff4",
    "picker-item-border": "#4c566a"
  }
}
FieldRequiredPurpose
nameYesDisplay name and uniqueness key for overwrite-on-import
versionYesSemver string (e.g. 1.0.0)
colorSchemeYes"light" or "dark" — declares the intended brightness of the pack
colorsYesObject mapping all 35 colour tokens to CSS colour values (#hex, rgb(), or hsl())

All 35 colour tokens are required. Export any installed pack (row → .json) to get a complete template. Ready-to-use example theme packs (Kanagawa Wave / Dragon / Lotus and Solarized Light / Dark) are also available in the sample-packs/themes/ directory in the repository.

6.5 Zoom (UI Scale)

The Tools tab shows a Zoom row below Theme Packs. This setting scales the entire application UI (50–200%).

Zoom Setting
  • Enter a percentage value in the input field (50–200) and press Enter or click away to apply
  • The zoom level takes effect immediately across all windows
  • This is a machine-local setting — it is not synced to other devices via Cloud Sync

Note: This is separate from the per-keyboard zoom in the toolbar (§4.1), which only scales the keymap editor display, and from the Key Editor Zoom in the Keycodes Overlay Panel (§3.14), which overrides the window zoom level while in key editor mode. The UI zoom here is the baseline applied on all other screens.

Warning: Changing the zoom level may cause layout issues at extreme values. Use at your own risk.


7. Pipette Hub

Pipette Hub is a community keymap gallery where you can upload and share your keyboard configurations and favorite entries.

7.1 Hub Setup

Hub features require Google account authentication. Please complete Google account authentication first. Configure Hub in the Settings modal (gear icon on the device selection screen):

  1. In the Data tab, click Connect under the Google Account section to sign in with your Google account
  2. Scroll down to the Pipette Hub section in the same Data tab — it should show Connected
  3. Set your Display Name — this name is shown on your Hub posts
  4. Your uploaded keymaps appear in the My Posts list

7.2 Uploading a Keymap

To upload a keymap to Hub:

  1. Connect to your keyboard and open the editor settings (gear icon in the keymap editor)
  2. Switch to the Data tab
  3. Save the current state with a label (e.g., "Default")
Upload Button
  1. Click the Upload button on the saved snapshot entry
  2. After uploading, the entry shows Uploaded status with Open in Browser, Update, and Remove buttons
Uploaded
  • Open in Browser: Opens the Hub page for this keymap
  • Update: Re-uploads the current keyboard state to update the existing Hub post
  • Remove: Removes the keymap from Hub

Note: Hub uploads include a undefined file alongside the standard export formats, allowing other users to load the full keyboard state directly.

7.3 Uploading Favorite Entries

Individual favorite entries (Tap Dance, Macro, Combo, Key Override, Alt Repeat Key) can also be uploaded to Hub:

Data Modal — Favorites Hub Actions
  1. Open any editor modal with the inline favorites panel, or use the Data modal from the device selection screen
  2. In the favorites list, each entry shows an Upload to Hub button when Hub is connected
  3. Click Upload to Hub to share the configuration
  4. After uploading, Open in Browser, Update on Hub, and Remove from Hub buttons appear
  5. Renaming a favorite that is uploaded to Hub also updates the title on Hub automatically

Note: A Display Name must be set before uploading. If no Display Name is configured, a warning is shown instead of the Upload button.

7.4 Uploading Analytics

Saved Analyze conditions can be uploaded to Hub, sharing your typing analytics charts with the community.

Flow

  1. Open the Analyze page and set up the filters you want to share (keyboard, device, app, date range, keymap snapshot)
  2. Save the condition with a label using the Saved search conditions panel (bookmark icon)
  3. When Hub is connected, a Hub action row appears under each saved entry with an Upload to Hub button
  4. Click Upload to Hub — the category-picker modal opens in upload mode (see §1.4 Export / Upload)
  5. Select which chart categories to include, pick Layout Comparison targets and Per-app data if desired, then click Upload
  6. After uploading, the entry shows Open in Browser, Update on Hub, and Remove from Hub buttons

Validation rules

The Hub enforces two guards before accepting an analytics upload:

  • Minimum 100 keystrokes in the saved range — sub-100-keystroke charts are too sparse to be useful
  • Maximum 30-day range — longer ranges produce payloads that exceed the Hub size budget

If either rule is violated, a localized error message explains what to fix (e.g., shorten the range or record more typing).

Upload-mode options

  • Layout Comparison targets — pick one or more alternative layouts to include. The Hub post will show how your typing would redistribute across each target. The toggle is disabled when no targets are selected
  • Per-app data — choose which apps to include as per-app breakdowns. The Hub post renders per-app charts for the selected apps

Update and Remove

  • Update on Hub re-uploads the latest chart data for the same saved condition (useful after more typing has been recorded)
  • Remove from Hub deletes the analytics post from the Hub server (two-step confirmation)

Error handling

Upload errors are localized. Common cases: authentication failure (sign out and back in), payload too large (reduce categories or shorten range), rate limit (wait and retry).

Note: A Display Name must be set before uploading. If no Display Name is configured, a warning is shown instead of the Upload button.

7.5 Hub Website

The Pipette Hub website displays uploaded keymaps in a gallery format.

Hub Top Page
  • Browse uploaded keymaps from the community
  • Search by keyboard name
  • Download keymaps as .vil, .c, or .pdf files

Individual Keymap Page

Clicking a keymap card opens the detail page with a full keyboard layout visualization.

Hub Detail Page
  • View all layers (Layer 0–3) of the uploaded keymap
  • Review Tap Dance, Macro, Combo, Alt Repeat Key, and Key Override configurations
  • Copy URL or Share on X to share with others
  • Download in various formats (.pdf, .c, .vil)

See the Data Guide for details on how Hub authentication works.


8. Modal Interactions

Pipette applies a uniform set of keyboard and dismissal rules to every top-level modal (Settings, Data, Macro, QMK Settings, Tap Dance, Combo, Key Override, Alt Repeat Key, Notification, Language Packs, Theme Packs, Language Selector, Layout Store, Editor Settings, Favorite Store, and the History Toggle dialog).

Escape to Close

Pressing Escape closes the modal, with the following exceptions so that Escape never interrupts text entry:

  • If the focused element is an <input>, <textarea>, <select>, or anything inside a contenteditable region, Escape is ignored (the element receives it instead)
  • During an IME composition (e.g., Japanese input), Escape is ignored so the composition can be cancelled without dismissing the modal

Unlock Dialog Protection

The Unlock Dialog (prompting for a physical key press after a boot-unlock keycode is invoked) intercepts Escape before it reaches the parent modal. Pressing Escape on top of an unlock prompt cannot leak through, preventing accidental dismissal of a half-configured Settings or Data modal by rapid Escape presses.

Escape Suppression During Busy Flows

Escape-to-close is disabled while the containing modal is in a transient state that must complete:

  • Settings / Data modals: disabled while a sync / troubleshooting flow is running
  • Macro Modal: disabled while the recorder is actively capturing keystrokes (see §3.7 Recording Lock); the backdrop click and top-right Close button are also inert at the same time

9. Status Bar

The status bar at the bottom of the screen shows connection information and action buttons.

Status Bar

Status indicators (left side)

  • Device name: Shows the name of the connected keyboard
  • Loaded label: The label of the loaded snapshot (shown only when a snapshot is loaded)
  • Auto Advance: Status of automatic key advancement after assigning a keycode (shown only when enabled)
  • Locked / Unlocked: Keyboard lock status (prevents accidental changes to dangerous keycodes)
  • Sync status: Cloud sync status (shown only when sync is configured)
  • Hub connection: Pipette Hub connection status (shown only when Hub is configured)

Quick Settings (right side, shown when a keyboard is connected)

Inline selectors for common per-session preferences. A | separator divides them from the mode buttons.

  • Language: Switch the UI language. Opens a dropdown of built-in languages and installed language packs (see §6.3)
  • Theme: Switch the color theme. Options include System, Light, Dark, and any installed theme packs (see §6.4)
  • Key Labels: Switch the key label set for the current keyboard. Options reflect the installed Key Labels store in drag order (see §6.2)
  • Edit / Done: Toggle edit mode. Replaces the selectors with Language Packs, Theme Packs, and Key Labels management modal buttons for installing, syncing, or reordering entries

Action buttons (right side)

  • Key Tester: Toggle button for Matrix Tester mode (requires matrix tester support; hidden when Typing Test is active)
  • Typing View: Toggle button to enter view-only mode — a compact window showing only the keyboard layout (see §4.3). Requires matrix tester support; hidden when Typing Test is active
  • Typing Test: Toggle button for Typing Test mode (requires matrix tester support)
  • Disconnect button: Disconnects from the keyboard and returns to the device selection screen (hidden while Typing Test is active)

Pipette 操作ガイド

English version

このドキュメントでは Pipette デスクトップアプリの操作方法を説明します。 スクリーンショットは特に記載がない限り GPK60-63R キーボードを使用して撮影しています。


1. デバイス接続

1.1 デバイス選択画面

アプリを起動すると、接続されている Vial 対応キーボードの一覧が表示されます。

デバイス選択画面
  • USB 接続されたキーボードが自動的に検出されます
  • 複数のキーボードが接続されている場合は、一覧から選択できます
  • Linux で検出されない場合は、udev ルールの設定が必要です

File タブ

File タブ

File タブでは、物理キーボードを接続せずに .pipette ファイルをオフラインで編集できます:

  • 保存済みのキーボードを閲覧してエントリを選択・読み込み
  • ディスクから外部 .pipette ファイルを読み込み
  • ファイルに埋め込まれた定義から仮想キーボードが作成されます
  • 未保存の変更がある場合はインジケーターが表示されます

使用例: キーボードのキーマップを変更したいけれど、手元にキーボードがない場合。あらかじめデータを保存しておけば、File タブから読み込んでオフラインで編集し、後でキーボードを接続してデータをロードすれば変更を反映できます。

機能の利用可否: デバイス接続 vs ファイル読み込み

機能デバイス (USB)ファイル (.pipette)
キーマップ編集oo
マクロ / タップダンス編集oo
コンボ / キーオーバーライド / Alt Repeat Keyoo
QMK Settingso (デバイス経由)o (ローカルデータ)
タイピングテストoo
エクスポート (.vil / .c / .pdf)oo
ライティング制御ox
マトリクステスターox
ロック / アンロックox
スナップショット保存 / 読込ox
Hub アップロードox
JSON サイドロードox
デバイスプローブ (Keyboard タブ)ox
クラウド同期ox

1.2 キーボードの接続

一覧からキーボード名をクリックすると、キーマップエディタに遷移します。接続中はオーバーレイにキーボードデータの読み込み進捗が表示されます。

クラウド同期が設定されている場合、接続時に同期進捗も表示されます(お気に入りを先に同期し、次にキーボード固有データを同期)。

1.3 データ

デバイス選択画面の Data ボタンをクリックすると、キーボード・お気に入り・同期データ・Hub 投稿を一元管理するデータパネルが開きます。

データ — お気に入り

左側のサイドバーにツリーナビゲーションが表示されます:

  • Local
    • Keyboards: 保存済みキーボードスナップショットの閲覧。クリックでロード、エクスポート、削除
    • Favorites: Tap Dance、Macro、Combo、Key Override、Alt Repeat Key — タイプごとにリネーム、削除、エクスポート、Hub アクションが可能
    • Application: ローカルデータのインポート/エクスポート、またはリセット対象の選択(キーボードデータ、お気に入り、アプリ設定)
  • Sync (クラウド同期設定時): このデバイスにまだダウンロードされていない Google Drive 上のキーボードを一覧表示します。各エントリは UID ではなく、同期された名前インデックスから解決された実際のキーボード名で表示されます。リモートのみのキーボードをクリックするとオンデマンドでダウンロードされ、取得中はスピナーが表示され、失敗時はインラインでエラーが表示されます。ダウンロードが完了すると、そのキーボードは Local › Keyboards に移動します。復号不能な孤立ファイルを削除したい場合は、設定の Data タブの 復号不能ファイル を使ってください (§6.1 参照)
  • Hub (Hub 接続時): キーボード名でグループ化された Hub 投稿を管理
データ — キーボード保存
データ — アプリケーション

お気に入りリストのエントリごとの操作:

  • クリックでリネーム、削除、または個別の Export
  • Hub アクション: Hub 接続時、各エントリに Upload to Hub / Update on Hub / Remove from Hub ボタンが表示
  • フッターの Import / Export All ボタンで一括操作

コンテンツエリア上部のパンくずナビゲーションで現在のパスを表示(例: 「Local › Favorites › Tap Dance」)

1.4 分析

分析ページは実際の打鍵の内訳を可視化する。キーごとのヒートマップ、WPM 推移、打鍵間隔、時間帯別アクティビティ、指ごとの負荷、キーペア (バイグラム) 間隔、レイヤー別使用状況などを表示する。データはタイピングビュー(ステータスバーから開くコンパクトウィンドウ)を開いている状態で、タイピングテストペインの記録トグルが「開始」になっているときに記録される。タイピングテストの結果も同じストリームに記録される。

アクセス方法

入口は 2 つある:

  • デバイス選択画面の 「分析」タブ — キーボードを接続せずに開ける。いま繋がっていないキーボードのデータを見るときに便利
  • タイピングテストペインの 「分析ビュー」ボタン — 現在使用中のキーボードの分析ページに飛び、戻るとタイピングビューに戻る

キーボードセレクタ

フィルタ行先頭の キーボード セレクトには、打鍵データが記録されているキーボードが一覧表示される。どれかを選ぶとチャートが埋まる。データが無いキーボードはリストに表示されない。ページ下部の 戻る ボタンで前の画面(例: デバイス選択画面)に戻れる。

分析タブ

チャート上部のタブバーから 10 種類の分析を切り替えられる。タブは目的別にグルーピングされている (全体像 / パフォーマンス / 行動分析 / 負荷分析 / 最適化):

グループタブ内容
全体像サマリー今日 / 直近 7 日の差分、Typing profile(Speed / Hand balance / SFB / Fatigue)、ゴール連続記録
パフォーマンスWPMWords-per-minute の推移、または時間帯別分布
パフォーマンス間隔打鍵間隔の分位数(min / p25 / 中央値 / p75 / max)を時系列または分布で表示
行動分析活動量時間 × 曜日グリッド or 月単位スライディングカレンダーを打鍵数 / WPM / セッションで色分け
行動分析アプリ別アクティブアプリ別の内訳。App Usage Distribution(円)と WPM by App(横棒)。Monitor App のデータが必要
負荷分析ヒートマップ物理キーごとの押下回数をキーマップ上に重ねて表示(レイヤー別)。期間内のキーマップスナップショットが必要
負荷分析エルゴノミクス指ごとの打鍵数をバーチャートで表示。指アサインは手動編集可、学習曲線ビューもあり。スナップショットが必要
負荷分析バイグラムキーペアの出現回数・ペア平均間隔ランキング、指ペア別の打鍵間隔バーチャート
負荷分析レイヤーレイヤー別の打鍵数または layer-op 起動回数
最適化レイアウト比較打鍵ログを別レイアウト(Colemak / Dvorak など)に乗せた場合の負担分布を試算。スナップショットが必要

ヒートマップ、エルゴノミクス、バイグラム > Finger IKI、レイアウト比較、レイヤー > 起動回数は期間に重なるキーマップスナップショットが必要。記録を有効にしている間に Pipette が自動でスナップショットを保存するため、空状態の案内に従って記録セッションを開始するとスナップショットが取れる。

共通フィルタ

常に使えるフィルタ:

  • キーマップ履歴 — どの記録時点のキーマップを基準に分析するか選ぶ。From / To の編集は選んだスナップショットの有効期間内に閉じるため、スナップショットを必要とするタブ(ヒートマップ / エルゴノミクス / バイグラム Finger IKI / レイヤー起動回数)が複数のレイアウトを混ぜて表示することはない。スナップショットはタイムラインに並ぶので、記録時点ごとのキーマップ・「現在のキーマップ」を切り替えられる
  • From / To — 分析対象の期間。両入力ともアクティブなスナップショット境界 (またはスナップショットが無いキーボードの場合は直近 7 日) に丸められる
  • デバイス — マルチセレクト。このデバイス と他マシンの hash を任意の組み合わせで選択可能。間隔タブの表示を分布にしているときは非表示(分布ビンはデバイス別に分けないため)
  • アプリ — マルチセレクトドロップダウン。期間中に観測されたアクティブアプリ名の一覧から任意組み合わせを選択。デフォルトは All apps(フィルタなし)。1 つ以上選ぶと、アプリ別 タブを除く全チャートが選択アプリのいずれかでタグされた minute だけに絞り込まれる。Monitor App を有効にしてアプリ名がタグされた minute が記録されるまでドロップダウンは空。キーボード単位で永続化される

各タブには固有のフィルタ(表示モード、粒度、単位など)がチャート上部に追加される。詳細は各タブのサブセクションを参照。ヒートマップタブの 正規化 / 集計 / グループ / 上位 はキーボード直下のランキング行に置かれる。

検索条件の保存

ペインヘッダのブックマークアイコンで 検索条件の保存 サイドパネルが開く。現在のフィルタにラベルを付けて保存、保存済みエントリの呼び出し / リネーム / 削除、CSV エクスポートが可能。各エントリの下にはフィルタの 1 行サマリー(デバイス、アプリ、スナップショット、期間)が表示される。

  • 1 キーボードあたり最大 50 件 — 上限に達するとパネルに警告が出る。空きを作るには既存エントリを削除する
  • Cloud Sync 有効時は同期されるので、他のサインイン済みマシンでも同じセットを利用できる
  • 新しいバージョンの Pipette で書かれたエントリを読み込もうとすると、未対応バージョンのエラーが表示される
  • 上書き: 既存と同名のラベルを入力すると Save ボタンが危険色の Overwrite? + Cancel に切り替わる。ラベルを編集すると確認がリセットされ、別エントリを誤って上書きすることがない
  • Load 時の挙動: 保存済みエントリを読み込むと、保存時にどのタブがアクティブだったかに関わらず常に Summary タブに着地する
  • Hub アクション: Pipette Hub 接続時、各エントリの下に Hub 行が追加表示される(Upload to Hub / Update on Hub / Remove from Hub + Open in Browser)。キーマップ保存パネルやお気に入りと同じパターン(§7.4 参照)

サマリー

サマリータブは分析ペインの起動時にデフォルトで表示されるビュー。他タブと同じ minute バケット集計を元に、4 つの読み取り専用カードで「直近のハイライト・平均・連続記録」を一望できる。

分析 — サマリー
  • 今日 — 今日(ローカル日)の打鍵数 / WPM / 打鍵時間
  • 直近 7 日 — 打鍵数 / WPM / 打鍵時間 / 活動日数。各値に前 7 日との比較矢印付き。前期間データが不足のときは 表記
  • Typing profile (直近 N 日) — 直近期間で算出した 4 つの定性的な読み取り:
    • Speed — 全体 WPM を Slow (<30) / Medium (30–50) / Fast (≥50) に分類
    • Hand balance — バイグラム打鍵の左右シェア。50/50 から ±5% 以内なら Balanced
    • SFB rate — 同じ指で連続打鍵したバイグラム比率。<4% Low / 4–8% Medium / ≥8% High
    • Fatigue risk — ピーク時間帯と最遅時間帯の WPM 差分。差が大きいほどリスク高
  • ゴール連続記録 — 現在の連続記録進捗(current / goalDays)、過去最長記録、編集可能なゴール設定(連続日数 × 日次打鍵数)。ゴール変更時は現在の連続記録カウンタがクリアされる。達成履歴 ボタンで完了サイクル一覧モーダル(期間 / ゴール / 日数 / 合計打鍵 / 日平均)が開く

サマリータブもアプリフィルタを尊重する。1 つ以上のアプリを選ぶと全カードが選択アプリでタグされた minute だけに絞り込まれる。

ヒートマップ

ヒートマップタブは物理キーごとの押下回数を数え、キーマップレイアウトの上にレイヤー別で表示する。レイヤー単位で過剰に使われているキーや全く使われていないキーを洗い出し、レイアウト調整の材料にするのに使う。

キーマップ表示

キーは押下回数で色付けされる(薄い = 少ない、濃い = 多い)。レイヤーが複数あるキーボードではパネル上部にレイヤー切替のボタン列(Layer 0Layer 1、…)が出て、各ボタンにレイヤー別の合計回数が併記される。キーにマウスを乗せるとチャート内にツールチップが開き、割り当てキーコードと回数を表示する。ツールチップはヒートマップの枠内に収まる。

ランキング操作

ヒートマップの下にはランキングテーブルがある。表示内容を 4 つのフィルタで制御する:

  • 正規化絶対数(生の回数)、1 時間あたり(回数 ÷ 活動時間)、総打鍵比 (%)(期間中の全打鍵に対する比率)
  • 集計物理は同じ物理セルの押下をまとめる、文字は同じキーコードを(物理位置に関係なく)まとめる
  • グループすべて / 文字 / 修飾 / レイヤー操作
  • 上位 — 10 / 20 / … / 100

列は キーレイヤー(グループが複数レイヤーにまたがるときのみ表示)、マトリクス回数

分析 — ヒートマップ

空状態

  • スナップショット無し — 「この期間のキーマップスナップショットが記録されていません。record を開始すると取得されます。」
  • レイアウト無し — 「このスナップショットにレイアウトデータがありません。」スナップショットはあるが KLE 情報が欠けている場合
  • 活動なし — 「この期間に押下されたキーがありません。」ランキングテーブルのみ

WPM

WPM タブは Words Per Minute(1 分あたりの打鍵数 ÷ 5)を、時系列または時間帯別で可視化する。

ビュー

  • 時系列 — 選択期間の WPM を折れ線で表示する。赤い破線の Bksp % が常に右側の副軸(0–100%)に重なり、打鍵速度とエラー率を同時に確認できる。WPM だけを見たい場合は凡例の Bksp エントリをクリックして非表示にできる
分析 — WPM 時系列
  • 時間帯別 — 1 日 24 時間のバーチャート。各バーはその時間帯の平均 WPM。最小サンプル 閾値を満たさないバーは薄く表示される
分析 — WPM 時間帯別

最小サンプル(時系列・時間帯別 共通)

30秒1分2分5分。閾値未満の 1 分バケットはチャートから除外され、打鍵数の少ないサンプルによる外れ値を抑制する。

粒度(時系列のみ)

時系列のバケット幅を制御する(自動1分5分、… 1週間1ヶ月)。

サマリカード

  • 時系列 — 合計打鍵、実打鍵時間、平均WPM、最高 WPM、最低WPM、重み付き中央値WPM、1 分最大打鍵、1 日最大打鍵、Bksp 合計、平均 Bksp %
  • 時間帯別 — 合計打鍵、実打鍵時間、平均WPM、ピーク時間帯、最遅時間帯、活動時間帯数(N/24)

間隔

間隔タブは連続する打鍵の間隔(時間)を、分位数の時系列または分布ヒストグラムで可視化する。

ビュー

  • 時系列 — 対数スケールの Y 軸に 5 本の分位数ライン(最小p25中央値p75最大)を描画する。中央値の線が最も太い。凡例をクリックすると線を隠せる。Y 軸ラベルは 表示 の設定に応じて 秒 (log) または ms (log)
分析 — 間隔 時系列
  • 分布 — 9 ビンのバーチャート(<50ms50-100ms100-200ms200-500ms500ms-1s1-2s2-5s5-10s>10s)。帯域別に色分け: 高速(緑、<200ms)/ 標準(青、200-500ms)/ 緩慢(オレンジ、500ms-2s)/ ポーズ(赤、≥2s)。分布モードでは デバイス フィルタが非表示になる(ビン集計は常にこのデバイス単独で行うため)
分析 — 間隔 分布

表示(時系列・分布 共通)

/ ミリ秒。ツールチップと Y 軸の単位が切り替わる。ビンのラベル自体は固定表記。

粒度(時系列のみ)

WPM タブと同じ選択肢。

サマリカード

  • 時系列 — 合計打鍵、実打鍵時間、重み付き中央値、最短打鍵間隔(1分)、最長打鍵間隔(1分)
  • 分布 — 合計打鍵、中央値インターバル、高速 (<200ms) 割合、標準 (200-500ms) 割合、緩慢 (500ms-2s) 割合、ポーズ (>=2s) 割合、最長打鍵間隔(1分)、最長セッション

活動量

活動量タブは打鍵を「曜日 × 時間帯」で集計し、どの時間帯にどれだけ打鍵しているかを俯瞰する。フィルタは独立した 2 軸で並ぶ: ビュー(チャート形状)、指標(セルの値)。

ビュー

  • 時間 — 既存の 24 × 7(時間 × 曜日)グリッド(指標 = セッション のときはヒストグラムに切替)。既存の Period がグリッドの時間幅を決める
  • — 月単位スライディングカレンダー。フィルタ行に 期間 セレクタ(1 / 3 / 6 / 12 ヶ月)と前月 / 翌月カーソルボタンが追加され、月単位ヒートマップを前後に動かせる。3 / 6 / 12 ヶ月では現在月は今日でストップ(未来日は描画しない)、1 ヶ月表示では未来日を含む月全体を表示する

指標

  • 打鍵数 — 打鍵回数。空セルは薄く、最多セルは最も濃く。グリッド表示では 0 でないセルにマウスを乗せると「月 09:00 — 1,234 打鍵 (総打鍵の 5.2%)」のように回数と期間全体に対する比率を併記する
分析 — 活動量 打鍵数
  • WPM — セル別平均 WPM。グリッド表示では 最小サンプル を満たさないセルは色スケールに貼り付けず、薄色で表示される
  • セッション — グリッド表示ではセッション長の 7 ビンヒストグラム(5分未満5-15分15-30分30-60分1-2時間2-4時間4時間以上)。カレンダー表示では各セルが その日に開始したセッション数(DB 仕様上「その日に開始した」セッション。日跨ぎセッションは開始日にしか積まない)

日ビュー専用コントロール(ビュー = 日)

  • 正規化絶対値 は表示窓内のピーク日基準、週内シェア は所属する週の合計で割り、総合シェア は表示範囲全体の合計で割る
  • 期間1 ヶ月 / 3 ヶ月 / 6 ヶ月 / 12 ヶ月。現在月から遡って表示する範囲を選ぶ
  • 前月 / 翌月ボタン — 表示窓を 1 ヶ月単位でスライドする。現在月は右端に固定、未来日は空白のまま(1 ヶ月表示では月全体を表示)
分析 — 活動量 カレンダー

カレンダーの下にグラデーション凡例バーが表示され、色の濃淡がどの値に対応するか(Low → ピーク値)が一目で分かる。

打鍵があるセルをクリックすると、Analyze ペイン全体がその 1 日に飛ぶ。snapshot ピッカーは該当日のキーマップを自動選択するので、ヒートマップ / エルゴノミクス / レイヤー起動回数といった snapshot 依存タブの内容も連動する。

最小サンプル(ビュー = グリッド、指標 = WPM)

WPM タブと同じ選択肢。

ピーク記録

グリッドの上に、期間中のピーク値を 4 枚のカードで表示する: 最高 WPM、1 分最大打鍵、1 日最大打鍵、最長セッション(分)。指標を切り替えてもこれらは常に表示され、全体のピークが一目で確認できる。

サマリカード

グリッドの下には指標別のサマリが出る:

  • 打鍵数 — 合計打鍵、実打鍵時間、最頻曜日、最頻時間帯、ピークセル、活動セル数(N/168)。各カードの回数表示には期間全体に対する比率も併記される(例: 800 打鍵 (40.0%)
  • WPM — 合計打鍵、実打鍵時間、平均WPM、ピークセル、最遅セル、活動セル数(N/168)
  • セッション — セッション数、合計時間、平均セッション長、中央値セッション長、最長セッション、最短セッション

エルゴノミクス

エルゴノミクスタブは打鍵の物理的な負荷を、指別 / 左右バランス / 段別 の 3 つの視点で表示する。スナップショット内のキー → 指の対応を元に集計する。

ヒートマップと同じく、このビューは期間内のキーマップスナップショットが必要。

セクション

3 つのバーチャートが縦に並ぶ:

  1. 指別打鍵量 — 左小指から右小指までの 10 本の縦バー
  2. 左右バランス — 左手 / 右手 の 2 本の横バー
  3. 段別打鍵量 — F 行 / 数字行 / 上段 / ホーム行 / 下段 / 親指段 の 6 本の横バー
分析 — エルゴノミクス

指割り当て

各キーの指アサインはレイアウトの KLE メタデータ(列位置と標準の列→指マッピング)から自動で決まる。キー個別に上書きしたい場合は、タブ上部の 指割り当て ボタンからモーダルを開く:

分析 — 指割り当て
  • 各キーには指の短ラベル(左小 左薬 左中 左人 左親 / 右親 右人 右中 右薬 右小)が表示される。手動で上書きされたキーには * が付く
  • キーをクリックするとポップオーバーが開き、指を選べる
  • 保存 で上書きを確定、全てリセット で全ての上書きを消す(上書きが無いときは無効)。キー個別のポップオーバーにある 推定に戻す はそのキーの上書きだけを消す
  • モーダルを閉じると上書きが即座に反映され、指別打鍵量 / 左右バランス / 段別打鍵量 の全てが再集計される

学習曲線

フィルター行の ビュー学習曲線 に切り替えると、4 連の snapshot ビューが週/月別のトレンドチャートに切り替わる。ビューは日別マトリクス集計を 区間(週 / 月)でバケット化し、各バケットを 3 つのサブスコア + 合成スコアにまとめる:

  • 指の偏り — 10 指の打鍵分布の均等度(1 = 完全均等、0 = 一指集中)
  • 左右バランス — 左右比率が 50 / 50 にどれだけ近いか
  • ホーム行率 — 全打鍵に占めるホーム行の割合

太線は合成 総合 スコア(3 サブスコアの加重平均)、点線は個別サブスコア。上部のサマリカードには直近バケットの総合スコア、過去バケットとの差分、有効バケット数が並ぶ(バケットは打鍵数が最小サンプルしきい値以上で「有効」になる。しきい値未満のバケットも線として表示されるが、ツールチップで「下限未満」と注記される)。

分析 — エルゴノミクス学習曲線

合成スコアは 絶対評価ではなく相対トレンド指標。重みはヒューリスティックで、特に finger stddev はレイアウト依存・ノイズが大きい。点数として読まず「分布が時間とともに改善しているか」を見る指標として使う。

空状態

  • スナップショット無し — ヒートマップと同じメッセージ
  • レイアウト無し — 「このスナップショットにはレイアウト情報がありません。」
  • 活動なし — 「この期間の打鍵データがありません。」
  • データ不足(学習曲線のみ) — 「この期間にはマトリクスの活動が十分にありません。打鍵を増やすか、期間を広げてください。」

バイグラム

バイグラムタブは連続する 2 打鍵 (バイグラム) と、その間隔 (Inter-Key Interval / IKI) を分析する。バイグラムは打鍵時に分単位で集計されるので、選択期間を変えても生イベントの再走査なしに即時表示される。

3 分割レイアウト

ビューは 3 つのクォドラントで構成され、各クォドラントに件数セレクタ (10 / 20 / 30 / … / 100) が付く。バーは recharts でレンダリングされ、ツールチップがカーソル追従する。

クォドラント内容
頻出ペアバイグラムを出現回数で降順ランキング。回数 または 平均間隔 列をクリックして並び替え可能
ペア間隔バイグラムを平均 IKI で降順ランキング (最も遅いペアが上)。回数 / 平均間隔 / p95 間隔 のいずれでも並び替え可能。共通フィルタの 平均間隔 しきい値より速いペアは除外される
Finger IKI(送り指 → 受け指) ペアの平均 IKI バーチャート。左手始まりは青、右手始まりは赤で色分け。同じ 平均間隔 しきい値が適用される
分析 — バイグラム

スナップショット要件

キーマップスナップショットが必要なのは Finger IKI クォドラントだけ。バイグラムペアの数値キーコードを指に解決するためにスナップショットの keymap + layout が要る。頻出ペア / ペア間隔 はペア集計データから直接描画されるためスナップショットなしでも動作する。

共通フィルタ

  • 期間 — 他のタブと同じ From / To ピッカー。期間変更で再集計される
  • デバイスこのデバイス のみ、または同期済みの全デバイス。他のタブと同じ挙動
  • 平均間隔 (ms 以上) — 最小 IKI しきい値。指間隔ペア間隔 の両クォドラントヘッダにそれぞれ入力欄があり、設定値より平均 IKI が小さいペアは両方から除外される。入力欄は両クォドラントで共有される(片方を変更するともう片方の表示も連動して更新される)。0 でフィルタ無効。値はキーボード単位で PipetteSettings に永続化される。比較に使う IKI は histogram bucket center による加重平均の概算値なので、しきい値は「およそ N ms より速いペアは無視する」程度のラフな絞り込みとして使う

空状態

  • データなし — 「この期間のバイグラムデータはまだありません。打鍵を記録してから再度開いてください」 期間内にペア活動が記録されていないとき表示
  • スナップショット無し (Finger IKI のみ) — 「Finger IKI には keymap snapshot が必要です。Record セッションを開始するか snapshot のある期間を選択してください」 他の 2 クォドラントは引き続き表示される
  • しきい値で全件フィルタされた平均間隔 の値が高すぎて生き残るペアが無くなった場合、Finger IKI とペア間隔の両クォドラントが「この期間のバイグラムデータはまだありません」にフォールバックする。しきい値を下げて表示を戻す

アプリ別

アプリ別タブは Typing View で取得したアクティブアプリ名で記録データを集計する。Monitor App を有効化し、アプリ名がタグされた minute が記録されないと表示は空になる。このタブは意図的に アプリフィルタを無視 する(フィルタを掛けるとスライス / バーが 1 つに潰れるため)。

分析 — アプリ別

App Usage Distribution(円)

選択期間中のアプリ別打鍵数シェアをドーナツチャートで表示する。同一 minute 内に複数アプリを観測した場合は Unknown / Mixed、Monitor App 無効時 / Monitor App 導入前の minute は Other スライスに入る。ホバーするとスライス毎の打鍵数とシェア%がツールチップで出る。

WPM by App(横棒)

アプリ別の中央値 WPM を活動シェアで降順ランキングした横棒チャート。最小サンプル閾値を満たさないバーは薄色で表示される。ホバーすると WPM と打鍵数がツールチップで出る。

空状態

  • 「アプリデータがありません — Monitor App を有効にして REC を開始するとチャートに反映されます」アプリタグ付き minute が範囲内に無いとき表示

Layout Comparison

Layout Comparison は、記録した打鍵ログを別レイアウト(Colemak / Dvorak / Colemak DH ほか 30+ 種類)に乗せた場合の指 / 手 / 行の負担分布をシミュレートする。ファームウェアを書き換えずに「もし Colemak だったら」を試算できる。

ピッカー

  • Current layout — 記録イベントを解釈する文字規約。デフォルトは QWERTY。ファームウェアが既に別レイアウトのキーコードを直接出している場合はそれを選ぶ
  • Compare to — シミュレートする比較先レイアウト。選択はキーボードごとに永続化されるので再起動後も同じ比較に戻る

パネル

target を選ぶと 3 つのパネルを 1 画面で同時表示する。サブビュー切替はなく、空間(位置)・指別・数値の 3 視点を一度に並べて読める:

パネル内容
位置の差分(上段、フル幅)物理キー単位の差分をキーボードに塗布。赤系は比較先でアクティビティが増える物理位置、青系は減る位置
指の差分(下段左)指別の符号付き差分バーチャート。赤バーは比較先で負担が増える指、緑バーは減る指
数値表(下段右)各レイアウトを横並びにした share-of-events 表。指の負担(指別)、左右バランス、行分布、ホーム行率
分析 — Layout Comparison 位置差分
分析 — Layout Comparison 指差分
分析 — Layout Comparison 数値表

Skip-rate 警告

比較先で打てない文字(対応するキーが無い、または現在のファームウェアに該当キーコードが割り当たっていない等)はスキップ扱いになる。スキップ率が 5% を超えると注意バナーが表示される。下の数値は参考値として読む。

空状態

  • スナップショット無し — 他のスナップショット必須タブと同じ。期間内に Record セッションを開始すると保存される
  • target 未選択 — 比較レイアウトを選ぶまでヒントだけが出る
  • 取得失敗 — 「レイアウト比較の計算に失敗しました」 リロードまたは期間を狭めて再試行

レイヤー

レイヤータブは使用状況をレイヤーごとに分解する。

表示

  • 打鍵数 — 押下時点でアクティブだったレイヤーを基に集計する。MO / LT / TG などの layer op は押下時のアクティブレイヤーが記録されるので、そのまま反映される。キーマップスナップショット無しでも動作する
分析 — レイヤー打鍵数
  • 起動回数 — 各レイヤーに layer-op キーで「遷移」した回数を集計する。キーマップスナップショットが必須で、layer-op キーコードをターゲットレイヤーに解決する:
    • MO / TG / TO / DF / PDF / OSL / TT — 押下時点でカウント
    • LT / LM — ホールド時のみカウント(LT0(KC_ESC) をタップしただけでは遷移扱いしない)
分析 — レイヤー起動回数

ベース

起動回数モードかつレイヤー数が 2 以上のときだけ表示される。分析元となるレイヤーを選ぶ。選んだレイヤーはバー一覧から除外されるので、「既にいるレイヤーを押し続ける」タイプ(例: ベース = 0 で LT0(KC_ESC) ホールド)が遷移として見えない。

レイヤー名

レイヤーパネル(§2.3 参照)でレイヤーに名前を付けていると、軸ラベルに名前が併記される(例: レイヤー 0 · Base)ため、番号だけでなく名前でも判別できる。

空状態

  • 打鍵数、データなし — 期間中に打鍵が無い
  • 起動回数、データなし — 期間中に layer-op キーが押されていない
  • 起動回数、スナップショット無し — 「レイヤー起動回数の表示にはキーマップスナップショットが必要です。この期間に record を開始すると取得できます。」打鍵数モードはスナップショット無しでも動作する

エクスポート / アップロード

ペインヘッダの エクスポート ボタンでカテゴリ選択モーダルが開き、現在のフィルタ条件下でチャートデータを .csv ファイルとして書き出せる。10 カテゴリを独立して on/off 可能:

  • サマリー — 今日 / 直近 7 日の概要カード
  • WPM — バケット別 WPM 時系列
  • 間隔 — バケット別間隔分位数
  • 活動量 — ビュー設定に応じて 時間×曜日 グリッド or 日セルの集計値
  • アプリ別 — アプリケーション別の内訳
  • ヒートマップ — セル別押下回数(スナップショット必須)
  • エルゴノミクス — 指 / 手 / 段別の集計値(スナップショット必須)
  • バイグラム — 頻出ペア / ペア間隔 / Finger IKI 行
  • レイヤー — レイヤー別打鍵数または起動回数
  • レイアウト比較 — 指 / 段 / 手別の差分(スナップショット必須)

モーダル上部にはアクティブな条件(Device / App / Keymap / Period)が併記され、保存するファイルがどのスライスを切り取ったものか一目で分かる。期間にスナップショットが重ならない場合、ヒートマップ / エルゴノミクス / レイアウト比較は無効化され「snapshot missing」の注記が出る。指割り当ての手動上書きはエルゴノミクス行に併記される。

アップロードモード

保存済みエントリの Hub アクション行(Upload to Hub / Update on Hub)からトリガーすると、同じモーダルが アップロードモード で開く。確認ボタンが Upload または Update に変わり、データは CSV ではなく Pipette Hub に送信される。アップロードモードでは 2 つの追加セレクタが表示される:

  • Layout Comparison ターゲット — インストール済みの Key Labels セットと built-in レイアウトを複数選択可能。Hub 投稿に含めるターゲットレイアウトを選ぶ。ターゲット未選択時は Layout Comparison トグルが無効化される
  • Per-app data — 期間中に観測されたアプリの一覧から複数選択。Hub でアプリ別内訳として含めるアプリを選ぶ

詳細なアップロードフローとバリデーションルールは §7.4 を参照。


2. キーマップエディタ

2.1 画面構成

キーマップエディタはキーボードレイアウト表示とキーコードパレットの 2 つの領域で構成されます。

キーマップエディタ全体
  • 画面上部: キーボードの物理レイアウト (各キーに現在のキーコードを表示)
  • 画面左側: ツールバー (ズーム、Undo/Redo など)
  • 画面下部: キーコードパレット (タブ切替式) とオーバーレイパネルトグル
  • 右側 (展開時): キーコードオーバーレイパネル (ツール、保存、レイアウトオプション)
  • 画面最下部: ステータスバー

2.2 キーの変更方法

  1. キーボードレイアウト上のキーをクリックして選択
  2. キーコードパレットから割り当てたいキーコードをクリック
  3. キーの表示が更新されます
  4. 変更は自動的にキーボードに反映されます
  • Ctrl+クリックで複数のキーを選択できます
  • Shift+クリックで範囲選択ができます
  • Escape キーで全選択を解除します

キーの即時選択 (Instant Key Selection) はキーコード割り当ての動作を制御します:

  • ON (デフォルト): キーコードをシングルクリックすると即座に割り当てが完了し、選択が閉じます。素早い編集に最適です。
  • OFF: シングルクリックでキーコードを選択(ハイライト表示)し、ダブルクリックまたは Enter キーで確定・割り当て。パレット下部にヒントが表示されます。キーコードを確認してから決定したい場合に便利です。

この設定はキーコードオーバーレイパネル (§3.14) でキーボードごとに切り替えでき、グローバルなデフォルトは設定 → デフォルト (§6.1) で設定できます。

2.3 レイヤー切替

キーボードレイアウトの左側にレイヤー切替ボタンがあります。

Layer 0
Layer 1
Layer 2
  • レイヤー番号ボタンをクリックしてレイヤーを切り替えます
  • Layer 0 がデフォルトレイヤーです
  • 利用可能なレイヤー数はキーボードの設定に依存します

レイヤーパネルは折りたたんでスペースを節約できます:

レイヤーパネル 折りたたみ

折りたたみボタン (シェブロン) をクリックしてレイヤーパネルを番号のみに縮小できます。展開ボタンをクリックすると完全なレイヤー名が復元されます。

レイヤーパネル 展開

2.4 キーポップオーバー

キーボードレイアウト上のキーをダブルクリックすると、キーポップオーバーが開きます。パレットをスクロールせずに、素早くキーコードを検索・割り当てできます。

レイヤーサイドバー

キーポップオーバー — レイヤーサイドバー

ポップオーバーの左側に縦並びのレイヤーサイドバーが表示されます。レイヤーパネルのボタンと同じスタイルで、レイヤー番号をクリックするとポップオーバーを閉じずにレイヤーを切り替えられます。レイヤー数がポップオーバーの高さを超える場合、サイドバーは独立してスクロールします。

Key タブ

キーポップオーバー — Key タブ
  • 検索入力には現在のキーコード名がプリセットされます
  • 名前、キーコード名、エイリアスで検索でき、関連度順に結果が表示されます
  • 検索結果をクリックするとすぐに割り当てられます
  • 詳細エディタ (Tap Dance、Combo、Key Override など) のキーフィールドをダブルクリックしても同様にポップオーバーが表示されます

Code タブ

キーポップオーバー — Code タブ
  • 16進数でキーコード値を直接入力できます (例: 0x0029 で Escape)
  • 入力欄の下に対応するキーコード名が表示されます
  • Apply ボタンをクリックして割り当てます

ラッパーモード

ポップオーバー上部のモードボタンで、複合キーコードを構築できます:

キーポップオーバー — Modifier モード
  • Mod Mask: 修飾キーとキーを組み合わせます (例: LSFT(KC_ESCAPE))
  • Mod-Tap: 長押しで修飾キー、タップでキー (例: LSFT_T(KC_ESCAPE))

どちらのモードでも修飾キーチェックボックスが表示され、Left/Right の Ctrl、Shift、Alt、GUI を選択できます。Left と Right の修飾キーは同時に選択できません — 片方を選択するともう片方は無効になります。

キーポップオーバー — LT モード
  • LT: Layer-Tap — 長押しでレイヤーを有効化、タップでキーを送信 (例: LT0(KC_ESCAPE))。レイヤーセレクタが表示され、対象レイヤーを選択できます。
  • SH_T: Swap Hands Tap — 長押しでスワップハンド、タップでキーを送信 (例: SH_T(KC_ESCAPE))
  • LM: Layer-Mod — 修飾キー付きでレイヤーを有効化 (例: LM(0, MOD_LSFT))。レイヤーセレクタと修飾キーチェックボックスの両方が表示されます。

アクティブなモードボタンをクリックするとモードが解除され、基本キーコードに戻ります。

元に戻す / やり直し (Undo / Redo): ポップオーバーのフッターに、コンテキストに応じた UndoRedo ボタンが表示されます。Undo は前のキーコードを表示して元に戻し、Redo は次のキーコードを表示して再適用します。これらのボタンは直近の undo/redo ヒストリーエントリがポップオーバーで開いているキーと一致する場合(直近1件の変更)のみ表示されます。複数ステップのヒストリー操作には、ツールバーボタンまたはキーボードショートカットを使用してください(§4.2 参照)。

キーポップオーバー — Undo キーポップオーバー — Redo

確定: Enter キーで現在の選択を確定してポップオーバーを閉じます。Escape キーを押すか、ポップオーバーの外側をクリックすると変更なしで閉じます。

2.5 レイアウトオプション

一部のキーボードは複数の物理レイアウトに対応しています(例: 分割バックスペース、ISO エンター、ボトムロウの構成変更など)。キーボードにレイアウトオプションがある場合、キーコードパレットのタブバー右端にレイアウトオプションボタン(グリッドアイコン)が表示されます。

レイアウトオプションパネル
  • グリッドアイコンをクリックしてレイアウトオプションパネルを開きます
  • チェックボックスオプション: レイアウトバリアントのオン/オフを切り替えます(例: 「Macro Pad」「Split Backspace」「ISO Enter」)
  • ドロップダウンオプション: 複数のレイアウトバリアントから選択します(例: 「Bottom Section」で Full Grid / Macro Pad / Arrow Keys を選択)
  • 変更は即座に反映されます — 選択したオプションに応じてキーボードレイアウト表示がリアルタイムに更新されます
レイアウトオプション変更後
  • オプションを変更すると、キーボードレイアウト上の表示キーが更新されます
  • レイアウトオプションはキーボードに保存され、セッション間で保持されます
  • パネルの外側をクリックするか Escape キーを押すと閉じます

Note: レイアウトオプションボタンは、複数のレイアウトバリアントが定義されているキーボードでのみ表示されます。固定レイアウトのキーボードにはこのボタンは表示されません。このセクションのスクリーンショットは「JSONファイルから読み込み」機能でダミー JSON 定義を使用して撮影しています。


3. キーコードパレット

画面下部のタブ付きパレットから、各カテゴリのキーコードを選択できます。

3.1 Basic

通常の文字キー、ファンクションキー、修飾キー、ナビゲーションキーなどの基本キーコードです。Basic タブは 4 つのビュータイプに対応しており、Basic タブ下部のビューセレクターから切り替えできます:

ANSI キーボードビュー (デフォルト)

Basic タブ — ANSI ビュー

キーコードを ANSI キーボードレイアウトとして表示します。ビジュアルキーボード上のキーをクリックして割り当てます。

ISO キーボードビュー

Basic タブ — ISO ビュー

ISO 固有のキーを含む ISO キーボードレイアウトとして表示します。

JIS キーボードビュー

Basic タブ — JIS ビュー

JIS 固有のキー (円記号、Ro、変換、無変換、カタカナ/ひらがな) を含む JIS キーボードレイアウトとして表示します。

リストビュー

Basic タブ — リストビュー

従来のスクロール可能なリスト形式でキーコードを表示します。

全ビュー共通:

  • 文字キー (A-Z, 0-9, 記号)
  • ファンクションキー (F1-F24)
  • 編集キー (Enter, Tab, Backspace, Delete)
  • ナビゲーションキー (矢印, Home, End, PageUp/Down)
  • テンキー
  • International キー (KC_INT1〜KC_INT5)
  • Language キー (KC_LANG1〜KC_LANG5)

3.2 Layers

レイヤー操作用のキーコードです。

Layers タブ
  • MO(n): 押している間だけレイヤー n に切り替え
  • DF(n): デフォルトレイヤーを n に変更
  • TG(n): レイヤー n をトグル
  • LT(n, kc): 長押しでレイヤー、タップでキーコード
  • OSL(n): 次のキー入力のみレイヤー n を有効化
  • TO(n): レイヤー n に切り替え

3.3 Modifiers

修飾キーの組み合わせやタップ時の動作を設定するキーコードです。

Modifiers タブ
  • One-Shot Modifier (OSM): 次のキー入力のみ修飾キーを有効化
  • Mod-Tap: 長押しで修飾キー、タップで通常キー
  • Mod Mask: 修飾キーの組み合わせ

3.4 System

マウス制御、メディア再生、システムユーティリティ、オーディオ/ハプティックフィードバック用のキーコードです。

System タブ
  • Mouse: マウスボタン・移動・スクロール
  • Joystick: ジョイスティックの軸とボタンのキーコード
  • Audio: オーディオ切り替え・制御キーコード
  • Haptic: ハプティックフィードバック切り替え・制御キーコード
  • Media Playback: 再生/停止/音量/トラック制御
  • Locking Keys: Locking Caps Lock、Num Lock、Scroll Lock
  • App / Browser: アプリケーション起動・ブラウザナビゲーションキー
  • System Control: システム電源、スリープ、ウェイク
  • Boot: ブートローダーモード (QK_BOOT)

Note: MIDI タブは MIDI 対応キーボードでのみ表示されます。表示される場合、System と Lighting の間に配置されます。

3.5 Lighting

バックライトと RGB ライティング制御のキーコードです。

Lighting タブ
  • RGB Matrix 制御
  • RGB Lighting 制御
  • バックライト制御
  • LED Matrix 制御

3.6 Tap-Hold / Tap Dance

タップとホールドで異なる動作を割り当てるキーコードです。

Tap-Hold / Tap Dance タブ

Tap Dance セクションは全エントリを一覧表示するタイルグリッドプレビューを備えています:

Tap Dance タイルグリッド
  • 各タイルにはエントリ番号と設定済みアクションの概要が表示されます
  • 設定済みエントリはタップ/ホールドアクションを表示し、未設定タイルは番号のみ表示
  • タイルをクリックして対応するエントリの Tap Dance 編集モーダルを直接開きます
  • 各エントリにタップ・ホールド・ダブルタップなどの動作を設定できます
  • 下部の Edit JSON ボタンで全エントリを JSON として一括編集できます (§5.6)

3.7 Macro

マクロキーコードです。

Macro タブ

Macro セクションは全エントリを一覧表示するタイルグリッドプレビューを備えています:

Macro タイルグリッド
  • 各タイルにはマクロ番号と記録されたシーケンスのプレビューが表示されます
  • 設定済みエントリはキーアクションの概要を表示し、未設定タイルは番号のみ表示
  • タイルをクリックして対応するエントリの Macro 編集モーダルを直接開きます
  • キー入力のシーケンスをマクロとして登録できます
  • 下部の Edit JSON ボタンで全エントリを JSON として一括編集できます (§5.6)

Macro 編集モーダル — リストモードと編集モード

マクロアクションを開くと、Macro モーダルの同じ行が 2 つの表示モードを持ちます:

  • リストモード(デフォルト): アクションのキーコードはクリック可能なタイルとして表示され、末尾に点線の 追加スロットが続きます。キーコードタイルを単クリックするとその位置が編集モードに切り替わります。点線スロットを単クリックで選択、ダブルクリックで空クエリのキーコードポップオーバーが開きます(キーマップエディタと同じ挙動)。以前の鉛筆「編集」アイコンは廃止され、クリックだけが操作手段です
  • 編集モード: キーコードピッカーが行の下に常時表示されます。各キーコードタイルにはホバー時の × 削除ボタンが表示され、Tap 行には編集モードを抜ける Close ボタンが表示されます。ピッカーやキーコードポップオーバーでの選択は ステージング され、行の見た目は更新されますが、下部の Save ボタンまたは Enter キーを押すまではコミットされません。フッターには、既存アクションを編集中のときのみ Revert ConfirmButton が追加表示されます(Add Action で新しく追加したアクションを編集している場合は、戻す先がないため Revert は非表示)。Save と Revert は、ピックによって実際に変更が生じるまでは disabled です。Escape・行の Close ボタン・Revert・ピッカー / アクションリスト / フッター / キーポップオーバー以外をクリックすると、Add keycode で追加したスロットや新規追加アクション丸ごとまで含めて in-flight 編集をすべてロールバック し、編集モードを抜けます。編集中にスロットを削除した場合は、セッションを抜けずに選択位置をずらして編集を継続します。

編集中に空のキーコードアクションは許容されますが、保存・お気に入りエクスポート時に自動的に正規化され取り除かれます。

記録中のロック

組み込みレコーダーがキーストロークを記録中は、誤編集を防ぐために Macro モーダルが強制的に無効化状態になります:

  • Add Action セレクト、Text Editor トグル、Clear、Revert、下部の Save ボタンがすべて disabled
  • 既存の MacroActionItem と KeycodeField は native disabled 属性で無効化され、Tab / hover / クリックが全て抑制されます
  • インラインお気に入りパネルは幅を保ったまま非表示になり、レイアウトが跳ねません
  • モーダル右上の Close ボタンと背景クリックは無効です。記録を止めるまでモーダルは閉じられません
  • リストモード用フッターの Clear / Revert / Save は記録中も表示されますが disabled になります。編集モード中はリストモード用の Clear / Revert は非表示ですが、編集モード用の Save(および既存編集時の Revert)は disabled 状態でそのまま表示されます

3.8 Combo

同時押しキーの組み合わせ用キーコードです。

Combo タブ

Combo タブは全エントリを一覧表示するタイルグリッドプレビューを備えています。「これらの機能はキーボード全体に適用されます(現在のレイヤーだけではありません)」という注記が表示されます。

  • 各タイルには Combo 番号とサマリー(例: 「A + B → C」)が表示されます
  • タイルをクリックして対応するエントリの Combo 編集モーダルを直接開きます (§5.2)
  • Combo キーコード (CMB_000〜CMB_031) をキーに割り当てて Combo をトリガーできます
  • 下部の Settings: Configuration ボタンから Combo タイムアウト設定モーダル(例: Combo time out period)を開けます
  • 下部の Edit JSON ボタンで全エントリを JSON として一括編集できます (§5.6)

3.9 Key Override

特定の修飾キーを押している時にキー出力を置き換えるキーコードです。

Key Override タブ

Key Override タブは全エントリを一覧表示するタイルグリッドプレビューと設定エリアを備えています。

  • 各タイルにはオーバーライド番号とサマリーが表示されます
  • タイルをクリックして対応するエントリの Key Override 編集モーダルを直接開きます (§5.3)
  • 下部の Edit JSON ボタンで全エントリを JSON として一括編集できます (§5.6)

3.10 Alt Repeat Key

コンテキスト対応の代替リピートキーバインディング用キーコードです。

Alt Repeat Key タブ

Alt Repeat Key タブは全エントリを一覧表示するタイルグリッドプレビューと設定エリアを備えています。

  • 各タイルにはエントリ番号とサマリーが表示されます
  • タイルをクリックして対応するエントリの Alt Repeat Key 編集モーダルを直接開きます (§5.4)
  • 下部の Edit JSON ボタンで全エントリを JSON として一括編集できます (§5.6)

3.11 Behavior

QMK の高度な動作機能用のキーコードです。

  • Magic: キーボード動作のスワップやトグル用 Magic キーコード
  • Mode: NKRO トグル、モード切替キーコード
  • Auto Shift: Auto Shift のトグルと設定キーコード
  • Swap Hands: Swap Hands キーコードと Swap Hands Tap バリアント
  • Caps Word: Caps Word トグル

3.12 User

ユーザー定義キーコードです。

User タブ
  • ファームウェアで定義されたカスタムキーコード(例: CUSTOM_1CUSTOM_2
  • keymap.c エクスポート時、カスタムキーコードは汎用の USER00/USER01 ではなく設定された名前で出力され、enum custom_keycodes ブロックが自動生成されます

3.13 Keyboard(デバイスピッカー)

Keyboard タブでは、他の接続中キーボードや保存済みファイルからキーコードをコピーできます。

使用例: キーボードの編集中に、手元にない別のキーボードのキーマップが気になった場合。あらかじめデータを保存しておけば、このタブの File ソースから呼び出してキーマップを確認し、キーコードをそのままコピーできます。

デバイスリスト

Keyboard タブ — デバイスリスト

Keyboard タブを開くと、接続中の Vial 対応キーボードの一覧が表示されます。デバイスの抜き差しはリアルタイムで反映されます。

  • デバイスをクリックするとキーマップが読み込まれます。接続中のキーボードは即座に表示、それ以外は一時的な USB 接続でプローブされます
Keyboard タブ — キーマップ表示
  • 表示されたキーボードのキーをクリックすると、メインキーマップの選択中キーにそのキーコードが割り当てられます
  • Ctrl+クリックで複数選択、Shift+クリックで範囲選択
  • 右下のレイヤーボタンでレイヤーを切り替え
  • ズームコントロール(+ / 数値入力 / −)でピッカーキーボードのサイズを調整 (30%〜200%)。別のキーボードを表示する場合、保存済みズームレベルが自動で読み込まれます
  • Escape で選択を解除

ファイルソース

下部の File ボタンをクリックするとファイルソースに切り替わります。保存済みキーボードスナップショットの閲覧や .pipette ファイルの読み込みが可能で、同じキーコードピッキング操作が使えます。

注意: キーピッカーでは V2 形式(undefined)ファイルのみ対応しています。レガシー V1 形式のファイルを選択すると、キーボードを接続してキーマップを開きデータを移行するよう警告が表示されます。

複合キーコード

ピッカーで複合キー(例: LT1(KC_SPC))をクリックすると、フルキーコードがそのまま割り当てられます。インナー/アウターの分割は行われず、完全なキーコードがコピーされます。

注意: マスクキーのインナー部分を編集中(例: undefined の undefined を選択中)は Keyboard タブは非表示になります。複合キーコードをインナーバイトに割り当てることはできないためです。

3.14 キーコードオーバーレイパネル

キーコードオーバーレイパネルはエディタツールと保存機能への素早いアクセスを提供します。キーコードタブバー右端のパネルボタンでトグルします。

Settings タブ

オーバーレイパネル — Settings
  • Key Editor Zoom: キーエディタ画面のみに適用される UI 表示倍率(50–200%)。未設定時はグローバル UI ズーム (§6.5) が使用されます。キーボード単位で保存・同期されます
  • Auto Advance: キーコード割り当て後に次のキーへ自動移動する機能の切替
  • Instant Key Selection: キーの即時選択モードの切替 (動作の詳細は §2.2 参照)
  • キーピッカーでShiftキーを分離: 複合キーコードの分割表示を切替 (例: Mod-Tap を 2 つに分けて表示)
  • Key Tester: Matrix Tester モードの切替 (対応キーボードのみ)
  • Security: ロック状態 (Locked/Unlocked) の表示と Lock ボタン
  • Import: .vil ファイルからの復元、またはカスタム JSON 定義のサイドロード
  • Reset Keyboard Data: キーボードを初期状態に戻す

Save タブ

オーバーレイパネル — Save
  • Export Current State: キーマップを .vilkeymap.c、PDF キーマップチートシート、PDF レイアウトエクスポート(キーアウトラインと Tap Dance・Macro・Combo・Key Override・Alt Repeat Key のサマリーページ付き)としてダウンロード
  • Save Current State: 現在のキーボード状態をラベル付きで保存
  • Synced Data: 保存済みスナップショットの一覧。Load・Rename・Delete・Export の操作が可能
  • エディタ設定パネル (§6) と同じ Save パネルです

Layout タブ (利用可能時)

一部のキーボードはレイアウトオプションに対応しています (§2.5 参照)。対応キーボードでは Layout タブがオーバーレイパネルの最初のタブとして表示され、同じレイアウトオプションにアクセスできます。


4. ツールバー

キーマップエディタ左側のツールバーには以下の機能があります。

ツールバー

4.1 ズーム

キーボードレイアウトの表示倍率を変更します。範囲: 30%〜200% (デフォルト 100%)。

ズームイン
  • (+) ボタンでズームイン
  • (-) ボタンでズームアウト
  • エディタ設定でも調整可能です
  • ズームレベルはキーボード毎に保存され、再接続時に自動で復元されます

4.2 元に戻す / やり直し (Undo / Redo) — キーマップヒストリー

キーマップエディタはキーコードの変更履歴(ヒストリー)を自動的に記録します。このヒストリーを遡って変更の取り消し(Undo)や、やり直し(Redo)が可能です。

操作方法対象範囲使い方
キーボードショートカットヒストリー全体(最大値は Max Keymap History、デフォルト 100)Ctrl/Cmd+Z (Undo), Ctrl+Y / Ctrl/Cmd+Shift+Z (Redo)
ツールバーボタンヒストリー全体左ツールバーの Undo / Redo ボタン
ポップオーバーボタン直近1件の変更のみ(開いているキーと一致する場合)ポップオーバーフッターの Undo / Redo ボタン(§2.4 参照)
  • ヒストリーはキーボード切替時または切断時にクリアされます
  • 最大保持数は設定 → デフォルト → Max Keymap History で変更可能です(§6.1 参照)
  • すべてのキーマップ変更パスが追跡対象: 単一キー編集、ポップオーバー選択、Mod Mask 変更、貼り付け、レイヤーコピー

4.3 タイピングテスト

タイピング練習機能です。現在のキーマップでタイピングテストを行えます。テスト中はキーボードレイアウトが下部に表示され、キー入力がリアルタイムでハイライトされるため、物理キーマップと画面表示の一致を確認できます。

ステータスバーの Typing Test ボタンをクリックしてテストモードに入ります。

モード

上部のモードタブから 3 つのテストモードを選択できます:

Words モード

タイピングテスト — Words モード
  • 固定数のランダムな単語をタイプ (15 / 30 / 60 / 120 語)
  • 全ての単語を入力すると終了

Time モード

タイピングテスト — Time モード
  • 制限時間内にできるだけ多くの単語をタイプ (15 / 30 / 60 / 120 秒)
  • 残り時間がカウントダウンで表示

Quote モード

タイピングテスト — Quote モード
  • 実際の引用文をタイプ (short / medium / long / all)
  • 完了後に引用元が表示

オプション

タイピングテスト — オプション付き

Words モードと Time モードでは追加オプションを切り替えできます:

  • Punctuation: 句読点(カンマ、ピリオドなど)を単語リストに追加
  • Numbers: 数字を単語リストに追加

Quote モードではこれらのトグルは利用できません(原文がそのまま使用されます)。

テスト中

タイピングテスト — タイピング中

タイピング中は以下の統計情報がリアルタイムで表示されます:

  • WPM: Words Per Minute(現在のタイピング速度)
  • Accuracy: 正確に入力された文字の割合
  • Time: 経過時間(Time モードでは残り時間)
  • Words: 現在の単語 / 総単語数

正しく入力された単語は緑色に変わります。誤った文字は赤色でアンダーライン表示されます。カーソルは入力に応じて進み、単語は自動的にスクロールします。

  • リスタートボタン (↺) を押すといつでもテストを再開できます
  • Escape キーでタイピングテストモードを終了します
  • タイピングテスト中はステータスバーの Disconnect ボタンが非表示になります。切断するには Escape キーか Typing Test ボタンで先にエディタに戻ってから切断してください
  • テスト領域下部のキーボードレイアウトは、Vial マトリクステスタープロトコルを通じてキー入力をリアルタイムで表示します

Typing View(ビューオンリーモード)

Typing View はキーボードレイアウトのみをコンパクトなリサイズ可能ウィンドウに表示します。他のアプリケーションの上に重ねて練習するのに最適です。

ステータスバーの Typing View ボタン(タイピングテスト非アクティブ時に表示)をクリックしてビューオンリーモードに入ります。

ビューオンリー — コンパクトウィンドウ
  • キーボードレイアウトのみが表示され、キー入力がリアルタイムでハイライトされます
  • ツールバー、キーコードパレット、タイピングテスト UI、ステータスバーは非表示になります
  • ウィンドウはリサイズ時にアスペクト比を維持します

メニューペイン

ビューオンリー — コントロール

キーボードエリアの任意の場所をクリックするとメニューペイン(右下ポップアップ)が開閉します。ペイン上部は WindowREC の 2 タブに分かれており、下部に Base レイヤー選択と タイピングビュー終了 が両タブ共通で並びます。

Window タブ(デフォルト)

  • 初期サイズ: ウィンドウをデフォルトの計算されたサイズにリセット
  • フィット: アスペクト比を維持しながら、ウィンドウの高さを現在の幅に合わせて調整
  • 最前面: ウィンドウを常に最前面に表示(Wayland では利用不可)

REC タブ

録画コントロールと Monitor App トグル。詳細は下の タイピング分析の記録 を参照。

共通コントロール(両タブで表示)

  • Base: 表示するレイヤーを選択(複数レイヤーがある場合)
  • タイピングビュー終了: フルエディタに戻る

Escape キーを押すかキーボードエリアを再度クリックするとペインが閉じます。ウィンドウにマウスを乗せるとヒントテキストが下部に表示されます。ウィンドウサイズ、最前面表示の設定、現在のメニュータブはキーボードごとに保存されます。

注意: Typing View モード中はオートロックが停止されます。ビューオンリーモード中にキーボードが切断された場合、ウィンドウは自動的に通常サイズに復元されます。

タイピング分析の記録

Typing View を開いている間、メニューペインの REC タブからキーごとと 1 分ごとの統計を記録できる。記録結果は分析ページ(§1.4)に流れる。デフォルトはオフ。

タイピングテスト — REC タブ

開始 / 停止

トグルをクリックすると記録の開始 / 停止が切り替わる。ボタンは待機中は 開始、記録中は 停止 と表示される。記録中は Typing View 上部に「記録中」インジケータが表示され、データが捕捉されているかがひと目で分かる。

最初に 開始 を押したときは、規約モーダルが表示される:

タイピングテスト — 記録の同意
セクション項目
収集する情報1 分単位の文字頻度・キー押下回数(row / col / layer / keycode、tap / hold 別)・タイピング速度の分布(interval パーセンタイル)・アクティブなアプリケーション名(Monitor App ON 時のみ。1 分内に複数アプリを観測した場合は不明として記録)
収集しない情報個別の打鍵タイミング・入力テキスト / パスワード / 特定の単語・ウィンドウタイトル / URL / ファイルパス

有効化 で同意し記録を開始する。同意はアプリ設定に保存され(同期対象外)、以降このダイアログは表示されない。キャンセル で開始をやめると、再度 開始 を押したときにダイアログが再表示される。

Monitor App

Monitor App トグルが ON で、かつ REC が 停止(記録中)状態のとき、Pipette は flush ごとに 1 回だけアクティブなアプリ名を解決して各 1 分にタグ付けする。1 分内に単一アプリのみ観測した minute はそのアプリ名でタグされ、複数アプリを観測した minute は Unknown / Mixed とタグされる。タグは分析の アプリ フィルタと アプリ別 タブの基礎データになる。

  • REC が 開始(記録未スタート)状態のときはトグルが薄く表示される。REC を先に開始する流れに UI を寄せている
  • on/off 状態は AppConfig で管理(このマシン限定)。他のマシンには同期 されない
  • Linux / Wayland: FocusedWindow GNOME Shell 拡張が必要(README 参照)。未導入だと毎分 null で記録される
  • macOS: アクセシビリティ権限が必要(README 参照)。未付与だと毎分 null で記録される
  • Monitor App をオフにしても既存タグはデータベースに残る。オフにした後の minute だけがタグなしになる

View Analytics

そのキーボードの分析ページに直接ジャンプする。記録したストリームを即確認できる。戻ると Typing View に戻る。

表示モードの記憶と自動復元

キーボードごとに最後の表示モード(Editor / Typing Test / Typing View)が記憶され、次回同じキーボードに接続したときに自動で復元されます:

  • Editor: そのままエディタ画面を表示します
  • Typing Test: 自動的にタイピングテストモードに遷移します。キーボードがロックされている場合は Unlock ダイアログが表示され、解除後にテストへ入ります
  • Typing View: 自動的にコンパクトウィンドウのビューオンリーモードに遷移します。キーボードがロックされている場合は Unlock ダイアログを経由します

表示モードはキーボードレイアウト、ズーム倍率、ウィンドウサイズなどと同様にキーボードごとに保存され、Pipette Hub 同期を有効にしている場合は他の端末にも同期されます(§7 参照)。


5. 詳細設定エディタ

各キーコードタブから詳細設定モーダルを開けます。Lighting はタブ下部の Settings: Configuration ボタンから、Combo・Key Override・Alt Repeat Key の詳細エディタはそれぞれのタブでエントリをクリックして開きます。

5.1 ライティング設定

Lighting タブの Settings: Configuration ボタンから開きます。RGB ライティングの色やエフェクトを設定できます。

ライティング設定
  • HSV カラーピッカーで色を選択
  • プリセットパレットから色を選択
  • エフェクトとスピードを調整
  • Save ボタンで保存

5.2 Combo

複数キーの同時押しで別のキーを発動させる設定です。Combo タブにインラインタイルグリッドが表示され、エントリをクリックすると詳細エディタモーダルが直接開きます。

タイルグリッド (Combo タブ)

Combo 一覧

Combo タブに番号付きリスト (0--31) が表示されます。設定済みエントリはサマリー表示(例: 「A + B → C」)。エントリをクリックして詳細エディタへ。Combo キーコード (Combo On, Combo Off, Combo Toggle) がリストの下に表示されます。下部の Settings: Configuration ボタンから QMK の Combo タイムアウト設定モーダル(例: Combo time out period)を開けます。

詳細エディタ

Combo 詳細
  • 左パネル: Combo エディタ (Key 1--4, Output フィールド)。
  • 右パネル: インラインお気に入りパネル (Save Current State / Synced Data / Import / Export All)
  • Clear ボタンで全フィールドをリセット (2段階確認付き)
  • Revert で最後に保存した状態に復元 (2段階確認付き)
  • Save ボタンで変更をキーボードに書き込み

5.3 Key Override

特定のキー入力を別のキーに置き換える設定です。Key Override タブにインラインタイルグリッドが表示され、エントリをクリックすると詳細エディタモーダルが直接開きます。

タイルグリッド (Key Override タブ)

Key Override 一覧

番号付きリストが表示されます。設定済みエントリはサマリー表示。エントリをクリックして詳細エディタへ。

詳細エディタ

Key Override 詳細
  • 左パネル: トリガーキーと置換キーの設定、有効/無効トグル、レイヤーと修飾キー条件
  • 右パネル: インラインお気に入りパネル (Save Current State / Synced Data / Import / Export All)
  • Clear ボタンで全フィールドをリセット (2段階確認付き)
  • Revert で最後に保存した状態に復元 (2段階確認付き)
  • Save ボタンで変更をキーボードに書き込み

5.4 Alt Repeat Key

Repeat Key の代替動作を設定します。Alt Repeat Key タブにインラインタイルグリッドが表示され、エントリをクリックすると詳細エディタモーダルが直接開きます。

タイルグリッド (Alt Repeat Key タブ)

Alt Repeat Key 一覧

番号付きリストが表示されます。設定済みエントリはサマリー表示。エントリをクリックして詳細エディタへ。

詳細エディタ

Alt Repeat Key 詳細
  • 左パネル: Last Key、Alt Key、有効/無効トグル、Allowed Mods、Options (DefaultToThisAltKey, Bidirectional, IgnoreModHandedness)
  • 右パネル: インラインお気に入りパネル (Save Current State / Synced Data / Import / Export All)
  • Clear ボタンで全フィールドをリセット (2段階確認付き)
  • Revert で最後に保存した状態に復元 (2段階確認付き)
  • Save ボタンで変更をキーボードに書き込み

5.5 お気に入り (Favorites)

各エディタモーダル (Tap Dance、Macro、Combo、Key Override、Alt Repeat Key) には、エディタの右側にインラインお気に入りパネルがあります。

インラインお気に入りパネル

インラインお気に入りパネルの機能:

  • Save Current State: ラベルを入力して Save をクリックすると、現在のエントリ設定が保存されます
    • Import / Export ボタン: .pipette-fav ファイルをインポートして現在のエントリに適用、または現在のエントリ設定をストアに保存せずに .pipette-fav ファイルとしてエクスポートできます。各操作後に「Imported」/「Exported」のインラインフィードバックが表示されます。
  • Synced Data: 保存済みのエントリが一覧表示され、Load・Rename・Delete・Export の操作が可能
  • Import / Export All: フッターのボタンでファイルからのインポートや全エントリの一括エクスポートが可能

Synced Data リスト内:

  • Load: 保存した設定を現在のエントリに適用
  • Rename: 保存したエントリのラベルを変更(Hub にアップロード済みの場合、Hub 上のタイトルも同期されます)
  • Delete: 保存したエントリを削除
  • Export: 個別の保存済みエントリをファイルとしてダウンロード

Pipette Hub 接続時は、各エントリに Hub アクションも表示されます:

インラインお気に入り — Hub アクション
  • Upload to Hub: お気に入りエントリを Pipette Hub にフィーチャー投稿としてアップロード
  • Update on Hub: 最新の設定で Hub 上の投稿を更新
  • Remove from Hub: Hub からエントリを削除(2段階確認付き)
  • Open in Browser: Hub の個別投稿ページをブラウザで開く

5.6 JSON エディタ

各機能タブ (Tap Dance、Macro、Combo、Key Override、Alt Repeat Key) の下部にある Edit JSON ボタンをクリックすると、全エントリを生の JSON テキストとして一括編集できる JSON エディタモーダルが開きます。

JSON エディタ — Tap Dance
  • テキストエリア: 全エントリを JSON 配列として編集。変更はリアルタイムでバリデーションされ、パースエラーはエディタ下部に表示
  • Export (左): 現在の JSON を .pipette-fav ファイルとして保存(バックアップや共有用)
  • Cancel (右): 保存せずに閉じる
  • Save (右): パースされた JSON を適用してキーボードに書き込む
JSON エディタ — Macro

Macro の場合、変更を保存するにはキーボードのアンロックが必要という警告が表示されます。

Note: JSON エディタは全エントリを一度に変更します。不正な JSON は拒否されますが、値が正しくない有効な JSON は予期しない動作を引き起こす可能性があるため注意してください。

Note: お気に入りは特定のキーボードに依存しません。保存したエントリは互換性のある別のキーボードでも読み込めます。クラウド同期を有効にすると、複数デバイス間でも同期されます (§6.1 参照)。お気に入りはデバイス選択画面のデータパネルからも管理できます (§1.3 参照)。


6. エディタ設定パネル

キーコードタブバーの保存ボタン (フロッピーディスクアイコン)、またはキーコードオーバーレイパネルの Save タブ (§3.14) からエディタ設定パネルを開けます。

エディタ設定 — Save

エディタ設定パネルは単一の Save パネルを提供します:

  • Export Current State: キーマップを .vilkeymap.c、PDF キーマップチートシート、PDF レイアウトエクスポート(キーアウトラインと Tap Dance・Macro・Combo・Key Override・Alt Repeat Key のサマリーページ付き)としてダウンロード。エクスポート成功時に「Exported」のインラインフィードバックが表示されます。
  • Save Current State: 現在のキーボード状態をラベル付きで保存します。Label フィールドに名前を入力して Save をクリックします。Label が空の場合は Save ボタンが無効になります。保存したスナップショットは下の Synced Data リストに表示され、読み込みや削除ができます
  • Synced Data: 保存済みスナップショットの一覧。クリックで読み込み・名前変更・削除
  • キーボードデータリセット: キーボードを初期状態に戻す (要注意)

Note: ツール設定 (Auto Advance、Key Tester、セキュリティ) はキーコードオーバーレイパネル (§3.14) にあります。キーボードレイアウトはステータスバーのクイック設定 (§9) から変更できます。Basic タブのビュータイプは Basic タブ下部のセレクターで切り替えます。ズームはツールバー (§4.1) で操作できます。レイヤー設定はエディタ左側のレイヤーパネルから直接管理します。

6.1 クラウド同期 (Google Drive appDataFolder)

Pipette は保存したスナップショット、お気に入り、キーボードごとの設定を Google Drive 経由で複数デバイス間で同期できます。

同期はデバイス選択画面の 設定 モーダル (歯車アイコン) の データ タブで設定します:

データタブ

データタブには Google アカウント、データ同期、Pipette Hub の各セクションがあります。トラブルシューティングやデータ管理の追加機能は、データパネル (§1.3) で提供されます。

Google アカウント

  • Connect をクリックして Google アカウントでサインイン
  • Disconnect をクリックしてサインアウト。Pipette Hub も接続中の場合は、Hub も切断される旨の警告が表示されます

同期暗号化パスワード

  • 同期データを暗号化するためのパスワードを設定します (必須)。強度インジケーターで安全なパスワードを選択できます
  • 別のデバイスで既にパスワードが設定されている場合は、同じパスワードを入力するようヒントが表示されます
  • パスワード変更: Change Password をクリックすると、全ての同期ファイルが新しいパスワードで再暗号化されます。データは削除されず、既存ファイルがその場で復号・再暗号化されます

パスワード変更時のエラー

パスワード変更を実行できないとき、Pipette は生のエラーではなくローカライズされたメッセージを表示します。主な条件を以下に示しますが、これ以外にもネットワークや Drive 由来のエラーがそのまま表示される場合があります。

認証情報の失敗(この 5 種類は同期準備に使われる SyncCredentialFailureReason と同じ集合 — ただし 同期ステータス に露出するのは 3 種類のみ):

理由表示メッセージ発生条件
unauthenticated「パスワードを変更する前に Google にサインインしてください。」Google にサインインしていない
noPasswordFile「保存済みパスワードがありません。先にパスワードを設定してください。」ローカルに同期パスワードが未設定
decryptFailed「既存パスワードを読み出せませんでした (OS キーチェーンに拒否されました)。」OS キーチェーンのエントリが読めない(キーチェーンリセット・プロファイル移動など)
keystoreUnavailable「OS キーチェーンが利用できないため、ここではパスワードを変更できません。」safeStorage.isEncryptionAvailable() が false を返す(キーリングなしの Linux ヘッドレス環境など)
remoteCheckFailed「現在のパスワードを検証するための Google Drive 接続に失敗しました。」ネットワークや Drive の障害 — 時間を置いて再試行

操作上のエラー(理由コードは介さずメッセージが直接表示される):

表示メッセージ発生条件
「同期実行中のためパスワードを変更できません。」同期が実行中 — 完了を待つ
「現在と同じパスワードには変更できません。」新しいパスワードが現在のパスワードと同じ
「復号できないファイルがあります。先に復号できないファイルをスキャンして削除してください。」Drive に現在のパスワードで復号できないファイルがある — 先に復号不能ファイルで整理
「同期パスワードが一致しません。暗号化パスワードを確認してください。」現在のパスワードでリモートのパスワードチェックが復号できない — 入力中のパスワードを再確認

同期コントロール

  • Auto Sync: 自動同期のオン/オフを切り替え。有効時は変更が 10 秒のデバウンスで自動同期され、3 分間隔のポーリングも行われます
  • Sync: お気に入りと接続中のキーボードデータを手動で同期します。全キーボードではなく、お気に入りと現在接続中のキーボードのみが同期対象です

同期ステータス

  • 同期ユニット名とアイテムカウンター (current / total) で同期進捗を表示
  • 同期ユニットが失敗した場合はエラーや部分同期の詳細が表示されます

準備未完了の理由 (Readiness reasons)

同期クライアントが準備できていない場合、「未同期」の汎用メッセージではなく具体的な理由が表示されます。ここに出るのは 3 種類のみで、キーチェーン固有の失敗 (decryptFailed, keystoreUnavailable) はパスワード設定・変更フロー側に表示されます。

理由表示メッセージ
unauthenticated「Google にサインインして同期を開始してください。」
noPasswordFile「同期パスワードを設定してください。」
remoteCheckFailed「Google Drive に接続できません — 同期を一時停止しています。」

復号不能ファイル

  • 現在のパスワードで復号できない、またはその他の理由で読み取れないファイル(例: 以前のパスワードで暗号化されたファイル)
  • Scan をクリックして復号不能ファイルを検出し、削除対象を選択して Delete Selected で Google Drive から完全に削除

同期不可アラート

  • 同期バックエンドに接続できない場合に表示されます。Retry をクリックして再接続を試行

データの保存先

同期データは Google Drive appDataFolder に保存されます。これは Pipette のみがアクセスできる非表示のアプリ専用フォルダです。個人の Drive ファイルには一切アクセスしません。

詳細は Data Guide を参照してください。

データ管理

トラブルシューティングとデータ管理機能はデータパネルで提供されます (§1.3 参照):

  • Local > Application: ローカルデータのインポート/エクスポート、またはリセット対象の選択(キーボードデータ、お気に入り、アプリ設定)
  • Sync: リモートのみのキーボードを実名で一覧表示し、クリックで個別にダウンロード可能 (§1.3 参照)。復号不能な暗号化ファイルの削除は、上記の復号不能ファイルセクションを使用

設定 — デフォルト

設定 — デフォルト

設定モーダルの Tools タブには、新しいキーボード接続時の初期設定を行うデフォルトセクションがあります:

  • Keyboard Layout: 新しいキーボード接続時に使用する Key Labels のデフォルト。ドロップダウンには Key Labels ストア (§6.2) に現在インストールされているエントリだけが表示されます。QWERTY のみ built-in で、それ以外は Pipette Hub からダウンロードするか、ローカル .json を import してください。Key Labels Manage モーダルで設定したドラッグ順がそのままドロップダウンの並び順になります
  • Auto Advance: デフォルトの自動移動動作
  • Instant Key Selection: デフォルトのキーの即時選択動作 (§2.2 参照)
  • Layer Panel Open: レイヤーパネルを展開または折りたたんだ状態で開始するか
  • Basic View Type: Basic タブのデフォルトビュータイプ (ANSI/ISO/JIS/List)
  • キーピッカーでShiftキーを分離: デフォルトのキーピッカーでのShift分離設定
  • Max Keymap History: 接続中のキーボードの編集ヒストリーに保持する変更の最大数(デフォルト: 100)。ヒストリーは切断やキーボード切替でクリアされます。詳細は §4.2 を参照。

6.2 Key Labels Manage

Tools タブには Language Packs 行の隣に Key Labels Manage 行があります。Edit をクリックすると Key Labels モーダルが開き、エディタ・分析ビュー・Layout Comparison でキーキャップ表示に使うラベルセットを管理できます。

QWERTY は built-in です。それ以外のラベルセット (Dvorak, Colemak, French, Brazilian など) は Pipette Hub からダウンロードするか、ローカル .json を import して追加します。インストール済みエントリは Cloud Sync を経由して全デバイスで共有されるため、同じアカウントで signed in している全マシンで同じ並び順・選択状態が再現されます。

Installed タブ

Key Labels — Installed

このマシンにあるラベルセットの一覧。各行にラベル名、アップローダー名 (Hub 由来の場合)、Hub 側の最終更新日時 (YYYY-MM-DD HH:mm、Hub サイト表示と一致)、.json エクスポートショートカット、Delete ボタンが表示されます。左端のグリップをドラッグすると並び替えでき、その順序が Settings ドロップダウンとエディタ内の各 Key Labels ピッカーへ反映されます。

各行の下段には Hub 操作が並びます:

  • Open: Hub 投稿ページをシステムブラウザで開く (Hub 投稿に紐づく行のみ)
  • Upload: ローカルエントリから新しい Hub 投稿を作成 (未アップロードの行のみ)
  • Update: 現在のローカル内容を既存 Hub 投稿へ反映 (オーナーのみ)
  • Sync: Hub の最新内容をローカルへ取り込む。ローカルでの改名やドラッグ順は維持される (自分が所有していないダウンロード行のみ表示)。Hub 側の投稿がローカルキャッシュより新しいときは Sync ボタン横に 緑の点滅ドット が出ます — モーダルを開いた時に一括鮮度チェック (5 分に 1 回スロットル) が走るので、行ごとに手動チェックしなくても更新を見逃しません
  • Remove: Hub から投稿を取り下げる。インラインで確認してから実行

鮮度チェックで Hub 側から投稿が消えていることを検出すると、Updated 列は赤字で (削除済み) と表示されます。その行で Sync を押しても Hub から取得できないため失敗します。

QWERTY は Hub 操作も Delete も無効ですが、他の行と同じくドラッグで並び替えできます。

Find on Hub タブ

Key Labels — Find on Hub

Pipette Hub からラベルセットを検索します。2 文字以上入力すると自動で検索が走ります (debounce 付き)。Search ボタンや Enter キーでも手動トリガー可能です。結果はラベル名、アップローダー、Download または既にインストール済みの場合の Installed 表示で表します。同じ名前のファイルを再 import すると既存ローカルエントリを上書きし (.json の中身は置き換え、Hub リンクは保持されます)。

Key Label の書き方

Key Label の .json は次の 3 フィールドを持つ小さな JSON オブジェクトです。

{
  "name": "Brazilian (QWERTY)",
  "map": {
    "KC_2": "2\n@",
    "KC_3": "3\n#",
    "KC_LBRC": "´\n`",
    "KC_QUOT": "ç",
    "KC_GRAVE": "KC_LALT"
  },
  "compositeLabels": {
    "LSFT(KC_2)": "@",
    "LALT(KC_L)": "KC_LALT"
  }
}

上の例の "KC_GRAVE": "KC_LALT" は、KC_GRAVE が割り当たってるキャップに自動的に「LAlt」のキーコード組み込みラベルを描画します。値が keycode id なので keycodeLabel() で解決される動作です。

フィールド必須用途
nameはいモーダル一覧、Settings → Defaults ドロップダウン、Keycodes Overlay Panel に表示する名前
mapはいQMK キーコード ID → ラベル文字列。このラベルセットがアクティブな間、Keymap Editor のキーキャップ表示に使われます
compositeLabelsいいえmap と同じ形式の辞書。Composite キーコード (例: LSFT(KC_2), LT(0,KC_A), MT(MOD_LCTL,KC_ESC)) の outer / inner テキストを上書きします。上書き不要なら省略可

値には任意の QMK キーコード ID も渡せます。エディタは値を keycodeLabel() 経由で表示するため、例えば "LALT(KC_L)": "KC_LALT" と書くと自動で「LAlt」というキーコード組み込みラベルが解決されます。同じショートカットは map 側でも有効です ("KC_8": "KC_LALT" で「LAlt」が描画される)。

ラベル文字列は \n で区切ると行数に応じてレイアウトが切り替わります。

部分数レイアウト
1中央 (従来通り)"8"
2上下分割"(\n8"( の下に 8
3上中下の 3 段スライス"a\nb\nc"
42 × 2 の 4 分割 — 左上 / 右上 / 左下 / 右下"1\n2\n3\n4"1\|2 / 3\|4
5+5 個目以降は無視されます

区切りで空文字列を入れると対応するスロットが空になります。"1\n2\n\n4" の場合:

1 | 2
-----
  | 4

Composite キーコード (LT, MT, modifier+key 等) は inner キー描画用の小さな矩形がキー下半分を占めるため、outer ラベルは \n先頭 2 部分のみ が使われます。3 番目以降の部分は inner rect と衝突するため自動的に捨てられます。

name はローカルストア内のユニークキーでもあるため、同じ name.json を import すると既存エントリが in-place で上書きされます (Hub 投稿との紐付けは保持)。完全な新規エントリにしたい場合は name を変えてから import してください。

6.3 Language Packs Manage

Tools タブに Language Packs 行があり、現在のアクティブな UI 言語が表示されます。Edit をクリックすると Language Packs モーダルが開きます。

English は built-in です。それ以外の言語はローカル .json ファイルの import か Pipette Hub からのダウンロードで追加します。インストール済みパックは Cloud Sync を経由して全デバイスで共有されます。Hub に紐づくパックはアプリ起動時に自動で更新チェックが行われ、新しいバージョンがあれば自動で取得されます。

Installed タブ

Language Packs — Installed

このマシンにある言語パックの一覧。各行の左側に チェックサークル があり、クリックすると即座にアクティブな UI 言語が切り替わります。アクティブな行はアクセントカラーの枠線でハイライトされます。

各行に表示される内容:

  • 名前 (クリックでインラインリネーム)
  • 更新日時 (YYYY-MM-DD HH:mm)
  • パックが現在の English ベースラインの全キーをカバーしている場合は バージョン チップ、カバーしていない場合は 未設定のキー ボタン (クリックすると未翻訳キー一覧モーダルが開く)
  • 上段に Export / Delete アクション
  • 下段に Open / Upload / Update / Sync / Remove の Hub アクション (Key Labels §6.2 と同じパターン)

Hub 側の投稿がローカルキャッシュより新しいときは Sync ボタン横に 緑の点滅ドット が出ます (モーダル表示中に 5 分に 1 回鮮度チェック実行)。

ツールバーの Import ボタンでファイルダイアログを開き、.json 言語パックを import できます。同じ name のパックを再 import すると既存エントリが上書きされます。

Find on Hub タブ

Language Packs — Find on Hub

Pipette Hub から言語パックを検索します。2 文字以上入力すると自動で検索が走ります (debounce 付き)。結果にはパック名、バージョン、アップローダー、Download または Installed が表示されます。

Language Pack の書き方

言語パック .json は built-in English パックと同じ構造です。English パックを export (built-in 行 → Export) してテンプレートを取得し、値を翻訳してください:

{
  "name": "Japanese",
  "version": "0.1.0",
  "common": {
    "save": "保存",
    "cancel": "キャンセル"
  },
  "editor": {
    "keymap": {
      "title": "キーマップ"
    }
  }
}
フィールド必須用途
nameはい表示名および import 時の上書き判定キー
versionはいセマンティックバージョニング文字列 (例: 0.1.0)
(その他のキー)はいEnglish の構造に合わせたネスト翻訳ツリー

キーはドット区切りの名前空間 (例: editor.keymap.title) を使います。English ベースラインの全キーをカバーするパックにはバージョンチップが表示され、部分的なパックには「未設定のキー」リンクが表示されるため、翻訳者は何が残っているかを確認できます。日本語バリアントを含むサンプル言語パックもリポジトリの sample-packs/i18n/ ディレクトリにあります。

6.4 Theme Packs Manage

Tools タブに Theme Packs 行があり、現在アクティブなテーマパック名が表示されます (未設定の場合は空)。Edit をクリックすると Theme Packs モーダルが開きます。

テーマパックはアプリケーションのカラーパレットを上書きします。built-in の Light / Dark / System テーマはそのまま使用でき、テーマパックはその上にカラーを重ねます。インストール済みパックは Cloud Sync を経由して全デバイスで共有されます。

テーマパック作成者向け: カラートークンの全リファレンスとデザインのコツは Theme Pack Authoring Guide を参照してください。

Installed セクション

Theme Packs — Installed

このマシンにあるテーマパックの一覧。各行の左側に ラジオサークル があり、クリックするとそのテーマパックが即座に適用されます。アクティブな行をもう一度クリックすると選択が解除され、built-in テーマに戻ります。先頭に Light / Dark / System の 3 つの built-in オプションが表示されます。

各行に表示される内容:

  • 名前 (クリックでインラインリネーム)
  • 更新日時 (YYYY-MM-DD HH:mm)
  • バージョン チップ
  • 上段に .json エクスポートショートカットと Delete ボタン
  • 下段に Open / Upload / Update / Sync / Remove の Hub アクション (Key Labels §6.2 と同じパターン)

Hub 側の投稿がローカルキャッシュより新しいときは Sync ボタン横に 緑の点滅ドット が出ます (モーダル表示中に 5 分に 1 回鮮度チェック実行)。

ツールバーの Import ボタンでファイルダイアログを開き、.json テーマパックを import できます。同じ name のパックを再 import すると既存エントリが上書きされます。

Find on Hub タブ

Theme Packs — Find on Hub

Pipette Hub からテーマパックを検索します。2 文字以上入力すると自動で検索が走ります (debounce 付き)。各結果にパック名、バージョン、アップローダー、Preview ボタン、Download または Installed が表示されます。

Preview をクリックすると、インストールせずにテーマの色を一時的に適用できます。モーダルを閉じる、Installed タブに切り替える、または Preview を再クリックすると元のテーマに戻ります。

テーマパックの書き方

テーマパック .jsonnameversion、およびすべてのカラートークンを CSS カラー値にマッピングする colors オブジェクトで構成されます:

{
  "name": "Nord",
  "version": "1.0.0",
  "colorScheme": "dark",
  "colors": {
    "surface": "#2e3440",
    "surface-alt": "#3b4252",
    "surface-dim": "#272c36",
    "surface-raised": "#434c5e",
    "content": "#eceff4",
    "content-secondary": "#d8dee9",
    "content-muted": "#7b88a1",
    "content-inverse": "#2e3440",
    "edge": "#4c566a",
    "edge-subtle": "#3b4252",
    "edge-strong": "#d8dee9",
    "accent": "#88c0d0",
    "accent-hover": "#81a1c1",
    "accent-alt": "#5e81ac",
    "success": "#a3be8c",
    "warning": "#ebcb8b",
    "danger": "#bf616a",
    "pending": "#b48ead",
    "key-bg": "#3b4252",
    "key-bg-hover": "#434c5e",
    "key-bg-active": "#4c566a",
    "key-border": "#4c566a",
    "key-shadow": "rgba(0,0,0,0.3)",
    "key-label": "#eceff4",
    "key-sublabel": "#d8dee9",
    "key-label-remap": "#88c0d0",
    "key-bg-multi-selected": "#434c5e",
    "tab-bg-active": "#3b4252",
    "tab-text": "#7b88a1",
    "tab-text-active": "#eceff4",
    "picker-bg": "#2e3440",
    "picker-item-bg": "#3b4252",
    "picker-item-hover": "#434c5e",
    "picker-item-text": "#eceff4",
    "picker-item-border": "#4c566a"
  }
}
フィールド必須用途
nameはい表示名および import 時の上書き判定キー
versionはいセマンティックバージョニング文字列 (例: 1.0.0)
colorSchemeはい"light" または "dark" — パックが想定する明暗を宣言する
colorsはい全 35 カラートークンを CSS カラー値 (#hexrgb()hsl()) にマッピングするオブジェクト

35 個すべてのカラートークンが必須です。インストール済みパックを export (行 → .json) すると完全なテンプレートが取得できます。すぐに使える Kanagawa Wave / Dragon / Lotus・Solarized Light / Dark などのサンプルテーマパックもリポジトリの sample-packs/themes/ ディレクトリにあります。

6.5 ズーム(UI 全体)

Tools タブの Theme Packs の下に Zoom 行があります。アプリケーション UI 全体の表示倍率を変更できます(50–200%)。

ズーム設定
  • 入力欄にパーセント値(50–200)を入力し、Enter を押すかフォーカスを外すと適用されます
  • ズームレベルは即座にすべてのウィンドウに反映されます
  • この設定はマシンローカルです — Cloud Sync を経由して他デバイスには同期されません

Note: これはツールバーのキーボード単位ズーム (§4.1)(キーマップ表示のみを拡大縮小)とも、キーコードオーバーレイパネルの Key Editor Zoom (§3.14)(キーエディタ画面中のウィンドウ全体の表示倍率を上書き)とも別の機能です。ここの UI ズームはそれ以外のすべての画面に適用されるベースラインです。

Warning: 極端な値ではレイアウトが崩れる場合があります。自己責任で変更してください。


7. Pipette Hub

Pipette Hub は、キーマップやお気に入り設定をアップロードして共有できるコミュニティキーマップギャラリーです。

7.1 Hub のセットアップ

Hub 機能を使用するには Google アカウント認証が必要です。先に Google アカウントの認証を済ませてください。デバイス選択画面の 設定 モーダル (歯車アイコン) で設定します:

  1. データ タブで Google アカウントセクションの Connect をクリックして Google アカウントでサインイン
  2. 同じデータタブ内の Pipette Hub セクションまでスクロール — Connected と表示されていることを確認
  3. Display Name を設定 — Hub の投稿に表示される名前です
  4. アップロードしたキーマップは My Posts リストに表示されます

7.2 キーマップのアップロード

キーマップを Hub にアップロードする手順:

  1. キーボードを接続し、キーマップエディタの設定ボタン (歯車アイコン) を開く
  2. Data タブに切り替える
  3. 現在の状態をラベル付きで保存 (例: "Default")
Upload ボタン
  1. 保存したスナップショットの Upload ボタンをクリック
  2. アップロード完了後、エントリに Uploaded ステータスと Open in BrowserUpdateRemove ボタンが表示されます
アップロード完了
  • Open in Browser: このキーマップの Hub ページをブラウザで開く
  • Update: 現在のキーボード状態で Hub の投稿を更新
  • Remove: Hub からキーマップを削除

Note: Hub アップロードには標準エクスポート形式に加えて undefined ファイルが含まれ、他のユーザーがキーボードの完全な状態を直接読み込めます。

7.3 お気に入りエントリのアップロード

個別のお気に入りエントリ (Tap Dance、Macro、Combo、Key Override、Alt Repeat Key) も Hub にアップロードできます:

データモーダル — お気に入り Hub アクション
  1. インラインお気に入りパネルのあるエディタモーダル、またはデバイス選択画面のデータモーダルを開きます
  2. お気に入りリストの各エントリに、Hub 接続時は Upload to Hub ボタンが表示されます
  3. Upload to Hub をクリックして設定を共有します
  4. アップロード後、Open in BrowserUpdate on HubRemove from Hub ボタンが表示されます
  5. Hub にアップロード済みのお気に入りをリネームすると、Hub 上のタイトルも自動的に更新されます

Note: アップロードには Display Name の設定が必要です。Display Name が未設定の場合、Upload ボタンの代わりに警告が表示されます。

7.4 分析データのアップロード

保存した Analyze 条件を Hub にアップロードして、タイピング分析チャートをコミュニティと共有できます。

フロー

  1. Analyze ページを開き、共有したいフィルタを設定(キーボード、デバイス、アプリ、日付範囲、キーマップスナップショット)
  2. 検索条件の保存 パネル(ブックマークアイコン)でラベルを付けて条件を保存
  3. Hub 接続時、各エントリの下に Hub アクション行が表示され Upload to Hub ボタンが使える
  4. Upload to Hub をクリック — カテゴリ選択モーダルがアップロードモードで開く(§1.4 エクスポート / アップロード 参照)
  5. 含めるチャートカテゴリを選択し、必要に応じて Layout Comparison ターゲットや Per-app data を指定して Upload をクリック
  6. アップロード完了後、エントリに Open in BrowserUpdate on HubRemove from Hub ボタンが表示される

バリデーションルール

Hub は以下の 2 つのガードを適用する:

  • 最低 100 打鍵 — 100 打鍵未満のチャートはデータが疎すぎて有用でないため拒否される
  • 最大 30 日間 — これを超える期間はペイロードが Hub のサイズ上限を超えるため拒否される

いずれかに違反した場合、ローカライズされたエラーメッセージが修正方法を案内する(期間を短くする、もっと打鍵を記録するなど)。

アップロードモードのオプション

  • Layout Comparison ターゲット — 含める代替レイアウトを複数選択。Hub 投稿にはターゲットごとの打鍵再配分が表示される。ターゲット未選択時はトグルが無効化される
  • Per-app data — アプリ別内訳として含めるアプリを選択。Hub 投稿には選択アプリのチャートが表示される

更新と削除

  • Update on Hub — 同じ条件の最新チャートデータを再アップロードする(打鍵が増えた後に有用)
  • Remove from Hub — Hub サーバーから分析投稿を削除する(2 段階確認あり)

エラーハンドリング

アップロードエラーはローカライズ済み。代表的なケース: 認証失敗(サインアウト→再サインイン)、ペイロードが大きすぎる(カテゴリを減らすか期間を短縮)、レート制限(しばらく待ってリトライ)。

Note: アップロードには Display Name の設定が必要です。Display Name が未設定の場合、Upload ボタンの代わりに警告が表示されます。

7.5 Hub ウェブサイト

Pipette Hub ウェブサイト では、アップロードされたキーマップがギャラリー形式で表示されます。

Hub トップページ
  • コミュニティのキーマップを閲覧
  • キーボード名で検索
  • .vil.c.pdf 形式でダウンロード

個別キーマップページ

キーマップカードをクリックすると、キーボードレイアウトの詳細ページが開きます。

Hub 詳細ページ
  • アップロードされたキーマップの全レイヤー (Layer 0〜3) を表示
  • Tap Dance、Macro、Combo、Alt Repeat Key、Key Override の設定を確認
  • Copy URLShare on X で他の人と共有
  • 各種形式 (.pdf.c.vil) でダウンロード

Hub 認証の詳細は Data Guide を参照してください。


8. モーダルの操作

Pipette はすべての top-level モーダル (Settings、Data、Macro、QMK Settings、Tap Dance、Combo、Key Override、Alt Repeat Key、Notification、Language Packs、Theme Packs、Language Selector、Layout Store、Editor Settings、Favorite Store、および History Toggle ダイアログ) に共通のキーボード操作・閉じ方ルールを適用します。

Escape で閉じる

Escape キーを押すとモーダルが閉じます。ただし、入力操作を邪魔しないよう以下の例外があります:

  • フォーカスが <input>, <textarea>, <select>, contenteditable 領域にある場合、Escape は無視されます(要素自身がイベントを受け取ります)
  • IME 入力中(日本語入力の変換中など)は Escape を無視します — 変換のキャンセルでモーダルが閉じないようにするため

Unlock Dialog の保護

Unlock Dialog(ブートアンロック系キーコード実行時に物理キー押下を要求するダイアログ)は 親モーダルに到達する前に Escape を吸収 (swallow) します。アンロックプロンプト上で Escape を連打しても親モーダルに伝搬しないため、Settings や Data モーダルを設定途中で誤って閉じることはありません。

Busy 状態中の Escape 抑制

モーダルが完了待ちの状態にあるとき、Escape-to-close は一時的に無効化されます:

  • Settings / Data モーダル: 同期・トラブルシューティングフローの実行中は無効
  • Macro モーダル: レコーダーがキーストロークを記録中は無効(§3.7 の記録中のロックを参照)。同じタイミングで背景クリックと右上の Close ボタンも無効になります

9. ステータスバー

画面下部のステータスバーには接続情報と操作ボタンが表示されます。

ステータスバー

ステータス表示 (左側)

  • デバイス名: 接続中のキーボード名を表示
  • ロードラベル: 読み込んだスナップショットのラベル名 (スナップショット読み込み時のみ表示)
  • 自動移動: キー割り当て後に次のキーに自動移動する機能の状態 (有効時のみ表示)
  • Locked / Unlocked: キーボードのロック状態 (一部の危険なキーコードの誤設定を防止)
  • Sync ステータス: クラウド同期の状態 (同期設定時のみ表示)
  • Hub 接続状態: Pipette Hub の接続状態 (Hub 設定時のみ表示)

クイック設定 (右側、キーボード接続時に表示)

セッションごとの共通設定をインラインで変更できるセレクターです。| セパレーターで操作ボタンと区切られます。

  • Language: UI 言語を切り替え。組み込み言語とインストール済み言語パックのドロップダウンが開きます (§6.3 参照)
  • Theme: カラーテーマを切り替え。System / Light / Dark とインストール済みテーマパックが選択肢として表示されます (§6.4 参照)
  • Key Labels: 現在のキーボードのキーラベルセットを切り替え。Key Labels ストアのインストール済みエントリがドラッグ順で表示されます (§6.2 参照)
  • Edit / Done: 編集モードの切替。編集モードではセレクターが Language PacksTheme PacksKey Labels 管理モーダルのボタンに切り替わり、エントリのインストール・同期・並び替えができます

操作ボタン (右側)

  • Key Tester: Matrix Tester モードの切替ボタン (マトリクステスター対応時のみ。タイピングテストがアクティブ時は非表示)
  • Typing View: ビューオンリーモードの切替ボタン — キーボードレイアウトのみをコンパクトウィンドウに表示 (§4.3 参照)。マトリクステスター対応時のみ。タイピングテストがアクティブ時は非表示
  • Typing Test: タイピングテストモードの切替ボタン (マトリクステスター対応時のみ)
  • Disconnect ボタン: キーボードとの接続を切断し、デバイス選択画面に戻ります(タイピングテスト中は非表示)

Data Guide

This document describes what data Pipette stores, where it lives, and how external services are used.


Local Data

All local data is stored under the OS user data directory:

OSPath
Linux~/.config/Pipette/
macOS~/Library/Application Support/Pipette/
Windows%APPDATA%/Pipette/

App Settings

General preferences that apply across all keyboards.

ItemDescription
ThemeLight, Dark, or System
LanguageActive UI language pack (built-in English or any imported pack)
Auto-lock timer10 - 60 minutes
Default keyboard layoutQWERTY, Dvorak, etc.
Default auto-advanceMove to next key after assignment
Default layer panel openInitial state of the layer list panel for new keyboards
Default basic view typeDefault Basic tab view (ANSI / ISO / JIS / List)
Default split key modeDefault split-key display mode (split or flat)
Default quick selectDefault quick-select mode for the keycode popover
Max keymap historyMaximum number of keymap changes kept in edit history
Auto syncEnable/disable cloud sync
Hub enabledEnable/disable Pipette Hub integration
Window position & sizeRestored on next launch
Typing recording consentWhether the typing-analytics recording consent dialog has been accepted (gates the REC tab Start button)
Typing-view heatmap windowWindow length (minutes) for the typing-view real-time heatmap overlay
Monitor App enabledWhether to capture the active application name during typing-analytics recording. Required for the App filter and By App tab in Analyze

Per-Keyboard Settings

Settings tied to a specific keyboard, identified by its unique ID.

ItemDescription
Keyboard layout overrideDisplay labels using a specific layout
Auto-advancePer-keyboard override
Layer namesCustom names for each layer (Pipette-only; not written to firmware or visible in other apps)
Layer panel openWhether the layer list panel is expanded
Basic view typeBasic tab view (ANSI / ISO / JIS / List)
Split key modeHow split-key tiles are displayed (split or flat)
Quick selectQuick-select mode for the keycode popover
Keymap scaleKeymap zoom level
View modeLast active view (Editor / Typing Test / Typing View) — auto-restored on reconnect
Typing test historyWPM/accuracy records (up to 500 entries)
Typing test configMode, word count, and other test preferences
Typing test languageSelected language pack
Typing view preferencesCompact window size and always-on-top setting
Record enabledUser-chosen state of the REC toggle in the typing view; recording is gated additionally on Typing View being open
Typing view menu tabLast active menu pane tab in Typing View (Window / REC)
Typing sync spanHow many days of typing-analytics history to sync (per-device JSONL)
Analyze finger assignmentsManual row,col → finger overrides for the Ergonomics tab
Analyze goalDaily keystroke goal, target consecutive days, and goal-edit history for the Streak / Goal cards
Analyze filtersPer-tab filter state (device scope, app scope, view modes, ranking limits, snapshot selection) for the Analyze dashboard
Analyze compare filtersSame shape as Analyze filters, bound to the secondary pane in the Analyze split-view

Typing Analytics

Per-keyboard typing history that feeds the Analyze page (see OPERATION-GUIDE §1.4). Recorded while you are in Typing View and the Record toggle in the typing-test pane is set to Start; typing-test results flow into the same stream.

ItemDescription
Keystroke eventsPer-keystroke records aggregated into minute buckets
Minute statsWPM, Backspace %, interval percentiles, and other per-minute summaries
Matrix activityPer-cell press counts with the active layer at the time
SessionsStart / end markers for each typing session
Keymap snapshotsPoint-in-time keymap captures used to resolve heatmap positions and layer-op targets
App tagActive application name attached to each minute when Monitor App is on. Minutes that observed only one app carry that name; minutes that observed multiple apps are tagged as unknown; minutes captured while Monitor App was off are not tagged. Powers the App filter and the By App tab in Analyze

What is synced, what is local cache

StoragePath (under user data directory)Scope
Per-device typing log (master)sync/keyboards/{uid}/devices/{machineHash}/{YYYY-MM-DD}.jsonlSynced across your signed-in devices
Keymap snapshots (master)typing-analytics/keymaps/{uid}/{machineHash}/*.jsonLocal only (per machine)
Query cache (SQLite)local/typing-analytics.dbLocal only — rebuilt from the JSONL master when missing or stale

The JSONL master is the source of truth and survives cache rebuilds. When the app can't find the SQLite cache (first launch on a new machine, file corruption, schema upgrade), it replays the JSONL log to rebuild it; no data is lost.

Layer names in the chart come from Per-Keyboard Settings above, not from typing analytics — renaming a layer in the layer panel updates the axis label in Analyze the next time you open it.

Snapshots

Complete point-in-time captures of a keyboard's state. Each snapshot contains:

ItemDescription
KeymapAll layers, all keys
Encoder mappingsClockwise/counter-clockwise assignments per layer
Layout optionsPhysical layout selections
MacrosAll macro definitions
Tap Dance entriesAll tap dance configurations
CombosAll combo definitions
Key OverridesAll key override rules
Alternate Repeat KeysAll alt repeat key mappings
QMK SettingsAll firmware settings
Layer namesCustom layer names
Keyboard definitionPhysical key layout and matrix info (v2+)

Snapshots are created manually via "Save Current State" and stored as .pipette files. They can be restored to the keyboard or exported as .vil files.

The .pipette format has two versions:

  • v1 (legacy): No version field, no keyboard definition embedded.
  • v2 (current): Includes version: 2 and embeds the KeyboardDefinition (physical key layout, matrix dimensions) so the snapshot can render a virtual keyboard without a physical device connected.

Legacy v1 files are automatically migrated to v2 when loaded with a connected device.

Favorites

Reusable configurations that work across any keyboard. Individual entries can be uploaded to Pipette Hub.

TypeDescription
Tap DanceSaved tap dance entry
MacroSaved macro sequence
ComboSaved combo definition
Key OverrideSaved key override rule
Alternate Repeat KeySaved alt repeat key mapping

Each favorite entry may have an associated hubPostId if it has been uploaded to Hub. Renaming a Hub-uploaded favorite also updates its title on Hub.

Key Labels

Maps QMK keycode ids to keycap legends used by the Keymap Editor, the Keycodes Overlay Panel, the Settings → Defaults dropdown, and the Layout Comparison view. QWERTY ships built-in; every other label set (Dvorak, Colemak, French, Brazilian, …) is downloaded from Pipette Hub or imported as a .json file. The store is shared across keyboards (it survives Reset Keyboard Data) and syncs entry-by-entry across machines.

A Key Label .json is a small JSON object:

{
  "name": "Brazilian (QWERTY)",
  "map": { "KC_2": "2\n@", "KC_QUOT": "ç", "KC_GRAVE": "KC_LALT" },
  "compositeLabels": { "LSFT(KC_2)": "@", "LALT(KC_L)": "KC_LALT" }
}
FieldRequiredPurpose
nameYesDisplay name and uniqueness key for overwrite-on-import
mapYesQMK keycode id → label string. Lines are split on \n to control the cap layout (1 = centred, 2 = stacked, 3 = three slices, 4 = 2 × 2 quadrants). Empty parts leave a slot blank
compositeLabelsNoOverrides for composite keycodes (e.g. LT(0,KC_A), LSFT(KC_2)). Composite caps render the inner key in an inset rectangle, so only the first two \n parts of the outer label are honoured

Values may also be plain QMK keycode ids (e.g. "LALT(KC_L)": "KC_LALT"). The editor runs the value through keycodeLabel() before display, so a keycode-id value resolves to that keycode's canonical legend automatically.

See docs/OPERATION-GUIDE.md §6.2 for the full authoring guide and the modal walkthrough.

UI Language Packs

Translation packs that localise the entire Pipette UI. English is built-in; additional languages (e.g. Japanese) are imported from a .json file or downloaded from Pipette Hub. Managed in Settings → Tools → Language Packs (see OPERATION-GUIDE.md §6.3).

Installed packs sync across devices via Cloud Sync. The active language selection is stored in App Settings (not synced).

Typing Test Language Packs

Word lists downloaded from the server for the typing test. Can be managed (download / delete) from the typing test language selector.

Logs

Rotating log files for debugging. No keyboard data or personal information is logged.

Authentication Credentials

OAuth tokens and sync password are encrypted using the OS keychain (Electron safeStorage). These are never stored in plain text.


Keyboard-Side Data

The following data is stored in the keyboard's own memory (EEPROM / dynamic RAM). This data persists even if Pipette is uninstalled — it is erased only by a keyboard factory reset.

  • Keymap (all layers)
  • Encoder mappings
  • Layout options
  • Macro buffer
  • Tap Dance, Combo, Key Override, Alternate Repeat Key entries
  • QMK Settings values
  • Lighting configuration (backlight, RGB)
  • Lock/unlock state

Pipette reads and writes this data via USB HID using the VIA/Vial protocol. Changes are applied directly to the keyboard when you edit them.


Cloud Sync (Google Drive appDataFolder)

How It Works

Pipette uses Google Drive appDataFolder to sync your data across devices. The appDataFolder is not regular Google Drive storage — it is a hidden, app-specific folder that only the app which created it (identified by its OAuth client ID) can access. Its contents are invisible to the user and to other Google Drive applications.

  • Sync is opt-in — you must sign in with Google and set a sync password to enable it
  • Synced data is end-to-end encrypted before upload (AES-256-GCM with a key derived from your sync password via PBKDF2)
  • Sync happens automatically when changes are detected (with a 10-second debounce) and via periodic polling (every 3 minutes)
  • Pending changes are flushed on app exit
  • Selective sync scope: Not all keyboards' data is downloaded at once. On device connection, favorites are downloaded first, then the connected keyboard's snapshots and settings are downloaded (in full) once its UID is confirmed. Keyboards you have never connected on this machine are left undownloaded; their data is fetched on demand when you open them from the Data modal's Sync section. Manual sync (Sync) and background polling keep the currently connected keyboard and favorites in sync — other keyboards' data is never pulled down automatically
  • Lightweight keyboard name index: A small synced index (UID → keyboard name) is kept so that remote-only keyboards can be shown by name in the Data modal before their full data is ever downloaded. The index holds only UIDs and keyboard names — no keymap, macro, or setting data

What Is Synced

DataSync Unit
SnapshotsPer keyboard
Per-keyboard settingsPer keyboard
FavoritesPer type (tap dance, macro, etc.)
UI Language PacksPer pack (index + body)
Keyboard name index (UID → name)Single shared index

App settings (theme, language, window state, etc.) are not synced.

Security & Privacy

ConcernHow it's addressed
What permissions does Pipette request?The only Drive-related scope is drive.appdata, which allows access exclusively to Pipette's own Application Data folder. Additionally, openid, email, and profile are requested for identity verification (see scope table below).
Can Pipette access my Google Drive files?No. The drive.appdata scope grants access exclusively to a hidden folder created by Pipette. It cannot list, read, modify, or delete any of your personal files, documents, photos, or other Drive content.
Can other apps see Pipette's data?No. The Application Data folder is invisible to the user and to other applications. Only the app that created it (identified by its OAuth client ID) can access it.
Is my data encrypted?Yes. All data is encrypted with AES-256-GCM using a key derived from your sync password (PBKDF2, 600,000 iterations) before it leaves your device. Google stores only encrypted blobs.
Can Pipette's developers read my synced data?No. Encryption happens on your device with your password. Without your sync password, the encrypted data is unreadable.
What happens if I sign out?Local data is preserved. Cloud data remains in Google Drive appDataFolder but is no longer synced. You can sign back in to resume syncing.
How do I delete all cloud data?Use "Reset Sync Data" in settings and select both keyboard and favorite data. This removes selected keyboards_*.enc / favorites_*.enc files from Google Drive appDataFolder. The keyboard name index (meta_keyboard-names.enc) and password check (password-check.enc) are retained; deletions are propagated to other signed-in devices via tombstone entries in the name index (garbage-collected after 30 days).
What is stored on Google?Encrypted files named by sync unit (e.g., keyboards_{uid}_snapshots.enc, favorites_tapDance.enc, meta_keyboard-names.enc, password-check.enc). File names contain keyboard UIDs but no personal information.
How does authentication work?Standard Google OAuth 2.0 with PKCE (Proof Key for Code Exchange) via a local loopback redirect. No passwords are sent to any third-party server.
What happens if I change my password?All synced files are re-encrypted with the new password. No data is deleted — files are decrypted and re-encrypted in place.
What are undecryptable files?Files that cannot be decrypted with your current sync password or are otherwise unreadable (e.g., leftover from a previous password). You can scan for and delete them from the Data tab in settings.

Google OAuth Scopes

ScopePurpose
drive.appdataRead/write Pipette's own Application Data folder
openidVerify user identity
emailDisplay signed-in email address
profileDisplay user name

Pipette Hub

What Is It

Pipette Hub is a community keymap gallery where you can share your keyboard configurations.

How It Works

  • Uploading requires signing in with the same Google account used for sync
  • Pipette sends your Google id_token to the Hub server, which verifies it against Google's public keys and issues a short-lived Hub session token
  • Keyboard snapshot uploads include: keymap data (.vil and .pipette formats), a keymap.c export, a PDF cheat sheet, and a thumbnail screenshot
  • Favorite entry uploads include: the favorite configuration as a JSON file (Pipette's favorite export format with QMK keycode names)

What Is Uploaded

Keyboard Snapshots:

ItemDescription
TitleUser-provided post title
Keyboard nameName of the keyboard
.vil fileKeymap in VIL format
.pipette fileKeymap in Pipette format
keymap.cQMK-compatible C source
PDFPrintable keymap cheat sheet
ThumbnailScreenshot of the current keymap view

Favorite Entries (Tap Dance, Macro, Combo, Key Override, Alt Repeat Key):

ItemDescription
TitleFavorite entry label
Post typeEntry type (td, macro, combo, ko, ark)
JSON fileFavorite configuration in Pipette export format (with QMK keycode names)

Security & Privacy

ConcernHow it's addressed
What permissions does Hub require?No additional permissions beyond the Google sign-in already used for sync. Hub authenticates using the same Google id_token.
Can Hub access my Google Drive or other data?No. Hub only receives and verifies your Google id_token to confirm your identity. It does not request any Google API scopes and cannot access any of your Google data.
Who can upload and delete posts?Only the authenticated owner. Pipette is the official client for uploading and deleting posts, and all actions require a valid Hub session token tied to your Google account.
Can I delete my uploads?Yes. You can delete your own posts from within Pipette.
Where is Hub data stored?On Cloudflare infrastructure (Workers, D1 database, R2 storage).
Is the Hub server open source?The Hub server is a separate project. Pipette's source code (this repository) is fully open — you can verify exactly what data is sent.

Export Formats

Pipette can export keymap data in several formats. These are local file downloads and do not involve any network requests.

FormatExtensionDescription
VIL.vilComplete keyboard state (compatible with Vial GUI)
Pipette.pipettePipette's snapshot format (includes layer names)
keymap.c.cQMK-compatible C source code
PDF (Keymap).pdfPrintable keymap cheat sheet
PDF (Layout).pdfLayout export with key outlines and summary pages for dynamic entries

Reset Operations

OperationSnapshotsSettingsFavoritesCloud DataHub PostsApp Settings
Reset Keyboard DataDeletedDeleted-Deleted for that keyboard--
Reset Local DataSelected targets deletedSelected targets deletedSelected targets deleted--Selected targets reset to defaults
Reset Sync Data---Selected targets deleted--
Change Password---All files re-encrypted--
Sign Out------
Export/Import Local DataIncludedIncludedIncluded---

Note: Reset Local Data allows you to select individual targets — keyboard data, favorites, and app settings can each be reset independently.

Note: Reset Local Data and Reset Sync Data do not delete the local keyboard name index (undefined) or the remote index file (undefined). Reset Keyboard Data and Reset Sync Data mark the affected UIDs as deleted in the index (tombstone, 30-day TTL) so other signed-in devices see the removal; the index file itself is retained.

Theme Pack Authoring Guide

A complete reference for creating custom colour themes. All 34 colour tokens explained with visual examples, default values, and design tips.

1. Token Categories

Theme packs define 34 colour tokens grouped into 7 categories. Every token is required.

Surface (4) Content (4) Edge (3) Semantic (6) Key (9) Tab (3) Picker (5)

2. Visual Reference

See how tokens map to actual UI elements. Annotations show the token name used for each part.

Light Theme (built-in default)

surface Background
surface-alt Card / raised panel
Buttons
Save accent Cancel edge Delete danger
Status
Success Synced Pending Warning Error
Tabs
Active tab-bg-active Inactive tab-text
Text
Primary text content
Secondary text content-secondary
Muted text content-muted
Keys
A B hover C active D multi
key-bg key-border key-shadow key-label
Picker
Item 1 picker-item-bg
Item 2 (hover) picker-item-hover
Item 3

Dark Theme (built-in default)

surface Background
surface-alt Card / raised panel
Buttons
Save Cancel Delete
Status
Success Synced Pending Warning Error
Tabs
Active Inactive
Text
Primary text
Secondary text
Muted text
Keys
A B C D
Picker
Item 1
Item 2 (hover)
Item 3

3. Complete Token Reference

All 34 tokens with their default values in the built-in Light and Dark themes. When a theme pack is active, your single set of values replaces both columns — there is no per-mode split.

Token Description Light Default Dark Default
Surface — Background layers and panels
surface
Main application background
The base background colour for the entire app window. Everything sits on top of this. #f5f6f8 #0f1117
surface-alt
Cards, modals, raised panels
Elevated containers that sit above surface. Cards, modals, sidebar panels, and dropdown menus use this. #ffffff #1a1d27
surface-dim
Recessed areas, code blocks
Slightly darker than surface. Used for recessed backgrounds, code blocks, and inset areas that should visually recede. #ebedf2 #242836
surface-raised
Tooltips, popovers, floating elements
The highest-elevation surface. Used for tooltips, popovers, and floating elements that stack above modals. #ffffff #2e3347
Content — Text and foreground colours
content
Primary text, headings
Main text colour. Used for headings, body text, labels, and any primary foreground content. #1a1d27 #e8eaf0
content-secondary
Descriptions, metadata
Secondary text. Used for descriptions, metadata, timestamps, and less prominent labels. #5c6478 #9ba3b5
content-muted
Placeholders, disabled text
Low-emphasis text. Placeholders, disabled labels, and decorative text that should not draw attention. #8b94a8 #636d83
content-inverse
Text on accent/coloured backgrounds
Text placed on top of accent, danger, or other vivid backgrounds. Should contrast well against all semantic colours in your palette. #ffffff #0f1117
Edge — Borders and dividers
edge
Standard borders, dividers
Default border colour for cards, inputs, table rows, and horizontal dividers. #d8dce6 #333a4d
edge-subtle
Light separators
Very light border for subtle separators and inner dividers that should barely be visible. #e8ebf0 #272d3d
edge-strong
Emphasised borders, focus rings
Stronger border for emphasis. Used for focused inputs, active selections, and borders that need more contrast. #b8bfcf #4a5270
Semantic — Accent and status colours
accent
Primary action buttons, links, focus
The primary brand/action colour. "Save" buttons, active tabs, links, focus rings, and selection highlights. #2563eb #4c8dff
accent-hover
Accent button hover state
Hover/pressed state of accent-coloured elements. Slightly lighter or shifted variant of accent. #3b82f6 #6ba1ff
accent-alt
Secondary accent, info badges
An alternative accent for secondary calls-to-action or informational highlights that should differ from the primary accent. #0ea5e9 #38bdf8
success
Success state, "synced" indicator
Positive status: successful operations, synced indicators, checkmarks, and confirmation messages. #10b981 #34d399
warning
Warning state, "syncing" indicator
Caution status: syncing in progress, version mismatches, and attention-required notices. #f59e0b #fbbf24
danger
Error state, delete buttons
Destructive/error status: delete buttons, error messages, failed operations, and critical alerts. #ef4444 #f87171
pending
Pending state, in-progress
Pending/in-progress status: operations waiting to complete, upload progress, and queued actions. #ea580c #fb923c
Key — Keyboard key widgets
key-bg
Default key background
Background of keyboard key caps in the keymap editor at rest. #ffffff #262b3a
key-bg-hover
Hovered key
Background when the cursor hovers over a key cap. #f0f2f7 #323850
key-bg-active
Selected / focused key
Background of the currently selected (clicked) key. Typically matches accent — labels on this key use content-inverse. #2563eb #4c8dff
key-border
Key cap outline
Border around each key cap. Creates the 3D keycap effect together with key-shadow. #c8cdd8 #3d4560
key-shadow
Key cap bottom shadow
The bottom shadow that gives key caps their 3D depth. Darker than key-border. Can be a colour value or rgba(). #b0b8c8 #0a0c12
key-label
Primary key legend
The main text label printed on each key cap (e.g. "A", "Ctrl", "Enter"). #1f2937 #d4d8e3
key-sublabel
Secondary key legend (shifted)
Secondary label on keys (e.g. shifted symbol, layer indicator). Dimmer than key-label. #7c8598 #7a839a
key-label-remap
Remapped key label highlight
Label colour for keys that have been remapped from their default assignment. Draws attention to customised keys. #0000ff #f7a948
key-bg-multi-selected
Multi-select / batch selection
Background for keys included in a multi-selection (e.g. combo key selection, batch reassignment). #93bbfd #3a6fcf
Tab — Tab bar / navigation tabs
tab-bg-active
Active tab background
Background fill for the currently active tab in editor tab bars (keymap, macro, tap dance, etc.). #2563eb #4c8dff
tab-text
Inactive tab text
Text colour for inactive (unselected) tabs. #6b7280 #8892a8
tab-text-active
Active tab text
Text colour for the active tab. Should be readable on tab-bg-active. #ffffff #ffffff
Picker — Keycode picker / palette
picker-bg
Picker panel background
Background of the keycode picker panel (the searchable palette where you browse available keycodes). #f8f9fb #1e2233
picker-item-bg
Individual picker item
Background of each keycode item chip/card within the picker at rest. #ffffff #282e40
picker-item-hover
Hovered picker item
Background when hovering over a keycode item in the picker. #eef0f5 #353d55
picker-item-text
Picker item label
Text colour for keycode labels inside picker items. #374151 #c5cbd8
picker-item-border
Picker item outline
Border around each keycode item in the picker. #dfe3eb #363e54

4. Design Guidelines

Contrast matters. Ensure at least 4.5:1 contrast ratio between text tokens (content, key-label, picker-item-text) and their backgrounds (surface, key-bg, picker-item-bg).
One palette for everything. A theme pack overrides both light and dark built-in colours with a single set of 34 values — there is no separate light/dark split. Your palette is always applied as-is regardless of the system appearance setting.
key-shadow accepts rgba(). Unlike other tokens that typically use hex, key-shadow often benefits from semi-transparent values like rgba(0,0,0,0.3) to blend naturally with any surface colour beneath.

Token Relationships

Foreground → Background Ensure readable contrast between these pairs
contentsurface Primary text on app background
content-inverseaccent Button label on primary button
content-inversedanger Button label on delete button
key-labelkey-bg Key legend on key cap
tab-text-activetab-bg-active Active tab text on active tab fill
picker-item-textpicker-item-bg Keycode label inside picker card

Elevation Hierarchy

surface-dim
surface
surface-alt
surface-raised
(lowest → highest)

5. JSON Template

Copy this template and replace the colour values with your own. All 34 tokens are required.

{
  "name": "My Theme",
  "version": "1.0.0",
  "colors": {
    // Surface — background layers
    "surface":          "#f5f6f8",
    "surface-alt":      "#ffffff",
    "surface-dim":      "#ebedf2",
    "surface-raised":   "#ffffff",

    // Content — text colours
    "content":           "#1a1d27",
    "content-secondary": "#5c6478",
    "content-muted":     "#8b94a8",
    "content-inverse":   "#ffffff",

    // Edge — borders
    "edge":              "#d8dce6",
    "edge-subtle":       "#e8ebf0",
    "edge-strong":       "#b8bfcf",

    // Semantic — accent & status
    "accent":            "#2563eb",
    "accent-hover":      "#3b82f6",
    "accent-alt":        "#0ea5e9",
    "success":           "#10b981",
    "warning":           "#f59e0b",
    "danger":            "#ef4444",
    "pending":           "#ea580c",

    // Key — keyboard key caps
    "key-bg":            "#ffffff",
    "key-bg-hover":      "#f0f2f7",
    "key-bg-active":     "#2563eb",
    "key-border":        "#c8cdd8",
    "key-shadow":        "#b0b8c8",
    "key-label":         "#1f2937",
    "key-sublabel":      "#7c8598",
    "key-label-remap":   "#0000ff",
    "key-bg-multi-selected": "#93bbfd",

    // Tab — navigation tabs
    "tab-bg-active":     "#2563eb",
    "tab-text":          "#6b7280",
    "tab-text-active":   "#ffffff",

    // Picker — keycode palette
    "picker-bg":         "#f8f9fb",
    "picker-item-bg":    "#ffffff",
    "picker-item-hover": "#eef0f5",
    "picker-item-text":  "#374151",
    "picker-item-border":"#dfe3eb"
  }
}

6. Quick Start Workflow

  1. Export any installed theme pack from Pipette (row → .json) as a starting template
  2. Open the exported .json in your editor
  3. Change "name" to your theme name and "version" to "1.0.0"
  4. Replace colour values — use this guide's token table and visual reference
  5. Import in Pipette: Settings → Tools → Theme Packs → Edit → Import
  6. Apply and preview — click the radio circle next to your pack
  7. Iterate: re-import with the same "name" to overwrite in place
  8. Share on Pipette Hub via the Upload action

Check out the sample theme packs on GitHub.

Pipette Desktop — Theme Pack Authoring Guide
Accepted colour formats: #hex, rgb(), hsl(), rgba()