Video notes keep a hidden marker, and the note list can queue subtitle extraction. The desktop app downloads the audio with yt-dlp and sends it to the selected OpenAI-compatible speech service.
Copy images in generic page and selection clips into note resources so clips can retain them when source URLs change. Keep remote URLs for images that cannot be copied.
Protect concurrent note edits, parse Markdown image syntax correctly, and bound image transfers by time and size. Add unit and Chromium browser coverage.
Refs #159
* feat(editor): add setting to turn off spellcheck underlines
Add a device-local "Underline spelling mistakes" switch to the editing
preferences. The rich-text editor and the mobile plain-text editor now
set spellcheck from this preference and update live when it changes.
Defaults to enabled, so existing behavior is unchanged.
Refs #468
* feat(i18n): add Polish as an in-app locale
Add Polish (pl) across clients, mirroring how Japanese was added:
- Shared: full pl catalog, locale matching for pl/pl-*, Polish memo
templates and factory AI prompts, mobile editor strings, and Polish as
an AI translation target and selection-translate chip.
- Web: "Polski" in the language picker; the catalog is lazy-loaded in its
own i18n-pl chunk and kept out of the PWA precache like ja.
- Android: pl locale option, mobile-only strings, web-clip labels.
Messages that only had an English branch now use English for every
non-Chinese locale, so Japanese no longer falls back to Chinese there.
- iOS: .polish UI language (pl-PL), pl argument for every t() call,
pl in CFBundleLocalizations and Localizable.xcstrings.
- Companion: accepts locale "pl" and detects Polish requests.
- Browser extension: _locales/pl messages.
- Marketing site: /pl/ pages, hreflang, sitemap, language switcher.
- Google Play listing copy for pl-PL (manual publish only).
* fix(ios): show the note editor in Polish and Japanese
The iOS editor received every interface language except English as
Chinese, so with Polish or Japanese selected its toolbar and image
gallery controls were labeled in Chinese. Pass Polish and Japanese
through to the embedded editor, label its toolbar and the shared image
gallery controls in both languages, and rebuild the checked-in
EditorBundle. The Android editor uses the same gallery labels.
Also translate the last iOS strings that had no Polish text: the
follow-system language label, note created/updated times and the
current-device marker.
Refs #473
* fix(companion): recognize Polish typed without diacritics
Requests in Latin letters without Polish diacritics were always treated
as English, so with a Polish interface "Napisz plan na jutro" got an
English reply. With a Polish interface, such text is now told apart by
common English and Polish words; when it is still unclear, the recent
conversation and then the interface language decide. Other interface
languages keep treating Latin text as English.
Refs #473
* chore(ios): regenerate the Xcode project for Polish
Run xcodegen so the shipped Info.plist lists Polish in
CFBundleLocalizations and the project knows the pl region. The
hand-written AiDirectStream.swift entries are replaced by the IDs
xcodegen generates. MARKETING_VERSION and CURRENT_PROJECT_VERSION stay
in the project file because the release script and Xcode Cloud update
them there.
Refs #473
* i18n(pl): translate the sidebar shortcut, desktop menus and video scope
Add Polish for features that reached main while this branch was open:
the show/hide sidebar shortcut label, the desktop application and
editing context menus, and the new "ai:generate" MCP scope. The desktop
menus switch to Polish for pl and pl-* locales; other locales are
unchanged.
Refs #473
Streaming unzip treated ZIP signatures inside stored .docx, .xlsx, and .pptx files as archive entries. Read each entry from the central directory so existing exports restore.
Text-note card menus can copy the note as rich text. The open note uses the editor, including unsaved changes; other notes copy saved content without switching the editor.
ParentNode.append is the Workers stream helper under the root typecheck, so the preview attaches DOM nodes with appendChild. The sync queue test restores navigator after forcing onLine, so a later headless TipTap test can still read userAgent.
The clipboard notice was brand green, then a white card that disappeared on the note. Use a near-black success toast, and show it after copying for WeChat, WordPress, and Substack now that the action sits in the more menu.
Tweet clips and other Markdown images had no stored width, so the editor showed them at the large preset. Missing widths now follow the same 35% size used when inserting a picture.
Create missing Wrangler assets directories before development startup. Add regression coverage for creation before CLI invocation, preservation of existing assets, and non-dev command behavior.
Validation: typecheck, typecheck:mobile, build:web, and all 2244 non-E2E tests passed.
Wrangler refuses to start `dev` when the configured `[assets].directory`
is missing and offers no option to create it. Local development serves
the web app from Vite, so `apps/web/dist` only exists after a previous
`build:web`; a fresh clone or `git clean` made `bun run dev` fail.
Resolve the directory from the effective Wrangler config (so custom
configs via WRANGLER_CONFIG are honored) and create it for every `dev`
command routed through run-wrangler. Deploy and migration commands are
unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Store the selected built-in note font on the account and apply it to the shared note body. System and custom font names keep the default face, so a share downloads a font only after one is chosen.
Dark mode inverts slate-900, so the login card's large shadow painted a light ring. Use a real black shadow and leave the brand wash, button glow, and frosted glass unchanged.
Allow owners to turn on an auto-generated access password when sharing a note. Visitors must unlock the share page before reading the note or its attachments; existing public links stay open until a password is enabled.
Cmd+N and a second click could both create before isPending flipped.
Sync also left the local id in the list beside the durable id, and
autofocus stopped before the editor was editable.
Editors now take document TipTap nodes from a shared factory. Workspace and editor helpers move out of the large panes. Store iOS no longer builds from Expo EAS.
Give GitHub a first-class Japanese landing page that tracks the English README, and require future README edits to update Chinese, English, and Japanese together.
Ship a full shared Japanese catalog for Web, desktop, and Android, resolve ja-JP to ja instead of English, and give iOS a three-language path with Japanese login, settings, and list chrome. Unmatched languages still fall back to English.
Unknown browser and system languages now resolve to English instead of
Simplified Chinese, and Japanese App Store / Play listing copy is kept
in store-assets for console publishing.
Open the existing detail WebView in place instead of waiting on a
network refresh and a second editor startup. Close is queued while a
save is in flight so back/done still respond, and the DomWebView
unmounts with the modal to avoid injectJavaScript after hide.
Default to a custom instruction without a selection and to polish with one. Remember the last action separately for each scope, keep the composer from overriding selected text, and quiet the action-row chrome.
Desktop, Android, and iOS call the configured model API after a short prepare hop so Cloudflare no longer sits in the token path. The web app probes CORS first and direct-connects only when the host allows it; blocked hosts keep using the instance proxy without downloading the API key.
Add a bulk Markdown ZIP action for selected notes, reuse the existing
readable export layout, and keep the desktop bulk action card visible
when a diagram note is open.
Selecting a tag kept showing every note because json_each on the full memo blob could fail or stall. Match tags from parsed memo data and paginate after filtering.
Refs #366