Skip to content

Releases: ivanlee1999/bopa

Bopa 0.8.2

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 19 Oct 21:40
c7f667d

Bopa 0.8.2 (build 10)

Fixes

  • Preserve an active paragraph when a remote update both deletes its old identity and
    adds or erases handwriting. Refresh paragraph tombstones while the draft safely
    defers the canvas reload, then save the draft under a new identity.
  • Keep all undo/redo actions for one paragraph attached to its latest restored identity
    across multiple editing sessions and saved deletions. Earlier edits, moves and
    resizes no longer append duplicate replacement paragraphs.
  • Keep drawing Options from opening an unwanted software keyboard. A drawing-only
    input view preserves the full page; real text editing retains its normal keyboard.

Validation and limits

Regression-only CI reproduced draft text disappearing from disk after combined remote
updates and duplicate paragraphs after multi-session redo: three tests failed before
these fixes. Additional coverage checks saved deletion followed by undo/redo through
older edit, move and resize actions, repeated identity replacements, and neighboring
text. The Options baseline failed on both iPad and iPhone; fixed UI tests verify no
keyboard or lost canvas height, drawing/undo, and real text keyboard behavior.

CI runs app/model tests, iPad and iPhone UI tests, NotableKit, Mac Catalyst compilation,
and cross-repository sync-vector parity. Release metadata is verified by its own CI.
CouchDB-dependent app tests and external server/scenario kit tests self-skip without
their test environment; these skips are not passing integration tests. Screenshots
are reviewed for the tested simulator layouts, not every split-view or VoiceOver mode.
Hardware keyboard shortcuts retain their implementation but need physical-device checks.

The pre-existing final Apple Pencil pressure/save timing race remains unresolved and
requires physical-device validation. Completely ambiguous multiple edited/reordered
strokes sharing a creation timestamp still lack a general identity solution. The wire
exporter does not promise every PencilKit-only force/appearance field. Test rapid ink,
immediate navigation/backgrounding, undo and remote changes with a physical Pencil.
No speculative lifecycle timing or callback-counting change is included.

Source-only distribution

After all test/build jobs pass, Actions creates source ZIP/tar.gz archives, BUILD-INFO.txt
with the exact tested commit, and SHA256SUMS. PR artifacts identify merge previews; main
artifacts identify the actual merged commit. Actions artifacts last 30 days; GitHub
Release source archives are source code only.

No signed app, IPA or TestFlight build is provided. CI disables signing. Installable
iOS builds require Xcode, an authorized Apple Developer team, signing certificate and
provisioning profile; Mac distribution additionally requires Developer ID signing and
notarization credentials. This workflow does not provision them.

Verified release run

All six main jobs passed on commit c7f667d in CI run 39318498675, attempt 2. The app suite ran 529 tests with 9 CouchDB-dependent skips; NotableKit ran 374 tests with 12 external-environment skips. All 17 iPad UI tests and 8 iPhone UI tests passed. Skipped tests are not passing integration tests.

The first main iPad run encountered an animation/accessibility synchronization stall and failed. One retry passed on the unchanged commit, without weakening assertions. This retry does not establish an app fix for that stall.

The verified source package includes exact-commit BUILD-INFO.txt and verified checksums and is retained for 30 days.

Bopa 0.8.1

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 19 Oct 18:58
f073ec5

Bopa 0.8.1 (build 9)

Changes

  • Calmer writing header with one forward/add-page control, more room for the notebook
    title, visible Options and a separate page-control row at accessibility text sizes.
  • Compact toolbar keeps writing, eraser, selection, text, undo, redo and ink within
    reach. Return to the previous writing tool in one tap; tap the selected tool for
    settings. Large-text settings use a full-width sheet with a pinned close button.
  • Notebook switcher uses a quiet monochrome list and clearly marks the current notebook.
  • Preserve changed stroke snapshots, including saved lasso undo, restored erasures and
    same-count geometry/width/ink changes. Content matching preserves untouched imported
    wire data and reserves unchanged timestamp siblings before edits claim their identities.
  • Keep active typing on its originating page during remote deletion, then recover text
    and handwriting into a separate notebook. Explicit local deletion discards the draft;
    late finish/undo callbacks cannot write it onto another page. Recovery retries preserve
    deletions without resurrecting the removed source.
  • Keep whole-paragraph undo when finishing text through a tool change or navigation.
    Undo/redo follows fresh block IDs across saved deletions and remote tombstones.
  • Fix an iPad Options-menu freeze: undo availability checkpoint notifications were
    republishing unchanged state and repeatedly rebuilding the native menu. Refresh now
    guards reentry and publishes only changes, with undo/redo and manager-switch tests.

