Commit Graph
194 Commits
Author SHA1 Message Date
tianma-if 46f1c7d764 feat(speech): extract video-note subtitles from a workspace speech service
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.
2026-10-07 11:36:12 +08:00
tianma-if 3e0ec79575 docs(deploy): update AI Agent deployment heading across READMEs and site 2026-10-07 10:33:50 +08:00
Dariusz Koryto 40321fe1f8 feat(extension): keep page clip images inside the note (#474)
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
2026-10-06 16:24:49 +08:00
Dariusz Koryto 80dadb3194 feat(i18n): add Polish as an in-app locale (#473)
* 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
2026-10-06 16:18:38 +08:00
tianma-if 0e546ec834 feat: show instance deployment time in system info 2026-10-02 16:29:32 +08:00
tianma-if 21ddc90267 test(markdown): expect medium width for new images 2026-10-02 00:40:57 +08:00
tianma-if 12af0581d2 fix(web): import backups that contain Office attachments
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.
2026-10-01 22:32:19 +08:00
tianma-if 27d3b1ce96 test(release): stabilize ACP bridge and installer checks 2026-10-01 12:52:16 +08:00
tianma-if 65ef837f45 feat(web): copy a note to WeChat from the card menu
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.
2026-09-30 20:12:49 +08:00
tianma-if ae6ae99eeb feat: integrate structured GitHub issue forms and prefilled feedback URLs 2026-09-30 17:49:20 +08:00
tianma-if 1769907288 refactor(settings): polish AI model services card copy and update e2e spec 2026-09-30 12:36:39 +08:00
tianma-if 0c5ce83dad fix: keep release checks green for the note CSS preview and undo test
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.
2026-09-30 02:03:20 +08:00
tianma-if fe90dfa9af fix(web): put the agent source ahead of model settings
Rename the settings tab to 模型与代理 and point model setup copy at that tab. The built-in assistant uses the model configured below.
2026-09-30 00:00:27 +08:00
tianma-if 50bda545a2 fix(web): mark a shared note with a pale gray share button
The header share icon only shifted between two grays, so an active public link was hard to see.
2026-09-29 00:12:57 +08:00
tianma-if 628016729e fix(web): confirm hidden platform copy with an ink toast
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.
2026-09-28 00:23:14 +08:00
tianma-if 594658ccad fix(editor): group consecutive Markdown images into a gallery
A tweet clip with several photos now opens as one gallery, while a single image stays on its own.
2026-09-27 11:16:27 +08:00
tianma-if 1ec4bfc06f fix(editor): use the small image size for Markdown pictures
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.
2026-09-27 11:10:07 +08:00
tianma-if aaf3dacfb6 fix(mobile): keep in-note search on one row
The search field, match count, and previous, next, and close controls sit on a single bar.
2026-09-26 18:26:11 +08:00
tianma-if 509d523f00 Merge pull request #435 from sivdead/fix/dev-assets-directory
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.
2026-09-26 11:57:51 +08:00
tianma-if d577ed7413 test(web): align chrome assertions with the current workspace 2026-09-26 01:10:52 +08:00
sivdeadandClaude Opus 5.5 25e4a91739 fix(dev): create the Wrangler assets directory before wrangler dev
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>
2026-09-25 11:15:28 +08:00
tianma-if 0f3aec1679 feat(web): open, copy, and download table image attachments
Clicking an image thumbnail opens the file. Copy and download appear on hover, and copy places the image on the clipboard.
2026-09-23 23:35:32 +08:00
tianma-if bf0d51a02d fix(web): keep note sharing available while reading is locked (#428)
Reading protection and the phone reading view no longer block the share dialog. Phones get a header button that opens the existing link.
2026-09-23 16:19:11 +08:00
tianma-if f1949e795f feat(sharing): show the author's built-in font on public shares
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.
2026-09-23 00:09:28 +08:00
tianma-if 6580bec3b1 feat(mobile): change notebook from note view without editing 2026-09-20 21:39:18 +08:00
tianma-if dcf2c138cb feat(web): support rich-text headings through level 6 (#413) 2026-09-18 16:20:32 +08:00
tianma-if de7e006e57 fix(desktop): accept instance hosts without an https prefix 2026-09-17 21:32:59 +08:00
tianma-if d81ee60c58 fix(web): keep login card shadow from becoming a dark-mode halo
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.
2026-09-17 17:26:26 +08:00
tianma-if dcfd11468d feat(sharing): add optional password protection for public note shares
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.
2026-09-17 14:44:43 +08:00
tianma-if 8112d86bb0 fix(editor): quiet the empty-paragraph placeholder
Keep the hint at body size, but shorten the copy, drop the leading
Latin "Space", and use a lighter color so it no longer reads as a
larger type size.
2026-09-16 20:54:05 +08:00
tianma-if df7931e2f6 fix(desktop): keep one new note from appearing twice
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.
2026-09-16 18:18:59 +08:00
tianma-if 99e9c2820c refactor: share editor schema and drop RN iOS builds
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.
2026-09-15 12:56:44 +08:00
tianma-if b346400f6a test: align coverage with Japanese locale and create-note layout
Update source and locale tests that still treated Japanese as unmatched English and pinned the previous fixed-width New note control.
2026-09-14 18:19:31 +08:00
tianma-if c7f05c672a docs: add a Traditional Chinese README and language switcher 2026-09-14 18:07:08 +08:00
tianma-if 2b49d36575 docs: add a Japanese README and language switcher
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.
2026-09-14 15:56:21 +08:00
tianma-if ea9900b7e2 feat(i18n): add Japanese as a first-class in-app locale
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.
2026-09-14 12:49:11 +08:00
tianma-if 760e82ab50 fix(i18n): fall unmatched locales 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.
2026-09-14 10:56:53 +08:00
tianma-if cf082734d6 fix(ai): default the whole-note assistant to a custom instruction
Restore the last processing method only when text is selected so Space and other whole-note opens start on custom.
2026-09-13 23:24:06 +08:00
tianma-if bb43940135 feat(ai): replace social starter prompts with note workflows
Keep six factory prompts, swap Xiaohongshu and Twitter presets for extract-todos and continue-writing, and use four-character Chinese names.
2026-09-13 22:11:35 +08:00
tianma-if 8e2dfec1b4 fix(mobile): enter note editing without remounting the viewer
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.
2026-09-12 23:02:02 +08:00
tianma-if 31ae9c975c feat(ai): open the assistant from selection or the whole note
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.
2026-09-12 10:08:57 +08:00
tianma-if 42a2d2da4e feat(ai): remember the last assistant action
Reopen the assistant on the last processing action, prompt, language, and
tone across web, Android, and iOS.
2026-09-12 00:07:20 +08:00
tianma-if 2cec726f43 feat(ai): stream note generation from the client when the model host allows it
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.
2026-09-11 18:34:55 +08:00
tianma-if a4a10a32b9 feat(web): export selected notes as a Markdown ZIP
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.
2026-09-10 17:07:46 +08:00
tianma-if d41d068e0c fix(mobile): apply exact tag filters on Android and iOS lists
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
2026-09-10 11:48:13 +08:00
tianma-if 594c8c9ce7 feat(mobile): filter notes from a visible tag chip
Replace the tagged/untagged toggles with the specific-tag picker on Android and iOS so the list filter matches desktop.

Refs #366
2026-09-10 00:32:47 +08:00
tianma-if b82719abdb test desktop private protocol file flows 2026-09-09 11:19:12 +08:00
tianma-if 533a9bf638 test: isolate filesystem integration suites 2026-09-05 23:55:49 +08:00
tianma-if 2b9d568045 ci: pin the Bun toolchain across workflows 2026-09-05 23:43:38 +08:00
tianma-if 09b8b14668 test: tolerate slower CI integration tests 2026-09-05 23:24:55 +08:00