Commit Graph
169 Commits
Author SHA1 Message Date
forkless 53faaca5ab fix: skip local canvas server start when EXPRESS_SERVER_URL is set
Docker Build (ARM64) / Build & Push (push) Has been cancelled
2026-06-25 01:47:10 +02:00
forkless 2ee3317b00 fix: remove auto-title junk from create_element handler
Docker Build (ARM64) / Build & Push (push) Successful in 2m53s
2026-06-25 01:31:54 +02:00
forkless 40b882672a fix: skip X-Tenant-Id header when EXPRESS_SERVER_URL points to remote
Docker Build (ARM64) / Build & Push (push) Successful in 2m53s
2026-06-25 01:16:04 +02:00
forkless bb710b46b0 fix: suppress CORS flood from excalidraw.com/og-image-3.png fetch
Docker Build (ARM64) / Build & Push (push) Successful in 2m4s
2026-06-25 00:52:35 +02:00
forkless 9e53a9b92c docs: update handoff with CUSTOM_VITE_WS_URL and env var details 2026-06-24 21:16:39 +02:00
forkless 7f01d76c2b fix: preserve ws:// vs wss:// scheme in URL normalization
Docker Build (ARM64) / Build & Push (push) Successful in 2m3s
2026-06-24 21:01:31 +02:00
forkless a1db6e782d feat: fully normalize CUSTOM_VITE_WS_URL (strip scheme/path, keep port)
Docker Build (ARM64) / Build & Push (push) Successful in 2m2s
2026-06-24 20:59:17 +02:00
forkless 7222c9ae63 feat: auto-prefix wss:// if CUSTOM_VITE_WS_URL is just host
Docker Build (ARM64) / Build & Push (push) Successful in 2m2s
2026-06-24 20:56:35 +02:00
forkless a8ee1c229e feat: env-var-ize WS URL as CUSTOM_VITE_WS_URL, add .env.example
Docker Build (ARM64) / Build & Push (push) Successful in 50s
2026-06-24 20:55:02 +02:00
forkless a06c3d2e36 cleanup: remove broken patch script ref + unused collab props
Docker Build (ARM64) / Build & Push (push) Successful in 2m1s
2026-06-24 20:25:09 +02:00
forkless bc5c924c8e ci: rebuild
Docker Build (ARM64) / Build & Push (push) Failing after 39s
2026-06-24 19:48:17 +02:00
forkless cc3403363c ci: rebuild with URL patch 2026-06-24 19:47:55 +02:00
forkless e44053a25d docs: agent handoff for ARM64 build & collab setup 2026-06-24 19:44:18 +02:00
forkless 6ed842dae9 fix: patch hardcoded collab URL in Excalidraw bundle at build time
Docker Build (ARM64) / Build & Push (push) Failing after 2m26s
2026-06-24 19:26:56 +02:00
forkless 0926415ffa fix: enable trust proxy for NPM reverse proxy
Docker Build (ARM64) / Build & Push (push) Successful in 2m57s
2026-06-24 19:21:26 +02:00
forkless ac638a3586 ci: retry build
Docker Build (ARM64) / Build & Push (push) Successful in 8s
2026-06-24 18:58:30 +02:00
forkless 3de5951e48 ci: retry build 2026-06-24 18:56:58 +02:00
forkless 5775ec1e3b ci: trigger build [force]
Docker Build (ARM64) / Build & Push (push) Failing after 5s
2026-06-24 18:55:36 +02:00
forkless d50de9232f ci: fresh build 2026-06-24 18:55:16 +02:00
forkless 547fd6affb fix: add onCollabDialogOpen to show share button
Docker Build (ARM64) / Build & Push (push) Successful in 2m3s
2026-06-24 18:40:40 +02:00
forkless 460671e753 perf: switch to node:20-alpine base images
Docker Build (ARM64) / Build & Push (push) Failing after 5s
2026-06-24 18:32:35 +02:00
forkless 32188d93b4 fix: collab WS path /socket.io for Excalidraw library
Docker Build (ARM64) / Build & Push (push) Has been cancelled
2026-06-24 18:31:37 +02:00
forkless 27dbc1f40e fix: back to runs-on ubuntu-latest, both runners compete
Docker Build (ARM64) / Build & Push (push) Successful in 1m28s
2026-06-24 18:27:55 +02:00
forkless 2b6500c697 fix: target ARM64 runner with label arm64
Docker Build (ARM64) / Build & Push (push) Failing after 7s
2026-06-24 18:25:36 +02:00
forkless 0e8c855818 revert: back to plain docker build (no buildx)
Docker Build (ARM64) / Build & Push (push) Failing after 1m30s
2026-06-24 18:23:10 +02:00
forkless 936dd63976 fix: use buildx --platform linux/arm64 for ARM64 cross-build
Docker Build (ARM64) / Build & Push (push) Has been cancelled
2026-06-24 18:22:41 +02:00
forkless 4dceeb2e7f fix: point frontend WS to wss://excalidraw.forkless.com
Docker Build (ARM64) / Build & Push (push) Successful in 2m2s
2026-06-24 18:18:19 +02:00
forkless a4a1b03215 fix: redirect collab WS to excalidraw.forkless.com
Docker Build (ARM64) / Build & Push (push) Successful in 2m24s
2026-06-24 18:09:31 +02:00
forkless f91082d2a3 fix: disable Excalidraw collaboration WS to oss-collab.excalidraw.com
Docker Build (ARM64) / Build & Push (push) Has been cancelled
2026-06-24 18:08:40 +02:00
forkless 82574e7308 ci: trigger build
Docker Build (ARM64) / Build & Push (push) Successful in 4m49s
2026-06-24 16:53:40 +02:00
forkless 8d99a58600 ci: trigger build with secrets 2026-06-24 16:52:47 +02:00
forkless f1b71ca5b8 ci: trigger build [force]
Docker Build (ARM64) / Build & Push (push) Failing after 5s
2026-06-24 16:37:49 +02:00
forkless a092e5b548 ci: trigger docker build 2026-06-24 16:36:11 +02:00
forkless 37be53dae8 fix: add .gitea/** to workflow path triggers
Docker Build (ARM64) / Build & Push (push) Failing after 6s
2026-06-24 16:31:26 +02:00
forkless a8723f6875 ci: ARM64 Docker build via Gitea Actions 2026-06-24 16:24:50 +02:00
046719aabc feat(transport): Streamable HTTP mode — one shared MCP process for all sessions (v1.2.0) (#13)
* chore(ci): release fires on workflow_dispatch, not on every CI pass

Replaced workflow_run trigger (fired automatically when CI completed
on main) with workflow_dispatch. The full semantic-release automation
is preserved — bump detection, version commit, tag, GitHub Release,
NPM + Docker publish — but now runs only when explicitly triggered.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(transport): add Streamable HTTP mode — one shared process for all MCP clients (v1.2.0)

Add MCP_TRANSPORT=http mode backed by StreamableHTTPServerTransport. Each
Claude Code session connects to the shared long-lived process via HTTP (port
3031 by default) instead of spawning a new stdio process per session, eliminating
per-session process multiplication. Sessions are isolated by mcp-session-id header.

Also refactor src/index.ts to extract createMcpServer()/registerHandlers() for
clean per-session server instantiation, and upgrade fs.writeFileSync/readFileSync
calls to fs.promises async variants in export/import tool handlers.

9 new tests cover transport resolution, session isolation, teardown, and
startMcpHttpServer. All 528 tests pass. Bumps v1.1.0 → v1.2.0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: newblacc <newblacc@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.2.0
2026-05-20 14:51:08 +02:00
9846e0ba0f feat(canvas): native field preservation, label materialization, batch workspace delete (#12)
* feat(canvas): native field preservation, label materialization, batch workspace delete

- fillNativeFields() + repairContainerBinding() in db layer ensure every
  element stored in SQLite is a complete, round-trippable Excalidraw element
  with correct containerId ↔ boundElements bidirectional binding
- materializeLabel() in server.ts: shapes with label.text/text produce a
  native bound text element at write time (create, update, batch) so text
  follows its container when moved — matches VSCode Excalidraw extension behavior
- Batch workspace UI: Select/Unselect All, per-row checkboxes, Delete N
  workspaces button with confirmation
- POST /api/tenants/batch-delete: delete up to 50 tenants in one request
- 42 new backend tests; 519 total passing
- Bump version 1.0.6 → 1.1.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(tests): update e2e assertions for label materialization

phase2-regressions: label is now a native bound text element
(id: pos-stable-1-label) — check bound text element text instead
of container.label?.text which is no longer stored.

sync-flows FTS: search now matches the bound text element (fts-el-label)
rather than the container — accept either id as valid match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 21:12:01 +02:00
d14d767c75 feat(tenants): add workspace delete UI and fix project switch element loading (#11)
- Add DELETE /api/tenants/:id endpoint with cascade (projects, elements, snapshots)
- Add delete buttons with inline confirm in workspace switcher panel
- Fix project switch not loading elements: switchProjectUI now directly clears
  canvas and calls loadExistingElements() instead of relying on WS roundtrip

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.6
2026-04-06 14:37:11 +02:00
Maxime Roy (new.blacc)andGitHub 1166ea5b3f chore: release v1.0.5 (#10)
feat(projects): project management UI, sync countdown, fix project switching
v1.0.5
2026-04-06 13:18:03 +02:00
798f62f63a fix(logger): make file transport opt-in via LOG_FILE_PATH (#9)
The file transport defaulted to writing excalidraw.log relative to
process.cwd(), polluting every project directory where the MCP server
started. Console transport already handles warn+error to stderr.

File logging is now opt-in: set LOG_FILE_PATH to enable it.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 10:02:27 +02:00
f770c811e9 chore: document similar-project scan in AGENTS.md; ignore .serena/ (#8)
* chore: document similar-project scan in AGENTS.md; ignore .serena/ and .DS_Store

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add .shipguard.yml — exclude node_modules, acknowledge upstream JS debt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: actually ignore .serena/ (prior commit added negation only)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: newblacc <refactor code>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:57:07 +02:00
Maxime Roy (new.blacc)andGitHub 81f38de508 Merge pull request #7 from celstnblacc/chore/release-v1.0.4
chore: release v1.0.4
v1.0.4
2026-03-31 13:21:57 +02:00
newblaccandClaude Sonnet 4.6 80c82665ea chore: release v1.0.4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 13:19:31 +02:00
Maxime Roy (new.blacc)andGitHub d020459e90 Merge pull request #6 from celstnblacc/fix/windows-postinstall
fix: make postinstall cross-platform for Windows
2026-03-31 13:18:12 +02:00
newblaccandClaude Sonnet 4.6 ae52198729 fix: make postinstall script cross-platform for Windows compatibility
Replace Unix-only `2>/dev/null || true` with a `node -e` inline script
that silently ignores better-sqlite3 rebuild failures on all platforms.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 13:14:25 +02:00
newblaccandClaude Sonnet 4.6 c368d4088a fix: upgrade zod to v4 to fix global install crash
@modelcontextprotocol/sdk@1.26.0 uses zod/v4 APIs (specifically
z.literal().value getter). When installed globally, npm shared the
project's zod@3.25.5 instead of the SDK's nested zod@4.3.6; the
3.25.5 v4 compat shim lacks the .value getter, throwing
'Schema method literal must be a string' on startup.

Also updates z.record(z.any()) to z.record(z.string(), z.any())
for zod v4 strict record key typing.

446/446 tests passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.3
2026-03-30 22:42:46 +02:00
newblaccandClaude Sonnet 4.6 d1689a2e5c chore: release v1.0.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.0.2
2026-03-30 21:32:28 +02:00
Maxime Roy (new.blacc)andGitHub d073b6348d Merge pull request #5 from celstnblacc/fix/bidirectional-sync-and-label-updates
fix: bidirectional sync, text alignment, WS race, and security hardening
2026-03-30 21:24:22 +02:00
newblaccandClaude Sonnet 4.6 64ebfc6791 fix: gauntlet hardening — alignment regression tests, cleanup, DRY, docker labels
- test: 3 regression tests for textAlign/verticalAlign/containerId REST round-trip
  (Zod was silently stripping these fields before the schema fix)
- fix: pendingTitleTimerRef cleanup on unmount (App.tsx)
- fix: localStorage JSON.parse wrapped in try/catch to prevent crash (App.tsx)
- refactor: extract seedKnownContainers() helper — 4 identical loops → 1 (App.tsx)
- chore: remove unnecessary `as any` cast on subtitle element type (index.ts)
- docs: test counts updated to 446 (README.md, CLAUDE.md)
- chore: fix stale LABEL source URLs in Dockerfile and Dockerfile.canvas

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 21:20:14 +02:00
newblaccandClaude Sonnet 4.6 87e8a8e314 fix: preserve textAlign/verticalAlign/containerId through REST round-trip
ElementSharedFieldsSchema in server.ts was silently stripping textAlign,
verticalAlign, and containerId on every POST/PATCH, causing bound text
inside containers to lose centering after a sync round-trip.

- Add missing fields to ElementSharedFieldsSchema (server.ts)
- Add textAlign?, verticalAlign?, containerId? to ServerElement (types.ts)
- Set textAlign: "center", verticalAlign: "top" on MCP subtitle elements (index.ts)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 20:56:46 +02:00