Validation and limits

CI runs NotableKit, iPad app/unit/UI tests, iPhone navigation UI tests, Mac Catalyst
compilation and cross-repository sync-vector parity. UI coverage includes switching
with persisted ink/text, page creation, undo isolation, rotation, background relaunch,
visible compact controls, Options and accessibility-size layouts. Simulator screenshots
are reviewed; this does not establish every split-view size or VoiceOver behavior.

The regression-only baseline reproduced 17 failing data-safety tests before the fixes,
including text persisted onto an unrelated landing page and saved undo retaining moved
ink coordinates. Release version metadata is checked by the release revision's own CI.
CouchDB-dependent app tests and server/scenario-dependent kit tests self-skip without
their external test environment. A green run does not mean those skipped tests passed.

Content matching detects saved geometry/width changes without assuming when PencilKit
has finished a stroke. Completely ambiguous multiple edited/reordered strokes sharing
a creation timestamp still lack a general identity solution. The wire exporter does
not promise to retain every PencilKit-only force/appearance field. The existing
tool-down/tool-up lifecycle and save timing are unchanged. Final Apple Pencil force
updates can arrive after pencil-up; the pre-existing
final-pressure/save race remains unresolved and requires physical-device validation.
See Introducing PencilKit (WWDC 2019).
Test rapid strokes, immediate page/notebook changes, backgrounding, undo and remote
updates with a physical Pencil before relying on pressure-perfect archival capture.
No speculative callback-counting or delayed-save mechanism is included.

Source-only distribution

The Actions source-package job runs only after all five test/build jobs succeed. It
produces committed-source ZIP and tar.gz archives, BUILD-INFO.txt identifying the exact
tested commit, and SHA256SUMS. PR artifacts identify a merge-preview commit; main runs
identify the actual merged commit. Artifacts are retained for 30 days. GitHub Release
source archives are also source code only.

No signed app, IPA or TestFlight build is provided. CI disables code signing. An
installable iOS archive requires Xcode, an authorized Apple Developer team, signing
certificate and provisioning profile. Mac distribution additionally requires Developer
ID signing/notarization credentials. The source workflow does not provision these.

Verified release run

All six jobs passed on f073ec5: https://github.com/ivanlee1999/bopa/actions/runs/39301964307 . The app suite ran 524 tests with 9 CouchDB-dependent skips; NotableKit ran 374 tests with 12 external-environment skips. All 16 iPad UI tests and 7 iPhone UI tests passed.

Verified source package (30-day retention): https://github.com/ivanlee1999/bopa/actions/runs/39301964307/artifacts/12213556707

Known minor issue

Opening Options can currently show an unwanted software keyboard while Pen is selected; a separate draft PR #80 is testing a fix and is not included in this release.

Bopa 0.8.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 18 Oct 23:39
98f7c81

Bopa 0.8.0 (build 7) makes it easier to resume notebooks and preserves active text when leaving the editor.

  • Recent notebooks in the shared library/sidebar, with search and a Command-K notebook switcher.
  • Commit text before switching notebooks, closing the editor or entering the background.
  • Protect navigation during active tool gestures; preserve page-turn shortcut guards for existing and new text sessions.
  • Reconcile sync immediately when switching between notebooks, and preserve the originating ink tool when filing strokes across the top seam.
  • Add iPad and iPhone navigation/persistence coverage, rotation screenshots and exact build-identity checks.

