TC
синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала
825b716948 Update multiple dependencies and add LoongArch64 support (#300)
* Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255)
Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1.
- [Release notes](https://github.com/go-git/go-git/releases)
- [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md)
- [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1)
---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
dependency-version: 5.19.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump golang.org/x/image from 0.33.0 to 0.41.0 in /src (#265)
Bumps [golang.org/x/image](https://github.com/golang/image) from 0.33.0 to 0.41.0.
- [Commits](https://github.com/golang/image/compare/v0.33.0...v0.41.0)
---
updated-dependencies:
- dependency-name: golang.org/x/image
dependency-version: 0.41.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump golang.org/x/net from 0.53.0 to 0.55.0 in /src (#262)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.53.0 to 0.55.0.
- [Commits](https://github.com/golang/net/compare/v0.53.0...v0.55.0)
---
updated-dependencies:
- dependency-name: golang.org/x/net
dependency-version: 0.55.0
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump golang.org/x/crypto from 0.50.0 to 0.52.0 in /src (#274)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.50.0 to 0.52.0.
- [Commits](https://github.com/golang/crypto/compare/v0.50.0...v0.52.0)
---
updated-dependencies:
- dependency-name: golang.org/x/crypto
dependency-version: 0.52.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Toby Chui <tobychui@users.noreply.github.com>
* V3.0.1 (#285)
* Add CalDAV server for iOS Calendar bidirectional sync (#256)
Add CalDAV server for iOS Calendar bidirectional sync (#256)
* Updated CLAUDE.md (#257)
* Updated CLAUDE.md
* Add Reminders WebApp
* Add Reminders WebApp (macOS Reminders-style)
A self-contained ArozOS WebApp that mimics the macOS Reminders app.
Front-end (web/Reminders/index.html), single-page, no framework:
- Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a
Completed card — plus custom "My Lists" with colour + SF-style icons and
live incomplete counts, an Add List action and a light/dark toggle.
- Reminder rows with circle checkboxes, inline title editing, sub-tasks
(Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue),
flags, priority (!/!!/!!!) and clickable URLs.
- Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/
Tonight), Scheduled by date (with an Overdue group), All/Search by list.
- A detail editor popover (On a Day / At a Time, priority, list, URL, flag)
and a list create/edit modal with colour and icon pickers.
- Native macOS look with full light/dark theming; sticky UI prefs via
localStorage; responsive off-canvas sidebar on narrow screens.
Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user
{ lists, reminders } store to user:/Document/Reminders/data.json via filelib,
following the Calendar app's pattern: init (load + seed default list),
saveReminder/deleteReminder, saveList/deleteList and a full saveData for
re-ordering and clearing completed items.
https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ
* Add CalDAV VTODO sync for Reminders and recurring support
Expose the Reminders web-app data as a CalDAV VTODO collection at
/caldav/{username}/reminders/ so iOS Reminders can sync bidirectionally
alongside the existing Calendar (VEVENT) collection. The principal now
advertises a calendar-home-set containing both collections.
Add RRULE recurrence support: events and reminders pass their recurrence
rule through ICS in both directions. The Reminders UI gains a Repeat
selector, shows a repeat indicator, and rolls recurring reminders forward
to their next occurrence on completion (matching iOS behaviour).
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Bump internal_version to 3.0.1
Update internal build version from 3.0.0 to 3.0.1 in src/flags.go to reflect a minor release increment.
* Add shell mode (virtual FS) to web terminal
Introduce an interactive shell mode for the web Terminal. Backend (session.agi): implement shell state, virtual path resolution, many shell commands (pwd, ls, cd, cat, mkdir, touch, rm, cp, mv, echo, whoami, clear, exit, help), tab-completion, prompt building, safe filelib wrappers, and new websocket message types (shellmode, clear, complete, shellPrompt in result). Frontend (index.html): track shellMode/shellPrompt, render shell output differently, handle shell enter/exit and clear messages, send/handle completion requests/responses, adjust input handling (Tab completion and disabling REPL dot-commands while in shell). Add .claude/launch.json to run a local static server for src/web. This enables a secure virtual filesystem shell inside the AGI REPL without host FS access.
* TURN update for Arozcast screen share over Internet (#259)
* Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255)
Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1.
- [Release notes](https://github.com/go-git/go-git/releases)
- [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md)
- [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1)
---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
dependency-version: 5.19.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add Reminders WebApp (macOS Reminders-style)
A self-contained ArozOS WebApp that mimics the macOS Reminders app.
Front-end (web/Reminders/index.html), single-page, no framework:
- Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a
Completed card — plus custom "My Lists" with colour + SF-style icons and
live incomplete counts, an Add List action and a light/dark toggle.
- Reminder rows with circle checkboxes, inline title editing, sub-tasks
(Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue),
flags, priority (!/!!/!!!) and clickable URLs.
- Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/
Tonight), Scheduled by date (with an Overdue group), All/Search by list.
- A detail editor popover (On a Day / At a Time, priority, list, URL, flag)
and a list create/edit modal with colour and icon pickers.
- Native macOS look with full light/dark theming; sticky UI prefs via
localStorage; responsive off-canvas sidebar on narrow screens.
Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user
{ lists, reminders } store to user:/Document/Reminders/data.json via filelib,
following the Calendar app's pattern: init (load + seed default list),
saveReminder/deleteReminder, saveList/deleteList and a full saveData for
re-ordering and clearing completed items.
https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ
* Add built-in TURN relay so Arozcast screen share works over the Internet
Arozcast screen share is a direct WebRTC peer-to-peer connection that only
used public STUN servers, so it could not traverse NAT and failed over the
Internet. Add a built-in TURN relay (pion/turn, MIT, pure Go) that both peers
reach through the same ArozOS host, plus an /api/arozcast/iceservers endpoint
that hands the browser STUN + TURN with short-lived HMAC-signed credentials.
The relay is optional/configurable, and operators can override the ICE list
entirely with system/arozcast/iceservers.json to use an external TURN.
- mod/network/turn: pion/turn wrapper + ephemeral credential helpers (tested)
- cast.go: start the relay in ArozcastInit; serve /api/arozcast/iceservers
- main.go: close the relay on shutdown
- flags.go: -arozcast_turn, -arozcast_turn_port, -arozcast_turn_publicip
- screenshare.html / index.html: fetch ICE servers (STUN fallback)
- Arozcast README: endpoint + Internet/TURN operations docs
Media casting (Musicify/Movie/Photo) already worked over the Internet via the
existing relay and is unchanged.
https://claude.ai/code/session_01P68sFxtXuRXfzDnwtpFrnU
* Add TURN-over-TLS and a System Settings toggle for the Arozcast relay
Builds on the built-in Arozcast TURN relay with two operator-facing
enhancements.
TURN-over-TLS (TURNS):
- turn.NewServer now optionally starts a TURNS listener (TLSPort +
TLSCertFile/TLSKeyFile) alongside the plain UDP/TCP relay, reusing the
system TLS certificate. Restrictive firewalls that only permit outbound
TLS (commonly 443) can then relay screen share, since the media rides
inside a connection indistinguishable from HTTPS.
- Listener setup tracks every opened conn so a later failure cleans up; a
TURNS failure is non-fatal (logged, plain relay keeps running).
- /api/arozcast/iceservers advertises turns:host:port?transport=tcp when
the listener is up. New flags: -arozcast_turn_tls (default on, no-op
without a usable cert) and -arozcast_turn_tls_port (default 5349; set to
443 for maximum reach).
System Settings toggle & status:
- The relay is now runtime-managed (mutex-guarded start/stop with a
remembered config) and its on/off state is persisted in the system
database, overriding the -arozcast_turn flag default across restarts.
- New admin-only endpoints /system/arozcast/turn/{status,setEnabled} via
the permission router, plus a "Screen Share Relay" page under
System Settings -> Network & Connection (SystemAO/arozcast/turn.html)
showing running state, port, TURNS and advertised host.
Tests cover the TURNS listener (self-signed cert handshake) and the
non-fatal missing-cert path. README documents both features.
* Drop the SNI-routing proxy caveat from the TURNS 443 docs
The TURN-over-TLS note suggested fronting port 443 with a TLS/SNI-routing
proxy to share it with the web server. That over-complicated the guidance;
replace it with a plain statement that 5349 is the default and 443 is only
viable when free on the relay's address.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
* Add single instance support to Movie
* Add cross-tab theme sync and file selector fixes
Broadcast theme changes to other open tabs and improve file selector callback handling. file_explorer.html now writes ao_system_theme to localStorage when toggling theme in standalone mode so other tabs can react. ao_module.js adds ao_module_onThemeChanged, ao_module_toggleSystemTheme and an internal _ao_theme_broadcast to support both VDI (desktop-driven) and standalone/cross-tab theme propagation. Also fixes and documents file selector behavior: allow callback as a string or named function, auto-register a temporary global for anonymous callbacks in VDI mode, resolve string callbacks in non-VDI polling mode, and clean up localStorage handling. Minor typo/comment and whitespace fixes included.
* Add theme listener to desktop
* Added more icons for Code Studio
* Added wip productivity app
* Renewed Text app
* Updated Productivity app
* Text module style update
* Add RWD support to text
* Add Markdown source-mark reveal and image sync
Show Typora-style markdown source marks and allow inline editing of image references. Adds CSS pseudo-elements to reveal heading, emphasis, code, blockquote and link syntax; a settings selector to control reveal mode (active/always/none); and a default syntax setting. Implements updateActiveBlock(), clearDecorations(), decorateBlock(), editable .md-imgsyn labels, syncImgFromSyn()/commitImgSyn(), and helpers (richPlainText, activeImgSyn, caret/block helpers) to keep serialization and word count unchanged. Updates event handlers and key handling to support image-label editing, heading mark editing, backspace behavior at block start, and selection changes. Ensures getContent strips editable image labels before turndown and wires UI state updates throughout.
* Text: add Notion mode with slash commands and document-aware AI (#260)
Adds a toolbar toggle that enables a Notion-style "/" command menu in the
Markdown editor. Typing "/" at a line start (or after a space) opens a
filterable, keyboard-navigable menu to quickly insert blocks (headings,
to-do/bullet/numbered lists, quote, code block, table, divider) and to run
AI actions.
AI actions feed the entire current document in as context and insert the
generated Markdown at the caret, with an inline "Ask AI" prompt for
free-form instructions plus presets (continue writing, summarize,
brainstorm, outline). Generation is relayed through a new Text/ai.agi
backend that calls the aimodel library; the AI endpoint/key are configured
by an admin in System Settings.
A new "Notion & AI" settings section lets users toggle the feature, pick a
model (lazy-loaded from the endpoint) and set the temperature; all
preferences persist alongside the existing editor settings.
Claude-Session: https://claude.ai/code/session_01Xd4TY3ecHMDdG7es1JqbKo
Co-authored-by: Claude <noreply@anthropic.com>
* Revert "Text: add Notion mode with slash commands and document-aware AI (#260)"
This reverts commit be21397ccf060ed4fe403c48fbe3d63d72669965.
* Added advanced code block function to Text
* Add code-language picker and blank-line handling
Introduce a code-block language <select> UI and preserve runs of blank paragraphs through round-trip serialization. Add LANG_LIST and TextHL.languages(), ensure language selectors are appended to <pre> blocks (contenteditable=false and stripped on save), and wire syncLangSelector/ensureLangSelector/clearLangSelectors/onLangSelectChange. Implement renderWithBlankRuns() and expandBlankSentinels() to keep multiple empty paragraphs, switch marked.parse/getContent/renderedHTML to use these, and replace the previous sentinel with a ZWSP sentinel.
Fix code-block editing by rewriting newline/delete logic to operate on the code textContent (insertNewlineInCode, deleteInCode) to avoid DOM fragmentation and caret issues; add protection for key handling when the language <select> has focus. Adjust decoration logic to avoid marking PRE as md-active and update syntax display rules.
Rename/move backend modules under Text/backend (export.agi, filesaver.agi, imgtool.agi) and update ao_module_agirun calls to use the new paths. Add related CSS for the language picker and other small UI adjustments.
* Add link editor and improve code highlighting
Introduce an interactive link editor and inline editable link marks, replacing the previous CSS-only closing a::after pseudo-element with a real .md-linksyn element so link URLs are clickable/editable. Add link dialog UI (overlay, inputs, remove/cancel/OK handlers) and associated logic to insert/edit/remove links, preserve/restore selection, and avoid tearing down marks while edited. Enhance code-block highlighting: switch to relightCode/highlightCode with caret/selection preservation (selectionEndOffsetIn, restoreCaretIn), handle live re-highlighting on edits, language changes, and prevent stuck empty code blocks by exiting them (exitEmptyCodeBlock). Also fix caret placement when clicking below trailing code blocks (escapeTrailingCodeBlockClick), update serialization to strip .md-linksyn, and adjust toolbar/labels for the link action.
* Add support for token access in webdav server
X-Access-Token + X-Aroz-User now can be used to login webdav with autologin token instead of Basic Auth
* Add CNN inference API support
* Rename aimodel to llm and add LLM server pkg
Replace the legacy "aimodel" library with a new "llm" library and introduce a dedicated aiservers/llm package. Key changes:
- Rename library identifier from "aimodel" to "llm" across docs and backend scripts (README, AGI scripts, web backend examples).
- Remove the old agi.aimodel implementation and add agi.llm (new AGI lib) plus agi.llm_test.go.
- Add mod/aiservers/llm package with client, OpenAI/Anthropic adapters and types, and tests (client.go, openai.go, anthropic.go, types.go, and tests).
- Update tests and module wiring to use LLMConfig/LLMPricing/llmDBTable and injectLLMFunctions where appropriate.
- Minor updates to web demo backend/init scripts and API docs to reflect the new requirelib name.
Notes: System Settings UI and routes retaining the original "AI Model" naming; only the requirelib identifier and internal Go types/DB table references were changed. This restructures wire-protocol logic into the new aiservers/llm package for clearer separation of concerns and easier protocol-specific handling.
* Fixed #204
* Add text color change inline
* Add free resize on select tool
* Add Cine Studio, a Premiere-like timeline video editor webapp (#263)
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
Co-authored-by: Claude <noreply@anthropic.com>
* Docker support (#264)
* Updated Video Editor app to have more functionalities (#266)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Fix docker package build failure on FreeBSD and other unlisted platforms (#267)
The docker package split its PTY console and host-stats helpers into
build-tagged files that only covered linux/darwin/windows. FreeBSD (built
by the Jenkins release pipeline for amd64 and i386) matched none of them,
so startDockerExecPTY, hostStorageUsage and hostLoadAvg were undefined and
the cross-platform release build failed.
- console_unix.go now builds for freebsd too (creack/pty supports it).
- console_windows.go becomes console_other.go, a catch-all (!linux &&
!darwin && !freebsd) stub covering windows and any other GOOS.
- host_darwin.go becomes host_bsd.go (darwin || freebsd); the Statfs-based
storage helper works on both.
- Add host_other.go, a catch-all fallback so the package builds on any
remaining GOOS.
Also expand the CI cross-compile smoke test to cover the full release
matrix (including freebsd/amd64 and freebsd/386) so a platform-specific
break is caught in CI instead of only in the release build.
Claude-Session: https://claude.ai/code/session_01L4oR1xiTxpcfwYjRgi4RGh
Co-authored-by: Claude <noreply@anthropic.com>
* Added playwright e2e tests for cine studio (#268)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Playwright E2E suite for Cine Studio + GitHub Actions job
Ports the browser-driven tests used to verify Cine Studio into the
codebase under test/e2e/playwright (outside src/ so they never touch
the Go module). The tests drive the real app in headless Chromium,
generating their own media in-page (canvas -> MediaRecorder WebM,
synthesized WAV) and asserting on rendered pixels, so they exercise the
full compositor / playback / export pipeline rather than mocking it.
Structure:
- lib/static-server.js minimal static server for the ArozOS web root
- lib/harness.js browser launch + app navigation + ok()/fail();
resolves Playwright's own Chromium (no hardcoded
path), overridable via PW_CHROMIUM_PATH
- run.js serves src/web, runs each spec in its own process,
exits non-zero on any failure
- specs/functional.js media probe, playback, edit, round-trip, WebM export
- specs/features.js effects, titles, transitions, elements, filters
- specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import
- specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave
41 assertions across the four specs, all passing locally.
CI: .github/workflows/e2e-playwright.yml installs Node + Playwright
Chromium and runs `npm test`, scoped to changes under the app or the
harness so unrelated commits don't trigger it. Front-end only - runs
independently of the Go build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Claude/arozos playwright tests for arozos (#269)
* Add full-stack Playwright E2E suite for ArozOS critical paths
Extend the Playwright harness (previously Cine Studio only) with a
'system' suite that drives a real ArozOS server built from src/:
- lib/arozos-server.js boots a disposable isolated instance
(.instance/: web symlink + private system copy) and bootstraps a
deterministic admin account at the zero-user state
- lib/system-harness.js shares login (form + API), CSRF, JSON and
pass/fail helpers; each spec also runs standalone
- specs-system/ covers the critical paths:
010 sign in / sign out (form render, bad credentials, session
persistence, gated redirects, logout, retry delay)
020 desktop shell (task bar, start menu, module list, quick access
panel identity, UI sign-out)
030 file explorer (File Manager UI render + full file lifecycle:
create, rename, copy, move, properties, recycle/restore/clear
trash, permanent delete, CSRF enforcement)
040 system settings (settings UI, catalogue groups, admin-only
modules, host info, permission group listing)
050 user management + permission control (group CRUD, user CRUD,
restricted-user module visibility, admin-only endpoint denial,
administrator group protection)
- run.js orchestrates both suites; npm run test:static / test:system
- CI workflow now builds the Go binary, triggers on src/** changes and
uploads the server log on failure
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 1 E2E spec and coverage roadmap
- specs-system/060-webapps-core.js: smoke + interaction coverage for
the highest-importance WebApps (NotepadA, Text, Photo, Music, Video,
PDF Viewer, Zip File Manager) against the real server, including
opening a real file in NotepadA via the desktop hash convention
- README: document the ranked 44-WebApp inventory and the wave order
for upcoming specs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 2 E2E spec (office/productivity)
specs-system/070-webapps-office.js: smoke + interaction coverage for
Code Studio, MDEditor, Calendar, Notes, Memo, Reminders, OfficeViewer
and Dashboard against the real server, including opening a real
Markdown file in MDEditor via the desktop hash convention and probing
Dashboard's live system-info data source.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 3 E2E spec (media/creative)
specs-system/080-webapps-media.js: smoke coverage for Musicify, Movie,
Manga, Paint, Pixel Studio, Audio Studio, Camera, Recorder and FFmpeg
Factory against the real server, plus a probe of the storage data path
the media library apps browse. Cine Studio keeps its own deep static
suite and is not repeated here.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 4 E2E spec (utilities/dev/network) + close roadmap
specs-system/090-webapps-utilities.js: smoke coverage for Calculator
(incl. a real 7+8=15 calculation through the UI), Clock, Browser,
Speedtest, Web Downloader, Web Builder, SQLite Admin, Terminal,
AGIForge, AIChat, OTPAuth, Productivity, OnScreenKeyboard, Arozcast,
Management Gateway, UnitTest, CronDemo and Serverless.
This completes coverage of all 44 WebApps under src/web across four
waves. README updated to reflect the full map; full suite (13 spec
files: 4 static + 9 system) passes end to end.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add deep file-transfer critical-path spec (upload/download/search/share)
specs-system/035-file-transfer.js extends the file-explorer coverage
with the transfer features that move real bytes:
- multipart upload of a real file
- media download with byte-exact round-trip verification
- file search by keyword
- share-link lifecycle: create, list, anonymous direct download via
/share/download/{uuid}/ (byte-exact) + preview page, then delete and
confirm the share is revoked
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add account password-change critical-path spec
specs-system/055-account.js exercises the My Account flow on a
dedicated throwaway user (keeping the shared admin login intact):
account settings UI render, userinfo identity, wrong-old-password
refusal, successful change, and that afterwards only the new password
signs in. README updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop backend API spec (every /system/desktop endpoint)
specs-system/021-desktop-api.js covers the full desktop.go API surface
with the exact request shapes desktop.html uses: host/device details;
user self-info (quota/groups/admin), another user's public info via
?target, and noicon; theme listing + set/get round-trip; preference
set/get/remove; createShortcut + listDesktop metadata; icon location
files set/get/del; and renameShortcut incl. off-desktop rejection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop UI shell spec (clock, panels, start menu, search, icons)
specs-system/022-desktop-ui.js drives the real desktop.html: wallpaper
frame mounts, the taskbar clock shows a formatted time, the quick
access panel carries the user identity, the start menu opens with
module entries, its search box narrows the list and reports No Result
for gibberish, the notification bar toggles from the clock, and an
API-seeded shortcut renders as a desktop launch icon.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop float-window + context-menu spec and update README
specs-system/023-desktop-windows.js drives the desktop window manager
and right-click surfaces using the app's own globals and real clicks:
openModule spawns a float window with a taskbar entry; newFloatWindow
creates addressable windows; focus raises z-order; maximize/restore,
minimize and close all work; and the wallpaper + icon context menus
open with the expected entries.
Desktop coverage is now three specs deep (API 021, UI 022, windows
023) on top of the original 020 shell smoke test. README layout
updated. Full system suite (14 specs) passes together.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Video Editor Cline Update (#270)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Playwright E2E suite for Cine Studio + GitHub Actions job
Ports the browser-driven tests used to verify Cine Studio into the
codebase under test/e2e/playwright (outside src/ so they never touch
the Go module). The tests drive the real app in headless Chromium,
generating their own media in-page (canvas -> MediaRecorder WebM,
synthesized WAV) and asserting on rendered pixels, so they exercise the
full compositor / playback / export pipeline rather than mocking it.
Structure:
- lib/static-server.js minimal static server for the ArozOS web root
- lib/harness.js browser launch + app navigation + ok()/fail();
resolves Playwright's own Chromium (no hardcoded
path), overridable via PW_CHROMIUM_PATH
- run.js serves src/web, runs each spec in its own process,
exits non-zero on any failure
- specs/functional.js media probe, playback, edit, round-trip, WebM export
- specs/features.js effects, titles, transitions, elements, filters
- specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import
- specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave
41 assertions across the four specs, all passing locally.
CI: .github/workflows/e2e-playwright.yml installs Node + Playwright
Chromium and runs `npm test`, scoped to changes under the app or the
harness so unrelated commits don't trigger it. Front-end only - runs
independently of the Go build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* New webapp RAW Editor (#271)
* Add Raw Editor webapp with RAW decode, develop controls and LUT grading
Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW
files client-side and develops them with a Camera-Raw style interface.
Decoder (js/rawdecoder.js):
- TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2,
ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal.
- CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy
compression, bilinear demosaic with black/white-level normalisation and
camera (AsShotNeutral) or gray-world white balance.
- Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force
SOI/EOI scan) so any RAW still renders when its compression is unsupported.
- EXIF metadata (camera, shutter, aperture, ISO, focal length).
Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing
white balance (temperature/tint), exposure, contrast, highlights, shadows,
whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional
3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local
contrast. Keeps a valid identity 3D texture bound at all times so drivers
that reject incomplete sampler3D bindings still render.
LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a
WebGL 3D texture.
UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout
with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white
balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local
picker and drag & drop) and JPEG export back to storage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Hand off developed image to Pixel Studio on Done
Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the
current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS)
and launches Pixel Studio as a float window with that file as its input
(matching Pixel Studio's ao_module_loadInputFiles hash format), then closes
the Raw Editor window.
Falls back to the normal Save dialog when running outside the ArozOS desktop.
The bottom-bar button is relabelled "Open in Pixel Studio".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout
Rework the develop panel into the 2024 Lightroom-style layout:
- Thin centred title bar with open / save / reset / fit icons.
- Borderless histogram with shadow/highlight clipping indicators and an
EXIF readout (ISO, focal, aperture, shutter).
- "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills.
- Profile selector row.
- Collapsible Light / Color / Effects / LUT groups, each with a chevron to
fold and an eye toggle that bypasses that group's adjustments.
- Lightroom slider rows: label + right-aligned editable value on one line,
thin track below, with coloured gradient tracks for Temperature (blue->
yellow), Tint (green->magenta) and Vibrance / Saturation.
- White-balance eyedropper wired to auto white balance.
- Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined
dimension readout and Cancel / Open in Pixel Studio actions.
- Decorative panel-selector strip on the right edge.
Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain
(post noise) controls to the WebGL develop shader to complete the Effects
group, plus per-group bypass handling in the parameter builder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add ArozOS-backed LUT library with a managed folder
LUTs can now be managed through the user's ArozOS storage instead of only
one-off browser uploads:
- On first use the app creates a "user:/RawEditor/LUTs" folder (via the
file_system newItem endpoint with a CSRF token). Users can drop .cube
files into it with the Files app.
- The LUT panel scans that folder (listDir) and lists every .cube in a
"Library" dropdown; picking one reads it back through the media endpoint,
parses it and applies it live. A refresh button re-scans on demand.
- "Import .cube to library" still loads a local file immediately and now
also uploads it into the library folder so it persists and reappears in
the list next time.
- Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint
line reports how many LUTs are available.
Falls back gracefully to local import when running outside the ArozOS desktop.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add scroll-zoom and right-drag pan; remove unused UI
- Scroll wheel now zooms the photo, centred on the cursor, and the current
zoom level is shown in the status bar. Fit / 100% buttons reset the view.
- Right-mouse (or middle) button drag pans the image; the browser context
menu is suppressed over the canvas. The view re-fits on window resize.
The canvas is now transform-based (translate + scale) instead of the old
fit / 1:1 CSS toggle.
- Removed the Profile dropdown (no camera profiles in this pipeline) and the
decorative right-edge tool strip, so the panel only shows working controls.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Pan with left mouse button and fix LUT dropdown overflow
- Change canvas panning from right-drag to left-mouse (and middle) drag, with
a grab / grabbing cursor over the image. The context menu is no longer
suppressed.
- Fix the LUT Library dropdown (and any select) overflowing the panel when an
option label is long: give .mini-select min-width:0 so it can shrink inside
its flex row instead of stretching to the widest option.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Load EXIF from JPEG APP1 so shooting info shows reliably
Some RAW files (and any plain JPEG) did not populate the ISO / focal /
aperture / shutter readout under the histogram. The cause: when the RAW's
outer TIFF structure fails to parse, the image still loads via the brute-force
embedded-JPEG scan, but the metadata comes back empty.
Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it
reuses the existing TIFF parser) and use it to:
- read EXIF for plain JPEG images, and
- fill any missing EXIF fields from the embedded preview for RAW files,
which rescues shooting info when the main TIFF could not be parsed.
Also harden applyMeta so the EXIF line is written before the window-title
call and a title error can no longer suppress it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB
The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes,
both fixed:
- Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which
introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to
NEAREST and do proper tetrahedral interpolation in the shader — the same
method Photoshop's Color Lookup and Resolve use.
- Transfer function: encode to display with the true sRGB OETF instead of a
plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit
sources, so the values fed into the LUT match what Photoshop feeds it
(previously the mismatch shifted shadow tones the LUT is sensitive to).
Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling.
Verified in-browser: an identity LUT now passes through unchanged (exact
tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to
the constant.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Harden RAW EXIF parsing for real camera files
Improve the chance that ISO / focal / aperture / shutter show for real RAWs
(e.g. Sony ARW), which kept the readout blank:
- Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony
keeps EXIF in the small thumbnail while the full-size preview has none.
- Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets —
that could be pathologically slow / derail a clean parse on real files;
EXIF is reached through the standard ExifIFD (0x8769) pointer.
- Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Fix RAW preview selection: never decode CFA raw as the preview image
On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause:
the CFA raw plane is a lossless-JPEG-compressed stream that also starts with
0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB)
and handed it to the browser to decode as an image. The browser cannot decode
lossless JPEG, so decoding stalled and the pipeline never reached the metadata
display.
Fixes:
- Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG.
- Only accept a range that is a real JPEG (SOI at the start AND EOI at the end)
via a looksLikeJpeg() check, so a truncated raw stream can't be chosen.
- Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't
yield a multi-megabyte junk range.
With this, ARW files pick the correct full-size preview, the image loads, and
ISO / focal / aperture / shutter populate under the histogram.
Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
---------
Co-authored-by: Claude <noreply@anthropic.com>
* RAW Editor - LUT Preview update (#272)
* Add Raw Editor webapp with RAW decode, develop controls and LUT grading
Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW
files client-side and develops them with a Camera-Raw style interface.
Decoder (js/rawdecoder.js):
- TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2,
ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal.
- CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy
compression, bilinear demosaic with black/white-level normalisation and
camera (AsShotNeutral) or gray-world white balance.
- Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force
SOI/EOI scan) so any RAW still renders when its compression is unsupported.
- EXIF metadata (camera, shutter, aperture, ISO, focal length).
Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing
white balance (temperature/tint), exposure, contrast, highlights, shadows,
whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional
3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local
contrast. Keeps a valid identity 3D texture bound at all times so drivers
that reject incomplete sampler3D bindings still render.
LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a
WebGL 3D texture.
UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout
with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white
balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local
picker and drag & drop) and JPEG export back to storage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Hand off developed image to Pixel Studio on Done
Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the
current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS)
and launches Pixel Studio as a float window with that file as its input
(matching Pixel Studio's ao_module_loadInputFiles hash format), then closes
the Raw Editor window.
Falls back to the normal Save dialog when running outside the ArozOS desktop.
The bottom-bar button is relabelled "Open in Pixel Studio".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout
Rework the develop panel into the 2024 Lightroom-style layout:
- Thin centred title bar with open / save / reset / fit icons.
- Borderless histogram with shadow/highlight clipping indicators and an
EXIF readout (ISO, focal, aperture, shutter).
- "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills.
- Profile selector row.
- Collapsible Light / Color / Effects / LUT groups, each with a chevron to
fold and an eye toggle that bypasses that group's adjustments.
- Lightroom slider rows: label + right-aligned editable value on one line,
thin track below, with coloured gradient tracks for Temperature (blue->
yellow), Tint (green->magenta) and Vibrance / Saturation.
- White-balance eyedropper wired to auto white balance.
- Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined
dimension readout and Cancel / Open in Pixel Studio actions.
- Decorative panel-selector strip on the right edge.
Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain
(post noise) controls to the WebGL develop shader to complete the Effects
group, plus per-group bypass handling in the parameter builder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add ArozOS-backed LUT library with a managed folder
LUTs can now be managed through the user's ArozOS storage instead of on…
* Add LoongArch64 (linux/loong64) build support (#287)
* Update github.com/glebarez/go-sqlite to v1.22.1-0.20260317144347-ca37fea19666
* Use fsdb on LoongArch64
* Add linux/loong64 to the Makefile and GitHub Actions workflow
* Update README
* Fix CPU frequency and hardware model detection on LoongArch64 (#288)
* docs: restore 2 dead link(s) via Wayback (#290)
Co-authored-by: mirkosalvato1-ctrl <227404546+mirkosalvato1-ctrl@users.noreply.github.com>
* Fix Windows hardware info when wmic.exe is missing (#289)
Prefer Get-CimInstance for Win32_* queries and keep classic wmic as fallback so System Info and SMART still work on Windows 11 hosts that no longer ship wmic.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: fix a typo RSICV64 => RISC-V 64-bit (#291)
* Bump github.com/pion/dtls/v3 from 3.0.7 to 3.1.4 in /src (#296)
Bumps [github.com/pion/dtls/v3](https://github.com/pion/dtls) from 3.0.7 to 3.1.4.
- [Release notes](https://github.com/pion/dtls/releases)
- [Commits](https://github.com/pion/dtls/compare/v3.0.7...v3.1.4)
---
updated-dependencies:
- dependency-name: github.com/pion/dtls/v3
dependency-version: 3.1.4
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump github.com/pion/stun/v3 from 3.0.1 to 3.1.5 in /src (#295)
Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.0.1 to 3.1.5.
- [Release notes](https://github.com/pion/stun/releases)
- [Commits](https://github.com/pion/stun/compare/v3.0.1...v3.1.5)
---
updated-dependencies:
- dependency-name: github.com/pion/stun/v3
dependency-version: 3.1.5
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 in /src (#297)
Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2.
- [Release notes](https://github.com/go-git/go-git/releases)
- [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md)
- [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2)
---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
dependency-version: 5.19.2
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* V3.0.2 (#299)
* Add CalDAV server for iOS Calendar bidirectional sync (#256)
Add CalDAV server for iOS Calendar bidirectional sync (#256)
* Updated CLAUDE.md (#257)
* Updated CLAUDE.md
* Add Reminders WebApp
* Add Reminders WebApp (macOS Reminders-style)
A self-contained ArozOS WebApp that mimics the macOS Reminders app.
Front-end (web/Reminders/index.html), single-page, no framework:
- Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a
Completed card — plus custom "My Lists" with colour + SF-style icons and
live incomplete counts, an Add List action and a light/dark toggle.
- Reminder rows with circle checkboxes, inline title editing, sub-tasks
(Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue),
flags, priority (!/!!/!!!) and clickable URLs.
- Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/
Tonight), Scheduled by date (with an Overdue group), All/Search by list.
- A detail editor popover (On a Day / At a Time, priority, list, URL, flag)
and a list create/edit modal with colour and icon pickers.
- Native macOS look with full light/dark theming; sticky UI prefs via
localStorage; responsive off-canvas sidebar on narrow screens.
Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user
{ lists, reminders } store to user:/Document/Reminders/data.json via filelib,
following the Calendar app's pattern: init (load + seed default list),
saveReminder/deleteReminder, saveList/deleteList and a full saveData for
re-ordering and clearing completed items.
https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ
* Add CalDAV VTODO sync for Reminders and recurring support
Expose the Reminders web-app data as a CalDAV VTODO collection at
/caldav/{username}/reminders/ so iOS Reminders can sync bidirectionally
alongside the existing Calendar (VEVENT) collection. The principal now
advertises a calendar-home-set containing both collections.
Add RRULE recurrence support: events and reminders pass their recurrence
rule through ICS in both directions. The Reminders UI gains a Repeat
selector, shows a repeat indicator, and rolls recurring reminders forward
to their next occurrence on completion (matching iOS behaviour).
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Bump internal_version to 3.0.1
Update internal build version from 3.0.0 to 3.0.1 in src/flags.go to reflect a minor release increment.
* Add shell mode (virtual FS) to web terminal
Introduce an interactive shell mode for the web Terminal. Backend (session.agi): implement shell state, virtual path resolution, many shell commands (pwd, ls, cd, cat, mkdir, touch, rm, cp, mv, echo, whoami, clear, exit, help), tab-completion, prompt building, safe filelib wrappers, and new websocket message types (shellmode, clear, complete, shellPrompt in result). Frontend (index.html): track shellMode/shellPrompt, render shell output differently, handle shell enter/exit and clear messages, send/handle completion requests/responses, adjust input handling (Tab completion and disabling REPL dot-commands while in shell). Add .claude/launch.json to run a local static server for src/web. This enables a secure virtual filesystem shell inside the AGI REPL without host FS access.
* TURN update for Arozcast screen share over Internet (#259)
* Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255)
Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1.
- [Release notes](https://github.com/go-git/go-git/releases)
- [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md)
- [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1)
---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
dependency-version: 5.19.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add Reminders WebApp (macOS Reminders-style)
A self-contained ArozOS WebApp that mimics the macOS Reminders app.
Front-end (web/Reminders/index.html), single-page, no framework:
- Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a
Completed card — plus custom "My Lists" with colour + SF-style icons and
live incomplete counts, an Add List action and a light/dark toggle.
- Reminder rows with circle checkboxes, inline title editing, sub-tasks
(Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue),
flags, priority (!/!!/!!!) and clickable URLs.
- Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/
Tonight), Scheduled by date (with an Overdue group), All/Search by list.
- A detail editor popover (On a Day / At a Time, priority, list, URL, flag)
and a list create/edit modal with colour and icon pickers.
- Native macOS look with full light/dark theming; sticky UI prefs via
localStorage; responsive off-canvas sidebar on narrow screens.
Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user
{ lists, reminders } store to user:/Document/Reminders/data.json via filelib,
following the Calendar app's pattern: init (load + seed default list),
saveReminder/deleteReminder, saveList/deleteList and a full saveData for
re-ordering and clearing completed items.
https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ
* Add built-in TURN relay so Arozcast screen share works over the Internet
Arozcast screen share is a direct WebRTC peer-to-peer connection that only
used public STUN servers, so it could not traverse NAT and failed over the
Internet. Add a built-in TURN relay (pion/turn, MIT, pure Go) that both peers
reach through the same ArozOS host, plus an /api/arozcast/iceservers endpoint
that hands the browser STUN + TURN with short-lived HMAC-signed credentials.
The relay is optional/configurable, and operators can override the ICE list
entirely with system/arozcast/iceservers.json to use an external TURN.
- mod/network/turn: pion/turn wrapper + ephemeral credential helpers (tested)
- cast.go: start the relay in ArozcastInit; serve /api/arozcast/iceservers
- main.go: close the relay on shutdown
- flags.go: -arozcast_turn, -arozcast_turn_port, -arozcast_turn_publicip
- screenshare.html / index.html: fetch ICE servers (STUN fallback)
- Arozcast README: endpoint + Internet/TURN operations docs
Media casting (Musicify/Movie/Photo) already worked over the Internet via the
existing relay and is unchanged.
https://claude.ai/code/session_01P68sFxtXuRXfzDnwtpFrnU
* Add TURN-over-TLS and a System Settings toggle for the Arozcast relay
Builds on the built-in Arozcast TURN relay with two operator-facing
enhancements.
TURN-over-TLS (TURNS):
- turn.NewServer now optionally starts a TURNS listener (TLSPort +
TLSCertFile/TLSKeyFile) alongside the plain UDP/TCP relay, reusing the
system TLS certificate. Restrictive firewalls that only permit outbound
TLS (commonly 443) can then relay screen share, since the media rides
inside a connection indistinguishable from HTTPS.
- Listener setup tracks every opened conn so a later failure cleans up; a
TURNS failure is non-fatal (logged, plain relay keeps running).
- /api/arozcast/iceservers advertises turns:host:port?transport=tcp when
the listener is up. New flags: -arozcast_turn_tls (default on, no-op
without a usable cert) and -arozcast_turn_tls_port (default 5349; set to
443 for maximum reach).
System Settings toggle & status:
- The relay is now runtime-managed (mutex-guarded start/stop with a
remembered config) and its on/off state is persisted in the system
database, overriding the -arozcast_turn flag default across restarts.
- New admin-only endpoints /system/arozcast/turn/{status,setEnabled} via
the permission router, plus a "Screen Share Relay" page under
System Settings -> Network & Connection (SystemAO/arozcast/turn.html)
showing running state, port, TURNS and advertised host.
Tests cover the TURNS listener (self-signed cert handshake) and the
non-fatal missing-cert path. README documents both features.
* Drop the SNI-routing proxy caveat from the TURNS 443 docs
The TURN-over-TLS note suggested fronting port 443 with a TLS/SNI-routing
proxy to share it with the web server. That over-complicated the guidance;
replace it with a plain statement that 5349 is the default and 443 is only
viable when free on the relay's address.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
* Add single instance support to Movie
* Add cross-tab theme sync and file selector fixes
Broadcast theme changes to other open tabs and improve file selector callback handling. file_explorer.html now writes ao_system_theme to localStorage when toggling theme in standalone mode so other tabs can react. ao_module.js adds ao_module_onThemeChanged, ao_module_toggleSystemTheme and an internal _ao_theme_broadcast to support both VDI (desktop-driven) and standalone/cross-tab theme propagation. Also fixes and documents file selector behavior: allow callback as a string or named function, auto-register a temporary global for anonymous callbacks in VDI mode, resolve string callbacks in non-VDI polling mode, and clean up localStorage handling. Minor typo/comment and whitespace fixes included.
* Add theme listener to desktop
* Added more icons for Code Studio
* Added wip productivity app
* Renewed Text app
* Updated Productivity app
* Text module style update
* Add RWD support to text
* Add Markdown source-mark reveal and image sync
Show Typora-style markdown source marks and allow inline editing of image references. Adds CSS pseudo-elements to reveal heading, emphasis, code, blockquote and link syntax; a settings selector to control reveal mode (active/always/none); and a default syntax setting. Implements updateActiveBlock(), clearDecorations(), decorateBlock(), editable .md-imgsyn labels, syncImgFromSyn()/commitImgSyn(), and helpers (richPlainText, activeImgSyn, caret/block helpers) to keep serialization and word count unchanged. Updates event handlers and key handling to support image-label editing, heading mark editing, backspace behavior at block start, and selection changes. Ensures getContent strips editable image labels before turndown and wires UI state updates throughout.
* Text: add Notion mode with slash commands and document-aware AI (#260)
Adds a toolbar toggle that enables a Notion-style "/" command menu in the
Markdown editor. Typing "/" at a line start (or after a space) opens a
filterable, keyboard-navigable menu to quickly insert blocks (headings,
to-do/bullet/numbered lists, quote, code block, table, divider) and to run
AI actions.
AI actions feed the entire current document in as context and insert the
generated Markdown at the caret, with an inline "Ask AI" prompt for
free-form instructions plus presets (continue writing, summarize,
brainstorm, outline). Generation is relayed through a new Text/ai.agi
backend that calls the aimodel library; the AI endpoint/key are configured
by an admin in System Settings.
A new "Notion & AI" settings section lets users toggle the feature, pick a
model (lazy-loaded from the endpoint) and set the temperature; all
preferences persist alongside the existing editor settings.
Claude-Session: https://claude.ai/code/session_01Xd4TY3ecHMDdG7es1JqbKo
Co-authored-by: Claude <noreply@anthropic.com>
* Revert "Text: add Notion mode with slash commands and document-aware AI (#260)"
This reverts commit be21397ccf060ed4fe403c48fbe3d63d72669965.
* Added advanced code block function to Text
* Add code-language picker and blank-line handling
Introduce a code-block language <select> UI and preserve runs of blank paragraphs through round-trip serialization. Add LANG_LIST and TextHL.languages(), ensure language selectors are appended to <pre> blocks (contenteditable=false and stripped on save), and wire syncLangSelector/ensureLangSelector/clearLangSelectors/onLangSelectChange. Implement renderWithBlankRuns() and expandBlankSentinels() to keep multiple empty paragraphs, switch marked.parse/getContent/renderedHTML to use these, and replace the previous sentinel with a ZWSP sentinel.
Fix code-block editing by rewriting newline/delete logic to operate on the code textContent (insertNewlineInCode, deleteInCode) to avoid DOM fragmentation and caret issues; add protection for key handling when the language <select> has focus. Adjust decoration logic to avoid marking PRE as md-active and update syntax display rules.
Rename/move backend modules under Text/backend (export.agi, filesaver.agi, imgtool.agi) and update ao_module_agirun calls to use the new paths. Add related CSS for the language picker and other small UI adjustments.
* Add link editor and improve code highlighting
Introduce an interactive link editor and inline editable link marks, replacing the previous CSS-only closing a::after pseudo-element with a real .md-linksyn element so link URLs are clickable/editable. Add link dialog UI (overlay, inputs, remove/cancel/OK handlers) and associated logic to insert/edit/remove links, preserve/restore selection, and avoid tearing down marks while edited. Enhance code-block highlighting: switch to relightCode/highlightCode with caret/selection preservation (selectionEndOffsetIn, restoreCaretIn), handle live re-highlighting on edits, language changes, and prevent stuck empty code blocks by exiting them (exitEmptyCodeBlock). Also fix caret placement when clicking below trailing code blocks (escapeTrailingCodeBlockClick), update serialization to strip .md-linksyn, and adjust toolbar/labels for the link action.
* Add support for token access in webdav server
X-Access-Token + X-Aroz-User now can be used to login webdav with autologin token instead of Basic Auth
* Add CNN inference API support
* Rename aimodel to llm and add LLM server pkg
Replace the legacy "aimodel" library with a new "llm" library and introduce a dedicated aiservers/llm package. Key changes:
- Rename library identifier from "aimodel" to "llm" across docs and backend scripts (README, AGI scripts, web backend examples).
- Remove the old agi.aimodel implementation and add agi.llm (new AGI lib) plus agi.llm_test.go.
- Add mod/aiservers/llm package with client, OpenAI/Anthropic adapters and types, and tests (client.go, openai.go, anthropic.go, types.go, and tests).
- Update tests and module wiring to use LLMConfig/LLMPricing/llmDBTable and injectLLMFunctions where appropriate.
- Minor updates to web demo backend/init scripts and API docs to reflect the new requirelib name.
Notes: System Settings UI and routes retaining the original "AI Model" naming; only the requirelib identifier and internal Go types/DB table references were changed. This restructures wire-protocol logic into the new aiservers/llm package for clearer separation of concerns and easier protocol-specific handling.
* Fixed #204
* Add text color change inline
* Add free resize on select tool
* Add Cine Studio, a Premiere-like timeline video editor webapp (#263)
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
Co-authored-by: Claude <noreply@anthropic.com>
* Docker support (#264)
* Updated Video Editor app to have more functionalities (#266)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Fix docker package build failure on FreeBSD and other unlisted platforms (#267)
The docker package split its PTY console and host-stats helpers into
build-tagged files that only covered linux/darwin/windows. FreeBSD (built
by the Jenkins release pipeline for amd64 and i386) matched none of them,
so startDockerExecPTY, hostStorageUsage and hostLoadAvg were undefined and
the cross-platform release build failed.
- console_unix.go now builds for freebsd too (creack/pty supports it).
- console_windows.go becomes console_other.go, a catch-all (!linux &&
!darwin && !freebsd) stub covering windows and any other GOOS.
- host_darwin.go becomes host_bsd.go (darwin || freebsd); the Statfs-based
storage helper works on both.
- Add host_other.go, a catch-all fallback so the package builds on any
remaining GOOS.
Also expand the CI cross-compile smoke test to cover the full release
matrix (including freebsd/amd64 and freebsd/386) so a platform-specific
break is caught in CI instead of only in the release build.
Claude-Session: https://claude.ai/code/session_01L4oR1xiTxpcfwYjRgi4RGh
Co-authored-by: Claude <noreply@anthropic.com>
* Added playwright e2e tests for cine studio (#268)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Playwright E2E suite for Cine Studio + GitHub Actions job
Ports the browser-driven tests used to verify Cine Studio into the
codebase under test/e2e/playwright (outside src/ so they never touch
the Go module). The tests drive the real app in headless Chromium,
generating their own media in-page (canvas -> MediaRecorder WebM,
synthesized WAV) and asserting on rendered pixels, so they exercise the
full compositor / playback / export pipeline rather than mocking it.
Structure:
- lib/static-server.js minimal static server for the ArozOS web root
- lib/harness.js browser launch + app navigation + ok()/fail();
resolves Playwright's own Chromium (no hardcoded
path), overridable via PW_CHROMIUM_PATH
- run.js serves src/web, runs each spec in its own process,
exits non-zero on any failure
- specs/functional.js media probe, playback, edit, round-trip, WebM export
- specs/features.js effects, titles, transitions, elements, filters
- specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import
- specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave
41 assertions across the four specs, all passing locally.
CI: .github/workflows/e2e-playwright.yml installs Node + Playwright
Chromium and runs `npm test`, scoped to changes under the app or the
harness so unrelated commits don't trigger it. Front-end only - runs
independently of the Go build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Claude/arozos playwright tests for arozos (#269)
* Add full-stack Playwright E2E suite for ArozOS critical paths
Extend the Playwright harness (previously Cine Studio only) with a
'system' suite that drives a real ArozOS server built from src/:
- lib/arozos-server.js boots a disposable isolated instance
(.instance/: web symlink + private system copy) and bootstraps a
deterministic admin account at the zero-user state
- lib/system-harness.js shares login (form + API), CSRF, JSON and
pass/fail helpers; each spec also runs standalone
- specs-system/ covers the critical paths:
010 sign in / sign out (form render, bad credentials, session
persistence, gated redirects, logout, retry delay)
020 desktop shell (task bar, start menu, module list, quick access
panel identity, UI sign-out)
030 file explorer (File Manager UI render + full file lifecycle:
create, rename, copy, move, properties, recycle/restore/clear
trash, permanent delete, CSRF enforcement)
040 system settings (settings UI, catalogue groups, admin-only
modules, host info, permission group listing)
050 user management + permission control (group CRUD, user CRUD,
restricted-user module visibility, admin-only endpoint denial,
administrator group protection)
- run.js orchestrates both suites; npm run test:static / test:system
- CI workflow now builds the Go binary, triggers on src/** changes and
uploads the server log on failure
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 1 E2E spec and coverage roadmap
- specs-system/060-webapps-core.js: smoke + interaction coverage for
the highest-importance WebApps (NotepadA, Text, Photo, Music, Video,
PDF Viewer, Zip File Manager) against the real server, including
opening a real file in NotepadA via the desktop hash convention
- README: document the ranked 44-WebApp inventory and the wave order
for upcoming specs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 2 E2E spec (office/productivity)
specs-system/070-webapps-office.js: smoke + interaction coverage for
Code Studio, MDEditor, Calendar, Notes, Memo, Reminders, OfficeViewer
and Dashboard against the real server, including opening a real
Markdown file in MDEditor via the desktop hash convention and probing
Dashboard's live system-info data source.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 3 E2E spec (media/creative)
specs-system/080-webapps-media.js: smoke coverage for Musicify, Movie,
Manga, Paint, Pixel Studio, Audio Studio, Camera, Recorder and FFmpeg
Factory against the real server, plus a probe of the storage data path
the media library apps browse. Cine Studio keeps its own deep static
suite and is not repeated here.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add WebApp wave 4 E2E spec (utilities/dev/network) + close roadmap
specs-system/090-webapps-utilities.js: smoke coverage for Calculator
(incl. a real 7+8=15 calculation through the UI), Clock, Browser,
Speedtest, Web Downloader, Web Builder, SQLite Admin, Terminal,
AGIForge, AIChat, OTPAuth, Productivity, OnScreenKeyboard, Arozcast,
Management Gateway, UnitTest, CronDemo and Serverless.
This completes coverage of all 44 WebApps under src/web across four
waves. README updated to reflect the full map; full suite (13 spec
files: 4 static + 9 system) passes end to end.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add deep file-transfer critical-path spec (upload/download/search/share)
specs-system/035-file-transfer.js extends the file-explorer coverage
with the transfer features that move real bytes:
- multipart upload of a real file
- media download with byte-exact round-trip verification
- file search by keyword
- share-link lifecycle: create, list, anonymous direct download via
/share/download/{uuid}/ (byte-exact) + preview page, then delete and
confirm the share is revoked
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add account password-change critical-path spec
specs-system/055-account.js exercises the My Account flow on a
dedicated throwaway user (keeping the shared admin login intact):
account settings UI render, userinfo identity, wrong-old-password
refusal, successful change, and that afterwards only the new password
signs in. README updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop backend API spec (every /system/desktop endpoint)
specs-system/021-desktop-api.js covers the full desktop.go API surface
with the exact request shapes desktop.html uses: host/device details;
user self-info (quota/groups/admin), another user's public info via
?target, and noicon; theme listing + set/get round-trip; preference
set/get/remove; createShortcut + listDesktop metadata; icon location
files set/get/del; and renameShortcut incl. off-desktop rejection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop UI shell spec (clock, panels, start menu, search, icons)
specs-system/022-desktop-ui.js drives the real desktop.html: wallpaper
frame mounts, the taskbar clock shows a formatted time, the quick
access panel carries the user identity, the start menu opens with
module entries, its search box narrows the list and reports No Result
for gibberish, the notification bar toggles from the clock, and an
API-seeded shortcut renders as a desktop launch icon.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
* Add desktop float-window + context-menu spec and update README
specs-system/023-desktop-windows.js drives the desktop window manager
and right-click surfaces using the app's own globals and real clicks:
openModule spawns a float window with a taskbar entry; newFloatWindow
creates addressable windows; focus raises z-order; maximize/restore,
minimize and close all work; and the wallpaper + icon context menus
open with the expected entries.
Desktop coverage is now three specs deep (API 021, UI 022, windows
023) on top of the original 020 shell smoke test. README layout
updated. Full system suite (14 specs) passes together.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Video Editor Cline Update (#270)
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Cine Studio, a Premiere-like timeline video editor webapp
A new dark macOS-style video editor under src/web/Cine Studio with:
- Media bin importing from the ArozOS file system (file selector +
File Manager drag-drop) and from the local device (uploaded to
user:/Cine Studio/Media so projects stay portable), with probed
durations, filmstrip thumbnails and decoded waveform peaks
- Multi-track timeline (video/audio) with drag-move, edge trimming,
blade splitting, snapping, track visibility/mute toggles, zoomable
timecode ruler and undo/redo history
- Canvas compositing preview player with per-clip transform, crop
mode, opacity, color controls (exposure/contrast/saturation/presets)
and a WebAudio mix bus for synced audio playback
- .cine project format (open/save/save-as via ao_module file selector,
registered as a file association with its own icon)
- Export pipeline: real-time MediaRecorder render to WebM uploaded to
the ArozOS storage, with optional server-side MP4 conversion through
the AGI ffmpeg library when the host has ffmpeg installed
Backend AGI scripts create the per-user app folders and expose the
ffmpeg availability check / conversion / cleanup actions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Remove macOS traffic lights and implement all stubbed Cine Studio features
Top bar: drop the decorative macOS traffic-light buttons.
Effects (new js/effects.js): per-clip effect stacks (Black & White,
Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain,
Fade In/Out) applied by the compositor so preview and export match.
Fades also ramp audio-clip volume. Gallery panel with rendered preview
cards plus an inspector Effects tab with amount sliders, add/remove and
an fx badge on timeline clips.
Titles and Elements (new js/titles.js): generated clips with no backing
media - text titles (content, size, color, weight, align, vertical
position, plain/lower-third/caption styles) and solid/gradient color
boards. They render through a cached offscreen frame so transforms,
color controls, effects and transitions all apply. Inserted from the
Titles/Elements panels, the T tool or the T key onto a free video track
(auto-created when needed).
Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe
stored on the incoming clip with adjustable duration; the previous
clip's last frame is frozen and blended, with a from-black fallback and
a marker on the clip. Applied from the gallery or the inspector
Transition tab.
Also implemented: Filters panel applying color-preset looks, Libraries
panel listing saved .cine projects (new backend/listprojects.js), media
bin list view toggle, and crop/audio toolbar buttons that jump to the
matching inspector section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add preview direct manipulation, auto track creation and .pxs/.asproj import
Preview (new js/previewctl.js): an overlay canvas on the preview lets
the user click a clip to select it, drag it to reposition and pull a
corner handle to scale it - rotation aware, works for video, image,
title and color clips, with a selection outline and handles drawn over
the frame. Timeline drags now listen on the window because Chrome drops
element pointer capture when the clip is reparented across lanes.
Unlimited tracks: dragging a clip past the outermost lanes creates a
new video/audio track on drop, and dropping bin media onto the empty
timeline area below the lanes does the same, in addition to the
existing add-track button.
Pixel Studio import (.pxs): the layered project is flattened in the
browser - raster layers honoring visibility, opacity and blend mode,
text layers re-rendered from their text data - and used as image media.
Audio Studio import (.asproj): prefers an embedded or referenced
rendered mixdown; otherwise decodes the project's track/clip references
(tolerant field names) and mixes them with an OfflineAudioContext into
a WAV. Both importers keep the original virtual path in the project
file and re-composite when a saved project is reopened.
Both extensions join the import filters, the local-device picker and
the module's SupportedExt list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add the most critical everyday editing features to Cine Studio
Safety and workflow:
- Auto-save (20s, localStorage) with crash-recovery prompt on launch,
cleared once the project is saved to disk (new js/session.js)
- Recent projects list in the project menu (dedup, last 8)
Editing fundamentals:
- Multi-select (shift-click) with group move, group delete, group copy
- Copy / paste at playhead / duplicate clips (Ctrl+C / V / D)
- Ripple delete closing the gap (Shift+Del, context menu)
- Timeline markers: add/remove at playhead (M), flags on the ruler,
jump to next (Shift+M), saved in the project, act as snap targets
- Snapping on/off toggle (magnet button)
- Clip speed 25-400%: timeline length, element sync, trimming and
splitting are all speed aware; audio pitch follows rate
Compositing and playback:
- Blend modes (multiply, screen, overlay, add, soft light, difference)
- Flip horizontal / vertical toggles
- JKL shuttle (reverse scrub / pause / forward up to 8x) and loop
playback toggle; export temporarily disables looping
Output and audio:
- Export current frame as PNG from the export menu
- Detach audio: video clip audio moves to its own audio-track clip
- Audio track solo via the track header context menu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
* Add Playwright E2E suite for Cine Studio + GitHub Actions job
Ports the browser-driven tests used to verify Cine Studio into the
codebase under test/e2e/playwright (outside src/ so they never touch
the Go module). The tests drive the real app in headless Chromium,
generating their own media in-page (canvas -> MediaRecorder WebM,
synthesized WAV) and asserting on rendered pixels, so they exercise the
full compositor / playback / export pipeline rather than mocking it.
Structure:
- lib/static-server.js minimal static server for the ArozOS web root
- lib/harness.js browser launch + app navigation + ok()/fail();
resolves Playwright's own Chromium (no hardcoded
path), overridable via PW_CHROMIUM_PATH
- run.js serves src/web, runs each spec in its own process,
exits non-zero on any failure
- specs/functional.js media probe, playback, edit, round-trip, WebM export
- specs/features.js effects, titles, transitions, elements, filters
- specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import
- specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave
41 assertions across the four specs, all passing locally.
CI: .github/workflows/e2e-playwright.yml installs Node + Playwright
Chromium and runs `npm test`, scoped to changes under the app or the
harness so unrelated commits don't trigger it. Front-end only - runs
independently of the Go build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4
---------
Co-authored-by: Claude <noreply@anthropic.com>
* New webapp RAW Editor (#271)
* Add Raw Editor webapp with RAW decode, develop controls and LUT grading
Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW
files client-side and develops them with a Camera-Raw style interface.
Decoder (js/rawdecoder.js):
- TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2,
ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal.
- CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy
compression, bilinear demosaic with black/white-level normalisation and
camera (AsShotNeutral) or gray-world white balance.
- Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force
SOI/EOI scan) so any RAW still renders when its compression is unsupported.
- EXIF metadata (camera, shutter, aperture, ISO, focal length).
Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing
white balance (temperature/tint), exposure, contrast, highlights, shadows,
whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional
3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local
contrast. Keeps a valid identity 3D texture bound at all times so drivers
that reject incomplete sampler3D bindings still render.
LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a
WebGL 3D texture.
UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout
with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white
balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local
picker and drag & drop) and JPEG export back to storage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Hand off developed image to Pixel Studio on Done
Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the
current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS)
and launches Pixel Studio as a float window with that file as its input
(matching Pixel Studio's ao_module_loadInputFiles hash format), then closes
the Raw Editor window.
Falls back to the normal Save dialog when running outside the ArozOS desktop.
The bottom-bar button is relabelled "Open in Pixel Studio".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout
Rework the develop panel into the 2024 Lightroom-style layout:
- Thin centred title bar with open / save / reset / fit icons.
- Borderless histogram with shadow/highlight clipping indicators and an
EXIF readout (ISO, focal, aperture, shutter).
- "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills.
- Profile selector row.
- Collapsible Light / Color / Effects / LUT groups, each with a chevron to
fold and an eye toggle that bypasses that group's adjustments.
- Lightroom slider rows: label + right-aligned editable value on one line,
thin track below, with coloured gradient tracks for Temperature (blue->
yellow), Tint (green->magenta) and Vibrance / Saturation.
- White-balance eyedropper wired to auto white balance.
- Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined
dimension readout and Cancel / Open in Pixel Studio actions.
- Decorative panel-selector strip on the right edge.
Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain
(post noise) controls to the WebGL develop shader to complete the Effects
group, plus per-group bypass handling in the parameter builder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add ArozOS-backed LUT library with a managed folder
LUTs can now be managed through the user's ArozOS storage instead of only
one-off browser uploads:
- On first use the app creates a "user:/RawEditor/LUTs" folder (via the
file_system newItem endpoint with a CSRF token). Users can drop .cube
files into it with the Files app.
- The LUT panel scans that folder (listDir) and lists every .cube in a
"Library" dropdown; picking one reads it back through the media endpoint,
parses it and applies it live. A refresh button re-scans on demand.
- "Import .cube to library" still loads a local file immediately and now
also uploads it into the library folder so it persists and reappears in
the list next time.
- Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint
line reports how many LUTs are available.
Falls back gracefully to local import when running outside the ArozOS desktop.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add scroll-zoom and right-drag pan; remove unused UI
- Scroll wheel now zooms the photo, centred on the cursor, and the current
zoom level is shown in the status bar. Fit / 100% buttons reset the view.
- Right-mouse (or middle) button drag pans the image; the browser context
menu is suppressed over the canvas. The view re-fits on window resize.
The canvas is now transform-based (translate + scale) instead of the old
fit / 1:1 CSS toggle.
- Removed the Profile dropdown (no camera profiles in this pipeline) and the
decorative right-edge tool strip, so the panel only shows working controls.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Pan with left mouse button and fix LUT dropdown overflow
- Change canvas panning from right-drag to left-mouse (and middle) drag, with
a grab / grabbing cursor over the image. The context menu is no longer
suppressed.
- Fix the LUT Library dropdown (and any select) overflowing the panel when an
option label is long: give .mini-select min-width:0 so it can shrink inside
its flex row instead of stretching to the widest option.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Load EXIF from JPEG APP1 so shooting info shows reliably
Some RAW files (and any plain JPEG) did not populate the ISO / focal /
aperture / shutter readout under the histogram. The cause: when the RAW's
outer TIFF structure fails to parse, the image still loads via the brute-force
embedded-JPEG scan, but the metadata comes back empty.
Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it
reuses the existing TIFF parser) and use it to:
- read EXIF for plain JPEG images, and
- fill any missing EXIF fields from the embedded preview for RAW files,
which rescues shooting info when the main TIFF could not be parsed.
Also harden applyMeta so the EXIF line is written before the window-title
call and a title error can no longer suppress it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB
The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes,
both fixed:
- Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which
introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to
NEAREST and do proper tetrahedral interpolation in the shader — the same
method Photoshop's Color Lookup and Resolve use.
- Transfer function: encode to display with the true sRGB OETF instead of a
plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit
sources, so the values fed into the LUT match what Photoshop feeds it
(previously the mismatch shifted shadow tones the LUT is sensitive to).
Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling.
Verified in-browser: an identity LUT now passes through unchanged (exact
tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to
the constant.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Harden RAW EXIF parsing for real camera files
Improve the chance that ISO / focal / aperture / shutter show for real RAWs
(e.g. Sony ARW), which kept the readout blank:
- Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony
keeps EXIF in the small thumbnail while the full-size preview has none.
- Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets —
that could be pathologically slow / derail a clean parse on real files;
EXIF is reached through the standard ExifIFD (0x8769) pointer.
- Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Fix RAW preview selection: never decode CFA raw as the preview image
On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause:
the CFA raw plane is a lossless-JPEG-compressed stream that also starts with
0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB)
and handed it to the browser to decode as an image. The browser cannot decode
lossless JPEG, so decoding stalled and the pipeline never reached the metadata
display.
Fixes:
- Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG.
- Only accept a range that is a real JPEG (SOI at the start AND EOI at the end)
via a looksLikeJpeg() check, so a truncated raw stream can't be chosen.
- Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't
yield a multi-megabyte junk range.
With this, ARW files pick the correct full-size preview, the image loads, and
ISO / focal / aperture / shutter populate under the histogram.
Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
---------
Co-authored-by: Claude <noreply@anthropic.com>
* RAW Editor - LUT Preview update (#272)
* Add Raw Editor webapp with RAW decode, develop controls and LUT grading
Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW
files client-side and develops them with a Camera-Raw style interface.
Decoder (js/rawdecoder.js):
- TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2,
ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal.
- CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy
compression, bilinear demosaic with black/white-level normalisation and
camera (AsShotNeutral) or gray-world white balance.
- Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force
SOI/EOI scan) so any RAW still renders when its compression is unsupported.
- EXIF metadata (camera, shutter, aperture, ISO, focal length).
Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing
white balance (temperature/tint), exposure, contrast, highlights, shadows,
whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional
3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local
contrast. Keeps a valid identity 3D texture bound at all times so drivers
that reject incomplete sampler3D bindings still render.
LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a
WebGL 3D texture.
UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout
with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white
balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local
picker and drag & drop) and JPEG export back to storage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Hand off developed image to Pixel Studio on Done
Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the
current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS)
and launches Pixel Studio as a float window with that file as its input
(matching Pixel Studio's ao_module_loadInputFiles hash format), then closes
the Raw Editor window.
Falls back to the normal Save dialog when running outside the ArozOS desktop.
The bottom-bar button is relabelled "Open in Pixel Studio".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout
Rework the develop panel into the 2024 Lightroom-style layout:
- Thin centred title bar with open / save / reset / fit icons.
- Borderless histogram with shadow/highlight clipping indicators and an
EXIF readout (ISO, focal, aperture, shutter).
- "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills.
- Profile selector row.
- Collapsible Light / Color / Effects / LUT groups, each with a chevron to
fold and an eye toggle that bypasses that group's adjustments.
- Lightroom slider rows: label + right-aligned editable value on one line,
thin track below, with coloured gradient tracks for Temperature (blue->
yellow), Tint (green->magenta) and Vibrance / Saturation.
- White-balance eyedropper wired to auto white balance.
- Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined
dimension readout and Cancel / Open in Pixel Studio actions.
- Decorative panel-selector strip on the right edge.
Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain
(post noise) controls to the WebGL develop shader to complete the Effects
group, plus per-group bypass handling in the parameter builder.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3
* Add ArozOS-backed LUT library with a managed folder
LUTs can now be managed through the user's ArozOS storage instead of on…
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alan Yeung <yeungbluecat123@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: calico-cat-3333 <113905958+calico-cat-3333@users.noreply.github.com>
Co-authored-by: mirkosalvato1-ctrl <mirkosalvato1@gmail.com>
Co-authored-by: mirkosalvato1-ctrl <227404546+mirkosalvato1-ctrl@users.noreply.github.com>
Co-authored-by: Po-Han Shih <79733497+stantheman0128@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: 白铭骢 (Mingcong Bai) <jeffbai@aosc.io>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tobychui <24617523+tobychui@users.noreply.github.com>
d23775e273 Add codec-aware playback and fMP4 HLS support
Switch HLS output from MPEG-TS to fragmented MP4, enabling direct MediaSource appending without a demuxer. Add a /media/probe/ endpoint that reports actual codecs and whether a file can be direct-played, replacing the unreliable extension-based check that caused HEVC and 10-bit H.264 files to fail with decode errors. Add hlsmse.js, a lightweight MSE player for Firefox/Chrome that makes hls.js optional. Fix 10-bit transcodes producing High 10 streams browsers cannot decode by adding -pix_fmt yuv420p. Rewrite the fMP4 playlist init segment URI onto the segment endpoint (ffmpeg always writes it as a bare filename).
- Просмотр сравнение для этих 2 коммитов »
6 дней назад