Docker instances reported most deployment fields as unknown. Report how
and when the container image was built, separately from how the
instance was deployed:
- Dockerfile: optional EDGE_EVER_BUILD_CREATED_AT, EDGE_EVER_BUILD_TRIGGER
and EDGE_EVER_BUILD_METHOD build args, empty by default.
- /api/health (self-hosted-bun only): optional buildCreatedAt and
buildProvenance. deploymentVersionCreatedAt and deployment keep their
meaning and stay runtime-supplied; Cloudflare responses are unchanged.
- docker-image.yml: official images record the build time and their
provenance. Draft-release builds dispatched with release_tag are
github_release, main pushes main_push, other dispatches manual.
The container test checks the health response for a metadata build
with runtime overrides and for a default self-build; the post-publish
audit checks the published image.
- Add an explicit `docker` deployment method. It is never inferred from
the runtime, and the registry source still comes only from
EDGE_EVER_CONTAINER_IMAGE.
- Web/desktop show "Image built at" and "Image build source" for Docker;
Android shows "Image built at". Older clients ignore the new fields.
- Document the build args and runtime variables in both Docker guides.
Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
Public share and form pages only added a robots meta tag from JavaScript,
so the HTML for /share/* and /form/* was served without any indexing or
caching directive, and the form page had none at all. Error responses
from /api/public/* also lacked X-Robots-Tag.
Send one policy everywhere a token-bearing link is served:
X-Robots-Tag: noindex, nofollow, noarchive, nosnippet, noimageindex
Cache-Control: private, no-store
Referrer-Policy: no-referrer
- /api/public/*: shared middleware in the application, so it applies on
Cloudflare and Docker, including 404/403 responses. Routes that already
set Cache-Control keep it.
- /share/* and /form/* HTML: _headers rules for Cloudflare static assets
and the self-hosted static server.
- Referrer-Policy keeps the share token out of Referer headers sent to
linked sites.
robots.txt is deliberately not used to block these paths: a disallowed
URL can still be indexed from external links, because crawlers never see
the noindex header.
Co-authored-by: tianma-if <yingwaizhiying@gmail.com>
* feat: add table context menu with copy and paste
* fix(web): preserve native input and test table context menu regressions
* fix: harden table context actions and desktop clipboard
Search raw Markdown in source mode with literal character matching, batched undoable replacement, and matching highlights. Preserve query whitespace and keep replacement focus stable. Route source editor search shortcuts through the workspace controller.
Validation: 141 editor tests and 2 Chrome end-to-end cases passed; web and mobile typechecks and the web build passed.
Refs #574
* feat(web): improve editor resizing and header visibility
Prioritize note titles, compact notebook and tag controls by available space, preserve Smart Tags, and show accessible tooltips. Share pane-width limits across layout and resizing.
Validation: web/mobile typechecks and web build pass; 3002 bulk tests and 17 integration tests pass. One OpenClaw ACP timeout also reproduces on unchanged upstream/main 3855efb3. This commit builds on the existing notebook-pane resizing contribution 17f0898a.
* fix(web): handle constrained editor resizing
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>