Validation: all six GitHub Actions jobs passed on release commit 98f7c81: NotableKit, iPad app/unit/UI tests, iPhone navigation UI tests, Mac Catalyst compilation, sync-vector parity and source packaging. App tests ran 491 tests with zero failures and nine CouchDB integration tests skipped because no server was configured. All 13 iPad UI tests and four iPhone UI tests passed. CI: https://github.com/ivanlee1999/bopa/actions/runs/39174963959

The experimental wait-for-final-drawing-callback behavior was removed before release because anonymous PencilKit callbacks cannot safely identify completion and unchanged gestures may produce no mutation callback. This release retains the established tool-down/tool-up lifecycle and save timing. The pre-existing physical Apple Pencil final-pressure/save timing limitation remains unresolved; simulator tests do not establish pressure-perfect capture. Physical Pencil validation is still required for rapid strokes, immediate navigation/backgrounding and remote updates.

This is a GitHub source release. It does not distribute an App Store, TestFlight or signed installable build. CI explicitly disables signing. Apple Developer signing/provisioning and Mac notarization credentials have not been provisioned or verified.

A separately checksummed CI source package, with exact commit metadata, is available for 30 days: https://github.com/ivanlee1999/bopa/actions/runs/39174963959/artifacts/12154403328

Bopa 0.7.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 19 Sep 19:16
fce0eb7

Groundwork for daily notes. There is nothing new to see in the app — this release exists so that the format is on both devices before either starts writing it.

The plan is one vertically infinite canvas per calendar day, on which you lasso a region and link it to a notebook; the notebook then shows those linked day-regions beside its own pages. This is the first of four changes toward that, and it is entirely below the waterline.

  • Identifiers both devices compute rather than mint. A journal notebook, a day's page and the folder they live in take ids derived from the year and the date, the same hashing the page split has used since sheets existed. Two tablets that open the same Tuesday with no network write to one page and merge it, instead of making two that nothing can reconcile.
  • A page may declare that it does not end at its sheet. A day is not a sheet of paper that ran out, so a page marked layout: "scroll" is exempt from the division that otherwise cuts a tall page into one page per sheet. Such a page still writes a height covering its ink, which is what stops an older build carving a day into pieces.
  • A block may point at a notebook. The link kind carries the strokes a region was lassoed from, a cached rectangle and the notebook (optionally the page) it points at. The region follows the ink if it is moved; erasing the ink hides the link rather than deleting it; nothing is ever written into the target, so "what links here" stays a local scan.

Validation: GitHub Actions on the release commit — NotableKit, the App unit tests on an iPad simulator including the XCUITest suite, the Mac Catalyst build, and the notable merge-vector check. All green; nothing was built locally, which on this side is not a preference but a constraint — NotableKit needs CryptoKit. Fifteen new conformance vectors went in with the change, and each new merge vector was additionally checked against an independent transcription of the merge for all four required properties; that transcription also reproduces all 47 pre-existing page and notebook vectors.

Compatibility: three additions to the sync protocol (§1.3 derived identifiers, §3.3.3 layout, §3.3.1a the link block) and no new document types. Pages sync with Notable 0.53.0, which gains the same three. An older peer is the reason the rollout is staged this way: it carries an unknown block kind through untouched, but it erases an unknown field the next time it writes the document back, so layout has to reach both devices before anything writes it.

This is a GitHub source release. It does not distribute an App Store or TestFlight build.

Bopa 0.6.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 16 Sep 18:52
6acf85b

A page takes typing now, not only handwriting.

  • Pick the new Text tool and tap anywhere on the page to put a text box there, with the keyboard already in it. Tap a box to edit it, drag it to move it, drag its right edge to set how wide it wraps.
  • Write over your typing. Text sits under the ink, so a box can be circled, underlined and annotated like anything else on the page.
  • Type markdown and see it set: headings, bold, italic, bullet and numbered lists, inline code and links. A box you are editing shows the source you typed, so the markup stays yours to change.
  • Remove a box with Delete on the keyboard bar, or by leaving it empty. Undo treats a whole edit as one step, the way it treats a stroke.
  • Typed text reaches page thumbnails and the preview under the seam, so a page of notes no longer looks blank until you open it.

