Release v1.2.0#210
Merged
Merged
Conversation
Remap Cmd+N from New Workspace to Add Sibling Note — sibling creation is far more frequent. Cmd+Shift+N remains Add Child Note. New Workspace stays in the File menu without a shortcut. Additional UX improvements: - AddNoteDialog auto-focuses the type dropdown on open - Adding a sibling pre-selects the reference note's schema type - Edit mode focuses the first schema field when title is hidden - Tag input no longer traps Tab/Enter when empty, allowing natural keyboard navigation and quick save via Enter
Focus the tree container after initial note selection so keyboard navigation works immediately without needing a mouse click.
feat: Cmd+N for sibling notes, edit focus improvements
…owners Workspace metadata changes (author, license, description, etc.) were written directly to workspace_meta without creating an Operation, so they never propagated to peers. Non-owners could also edit the form (only to get an error on save). - Add UpdateWorkspaceMetadata operation variant with signed op logging - Apply incoming metadata ops in apply_incoming_operation (owner-gated) - Include workspace_metadata in WorkspaceSnapshot for initial peer sync - Gate WorkspacePropertiesDialog as read-only for non-owners with hint
… gate - cargo fmt on menu.rs after merge with development - Add UpdateWorkspaceMetadata to rbac gate resolve_scope (workspace-level, no note scope)
Covers device ID migration, Tauri mobile scaffolding, adaptive layout (phone/tablet/desktop), and phased scope for iOS + Android.
Plan 1a: Device ID migration (replace MAC with persisted UUID) Plan 1b: Tauri mobile scaffolding + adaptive layout
Remove `mac_address` crate dependency and replace `get_device_id()` with
a persisted UUID seed file (`{data_dir}/device_id`). New API:
- `get_or_create_seed_device_id(data_dir)` — read/create seed file
- `resolve_device_id(conn, data_dir)` — priority chain: workspace_meta →
operations table → seed file → generate new
- `seed_file_exists(data_dir)` — check for existing seed
Migration gate in `create_workspace` blocks new workspace creation when
existing workspaces exist but no seed file is present, forcing user to
open an existing workspace first to extract and persist the device ID.
All Workspace constructors and `import_workspace` gain a `data_dir`
parameter. All 21 desktop `get_device_id()` call sites replaced with
`get_or_create_seed_device_id(&home_dir())`.
Prerequisite for mobile support — iOS/Android don't expose MAC addresses.
Run `tauri ios init` to generate Xcode project under gen/apple/. Change bundle identifier from com.2pisoftware to com.twopisoftware (mobile identifiers cannot start a segment with a digit).
Gate native menu bar, multi-window creation, file-open handlers, and paste/close commands behind #[cfg(desktop)] so the crate compiles for aarch64-apple-ios-sim. On mobile, create_workspace_window returns the existing main window instead of spawning a new one.
- On mobile, store workspace under "main" label (single-window arch) - Emit workspace-opened event so frontend refreshes after open/create - Add action buttons to EmptyState for mobile (no native menu) - Add i18n keys for launcher buttons (all 7 locales) - Fix Xcode build script PATH for npm/cargo discovery
- Add useLayout hook (phone/tablet/desktop breakpoints) - WorkspaceView renders full-screen stack nav on phone: tree fills screen, tapping a note slides right to detail view, back button returns to tree - Extract shared dialogs to avoid duplication between layouts - Add mobile.backButton i18n key (all 7 locales)
Set font-size: 16px on inputs/textareas/selects for iOS devices. Safari auto-zooms any field below 16px.
- TreeNode: long-press (500ms) triggers context menu on touch - ContextMenu: renders as bottom sheet on phone with larger tap targets - Phone tree header: add (+) button next to search bar for new root notes
On phone, the InfoPanel header switches from a horizontal row to a vertical stack — title fills full width, Save/Cancel/Edit buttons sit below as full-width touch targets.
Add a ☰ menu button to the phone tree header with access to: - New/Open Workspace - Workspace Properties, Manage Scripts, Operations Log - Manage Identities, Settings Callbacks passed from App.tsx to WorkspaceView via new props.
Add CSS media query that forces all dialog panels (children of fixed inset-0 overlays) to fit within the phone viewport with scroll when content overflows.
On phone, operations render as compact cards (target + type + time). Tapping a card expands it inline to show author, verified-by, and all operation detail fields. Desktop keeps the existing table + side panel layout.
Add key={workspace.filename} so React destroys and recreates
the component when a different workspace is opened, ensuring
all hooks re-run and load the new workspace's data.
Run `tauri android init` to generate Gradle project under gen/android/. Debug APK builds successfully for aarch64-linux-android.
On mobile, dirs::home_dir() returns a read-only path (Android) or is unavailable. Use dirs::data_dir() via a OnceLock set before AppState initialization. Both breadcrumb_dir and default_home_dir check the mobile override first.
On Android, the dirs crate doesn't resolve data_dir. Fall back to $HOME env var, then hardcoded app-private files directory.
Add viewport-fit=cover to enable edge-to-edge layout, then pad the phone layout container with safe-area-inset-top (min 24px fallback for Android where env() may not report insets).
Android WebView doesn't expose safe area insets via CSS env(). Remove enableEdgeToEdge() so the system handles status bar insets.
On API 35+ edge-to-edge is enforced. Use WindowInsetsCompat to pad the content view below the status bar and above the nav bar.
- Fix Xcode build phase to use rustup cargo/rustc instead of Homebrew (set CARGO/RUSTC env vars explicitly in project.yml) - Remove viewport-fit=cover to let WKWebView handle safe areas natively, fixing cursor offset bug in text inputs - Prevent iOS auto-zoom via viewport meta tag instead of font-size hack - Update mobile dialog CSS selector for reliable full-screen on phone - Add ios-dev.sh convenience script for simulator launches
# Conflicts: # krillnotes-desktop/package-lock.json
feat: mobile support — iOS and Android
fix: sync workspace properties via op log + read-only gate
… into development
Add Move Up, Move Down, Indent (move into sibling above), and Outdent (move out of parent) to the long-press context menu on mobile/tablet. Replaces drag-and-drop which isn't available on touch devices. Also fixes: Android build identifier (com.2pisoftware → com.twopisoftware), #[cfg(desktop)] gate on manage_scripts_menu_item, and android-dev.sh --device/--emulator flags.
Four buttons (Copy Note, Tree Actions, Invite, Share) used regular quotes instead of backticks, so itemClass wasn't interpolated — causing inconsistent padding and font sizes.
Add outline-none to suppress the browser's default black border on
the tabIndex={0} tree div. The focus-visible ring still shows on
keyboard navigation.
The tree div is just a keyboard event target — the selected node already highlights, so a container-level focus ring is redundant and visually distracting.
feat: mobile note move actions via context menu
The previous com.twopisoftware.krillnotes identifier used a domain we don't own. Switch to io.opswarm.krillnotes across Tauri config, iOS project.yml, Android build.gradle.kts, and Rust fallback path.
Instead of failing when no emulator is running, pick the first available AVD, launch it in the background, and wait for boot to complete before starting the Tauri build.
feat: mobile polish — identifier, emulator, context menu fixes
Update version in krillnotes-core, krillnotes-desktop, and tauri.conf.json. Move Unreleased changelog entries to [1.2.0] section and add missing compare links for 1.0.1–1.1.1.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge
developmentintomasterfor the v1.2.0 release.Highlights
useLayout()hook (feat: mobile support — iOS and Android #207).DirIconsymlink fix — Repacks AppImages with relative symlinks, fixing app-manager installations (PR fix: repack AppImages with correct relative .DirIcon symlink #203).krillnotes/.swarmfile associations and thetauri-plugin-deep-linkdependency (Remove file association support #145)Test plan
cargo test -p krillnotes-corepassescargo clippy --workspace -- -D warningsclean