Validation: GitHub Actions on the release commit — NotableKit, the App unit tests on an iPad simulator including the XCUITest suite, the Mac Catalyst build, and the notable merge-vector check. All green; nothing was built locally. One UI-test flake (testFingerDragProducesStroke, whose stroke had in fact been drawn) cleared on a rerun of the same commit.

Compatibility: no change to the sync protocol, the page file, or any conformance vector. A text box is the kind: "md" page block the protocol has carried since §3.3.1 landed — this release is the first that can write one. Pages sync with Notable 0.52.0, which gains the same tool; an older peer carries the boxes through untouched without drawing them.

This is a GitHub source release. It does not distribute an App Store or TestFlight build.

Bopa 0.5.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 11 Sep 18:30
455a8e6

The library gives its space back to the notebooks.

  • Navigate folders in the sidebar — it is now a folder tree, so a notebook is drawn once, on its cover in the grid, instead of twice.
  • Reach every shelf control from the top right: + creates a notebook, the gear holds layout, sort, new folder, rename folder, Sync now, Trash and Settings.
  • See more of the library at a glance: the header is two rows rather than four, with the folder toggle, breadcrumb, title and search in front of you.
  • Read a folder's contents from its row — each one still counts everything filed directly inside it.

Validation: GitHub Actions on the release commit — NotableKit, the App unit tests on an iPad simulator including the XCUITest suite, the Mac Catalyst build, and the notable merge-vector check. All green; nothing was built locally.

Compatibility: no change to folders.json, notebook manifests, or the sync protocol. The Grid/List and sort preferences carry over from 0.4.0 — they moved into the gear menu, not into new storage.

This is a GitHub source release. It does not distribute an App Store or TestFlight build.

Bopa 0.4.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 11 Sep 08:18
1a4de58

The library and notebook controls now follow a consistent structure across Bopa and Notable.

  • Find notes with explicit Grid/List controls, corrected sorting, accurate edit dates, and clear folder navigation.
  • Recognize notebooks by their actual first page and matching cover colors across devices.
  • Create notebooks with a paper choice; resume the last successfully opened page.
  • Reach notebook, page, outline, bookmark, and Trash actions through visible menus.
  • Keep writing history reachable, use larger ink controls, and see live sync progress in Settings.
  • Use scene-aware Mac shortcuts for notebook creation, search, settings, and page navigation.

This is a GitHub source release. It does not distribute an App Store or TestFlight build.

Bopa 0.3.1

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 11 Sep 02:27
a1cbc88

Reliability and interface improvements for handwriting on iPad and viewing on Mac.

  • Keep unsaved ink on screen when a local save fails; Retry must succeed before page navigation or returning to the Library.
  • Recover unsaved handwriting into a separate notebook if another device deletes its page or notebook, including during an active stroke or save.
  • Flush before opening the page overview so Duplicate includes the latest handwriting.
  • Refit whole pages after height-only window resizing while preserving deliberate zoom.
  • Keep compact Undo/Redo reachable, enlarge top-bar controls, expose page navigation in Options, and improve selected-tool accessibility.
  • Preserve upload failures through successful downloads and fix debounce/retry task lifecycle.
  • Defer WebDAV deletion of an open notebook until the editor closes.

Compatible with Notable 0.49.0; no sync-format change. This is a GitHub source release, matching prior Bopa releases, not a TestFlight or App Store upload.

Recovered notebooks contain handwriting, page size, and native paper; already-deleted PDF/image attachments are not recovered. Failed-save navigation guards do not veto system window closure or forced app termination. WebDAV deletion still wins after the notebook closes. Physical stylus latency, palm rejection, and two-device offline/reconnect validation remain hardware follow-ups.

Changes: #68

Validation: full CI passed the Mac build, shared merge-vector check, 340 package tests (12 server-dependent skips), 420 app tests (9 server-dependent skips), and all 8 iPad UI tests. Local quick and UI tiers also passed.

Bopa 0.3.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 02 Sep 05:05
6d76d87

Highlights

  • Now on the Mac. The same app builds as a Mac Catalyst app — library, editor, CouchDB and WebDAV sync, PDF-backed pages — with the trackpad drawing and ⌘[ / ⌘] / ⌘⇧N turning and adding pages, since a mouse wheel cannot pull past the bottom of a sheet. The window opens at a sensible size, Pencil settings stay out of the way, and Show Notebooks in Finder reveals the container that is otherwise invisible. scripts/archive.sh … mac exports a Developer ID-signed, notarised .app; CI builds the Mac target on every push.
  • A page can carry typed content. Pages gained blocks — typed markdown paragraphs, pictures, voice recordings and ink groupings — with their own tombstones, merged per block like images so two devices editing different paragraphs both keep their edits, and preserved through every path that rewrites a page (split, duplicate, save). Nothing here creates one yet; this is the half that must be on every device before a writer ships, because a peer that does not carry a block deletes it.
  • The protocol says so. couch-sync-protocol.md gains the block schema, mergeBlocks, the block tiebreak, the page-split rule (flowing paragraphs stay on the first sheet; positioned blocks divide like images), 30-day pruning of block tombstones, and §9's markdown segmentation rule — a transport granularity, not a parser — with 57 merge vectors and 22 segmentation cases byte-identical in both repos.
  • Assets a block names are fetched. Sync learns the audio/ folder and the audio/mp4 sniff, pulls the bytes a block references, and keeps a block typed through a merge.
  • The paper you choose sticks. Picking a template applies to every new page of that notebook, on both devices.

Validation

  • NotableKit: full suite green (swift test) on CI at the released commit.
  • iPad app: full simulator suite (unit, snapshot and UI) green on CI; the Mac Catalyst build job green.
  • Merge vectors and markdown segmentation cases diffed byte-for-byte against Notable's on every CI run.
  • The Mac build has not been exercised by hand; docs/mac-checklist.md is the list to run through before trusting it.

Compatibility

Syncs with Notable for BOOX v0.48.0. Both apps carry blocks and block tombstones, divide pages by the same rule, and segment markdown identically (markdown-blocks.json). Older peers (Notable < 0.47.0, Bopa 0.2.0) strip blocks on save — they come back on the next merge, but a block deletion may not stick until every device is updated.

Bopa 0.2.0

Choose a tag to compare

@ivanlee1999 ivanlee1999 released this 21 Aug 04:06
a03169d

Highlights

  • A page is a sheet now. Pages have a real paper size, and writing past the bottom divides an overgrown page into pages rather than letting one canvas run on forever. Continuous scrolling carries you across the seam; pulling past the bottom turns the page whichever way pages turn, and the reader chooses which way that is.
  • A way around a long notebook. The navigator panel gains bookmarks, a handwritten outline, and a page overview — three tabs, one way in — and they travel through sync.
  • The tool rail grew up. A wider five-step nib ramp, the full twelve-ink palette, and an eraser with the same width steps as the pens.
  • The Trash means the same thing on both devices. Folders and notebooks throw away and come back whole — subtrees included — and trashings that only ever happened on the iPad now reach the server.
  • Sync got harder to fool. A resurrected notebook is pushed as a create (CouchDB refuses the alternative); deletion-vs-edit is answered by page clocks now that ink no longer touches the notebook envelope; timestamps come from a clock corrected for server skew; the checkpoint can no longer outrun a write it describes; the change feed survives partial responses and lost races; conflicts back off instead of burning their retries; images and file-backed backgrounds travel as assets with real tombstones and garbage collection.
  • Ink is safer at the edges. The page flushes on every way out of the editor, unsaved ink survives a failed flush before a fold, a stroke keeps one identity for as long as it lives, and ink lands on the paper wherever the view happens to be looking.

Validation

  • NotableKit: full suite green (swift test), locally and on CI.
  • iPad app: full simulator suite green on CI at the released commit.
  • Real-server CouchDB tests skip when no server is configured, as in v0.1.0; the fake-server scenario suite runs in full.

Compatibility

Syncs with Notable for BOOX v0.38.0. Both apps now run PageSplit with deterministic page ids, share the twelve-ink palette by position, and read liveness from page clocks (§6.4).