История изменений
История изменений ведётся на английском языке.
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning.
[Unreleased]
[1.2.3] - 2026-11-02
Fixed
pulsar build --target androidworks after a Pulsar upgrade: a CMake build cache generated by another version is cleared instead of failing on a source tree mismatch.- Desktop toolchains and built apps bundle the
QtMultimediaQML module, the multimedia plugins and the TLS/network-information plugins. Windows now scans the host QML imports withwindeployqt, so in-app video andwss://WebSockets work from release builds. - The Android Qt bundle ships
qtmultimedia. An older bundle is detected and replaced onpulsar install --androidor the first Android build. - Release packaging fails when the staged toolchain misses a QML module or the multimedia plugins used by the host.
[1.2.2] - 2026-11-02
Fixed
- The Linux Qt bundle includes the libraries QML modules link to
(
libQt6QuickControls2Impl,libQt6QuickLayouts,libQt6QuickEffectsand the rest), so Qt Quick Controls plugins no longer load system copies and fail with a Qt version mismatch.pulsar runandpulsar buildwork again from the released toolchain. - The CLI archive ships
CMakeLists.txt,host/,bridge/,launcher/andandroid/, sopulsar build --target androidworks from an installed release instead of failing on a missingCMakeLists.txt.
[1.2.1] - 2026-11-02
Fixed
- Built-in Catppuccin theme tokens (
mauve,text,subtext,surfaceand the rest) are typed by default, soEmptyStateand other SDK defaults typecheck in apps that do not augmentThemeColors. pulsar updateverifiesSHA256SUMS, accepts--version <v>, and relinks the current app'snode_modules/pulsarto the new SDK. Apps created by newer CLIs link through$PULSAR_HOME/current, so they follow later updates.
[1.2.0] - 2026-11-02
Added
- Responsive shell:
createBreakpoints(app)plus window width/height aswindow-resize(desktop and Android rotation/split screen),NavBar,NavigationRail(with apaddinggutter),Container(maxWidth),maxWidth/alignon layout nodes andGridwithcolumns: "auto". ColumnandRownow honourpaddingas an outer gutter.- Components: Avatar (initials/status/badge), Badge (count or dot pill, and a
badgeprop on icons/buttons/avatars), Skeleton, Spinner, BottomSheet, EmptyState, Toolbar, Fab, Menu, Accordion, Segmented, SearchField, RangeSlider, Radio/RadioGroup, Tabs, Pager, Snackbar and Popover. - Elevation and shadows render through
MultiEffect; panels support gradients, border colours and rounded corners. - Neon glow on any component (
neon: trueorNeonOptions) withMultiEffect, now on Android too.effects: falsekeeps a plain outline and software rendering falls back to it automatically. - Grid and virtualised list primitives: auto columns, end-reached paging, pull-to-refresh, multi-select, sticky sections, swipe actions and drag reorder.
- Gestures and layers: long press, tooltips, pinch zoom, pager and overlays.
- Rich text and input: TextArea, password fields, keyboard hints, submit/focus callbacks, autofocus, max length, read-only, selectable text, markdown, elide, alignment and max lines.
- Screen router (
createRouter) with a navigation stack and system back handling. - Host-backed media player: playlists, play/pause/seek/rate/volume, state/position/duration events, and an Android foreground service with MediaSession and lockscreen controls.
- Clipboard, OS share, Android orientation lock and keep-awake, and accessibility labels on common nodes.
- Runtime OS permissions (
permissions.request/check) withosPermissionsinpulsar.jsonmapped into the Android manifest. fs.watchandnet.downloadwith progress and Range resume.- Android notification channels and tap routing; shared text and opened files arrive as app events.
- Native macOS menu bar from
app.setMenu([...]): nested menus, separators, shortcuts and checkable items; choosing an item emitsmenuwith its id. Linux and Windows ignore the call for now. - Desktop power monitor:
system.power()returns the power source, battery state and percentage;power-suspend,power-resumeandpower-sourceevents fire on sleep and on AC/battery changes. Linux uses logind and UPower over D-Bus with a sysfs fallback; other platforms reportunknown. notify.showtakesactions: [{ id, title }]; a button press emitsnotification-actionwith the token and id. Uses the freedesktop notification daemon on Linux (D-Bus); other platforms show the plain body.- Desktop video playback in a built-in full-screen player:
fs.openon a video file plays it in-app when QtMultimedia is available instead of handing it to the OS. The release toolchains now bundle QtMultimedia. Tap or Space pauses, Escape or the close button exits, with a seek bar and timer. - Theme work: Catppuccin Frappe/Latte presets, Paper Mono and Material Symbols, typed named/CSS colours and custom theme tokens, theme overrides, density and font scale, motion tokens and transparent frameless windows.
Sheet/Modaltakedismissible(defaulttrue) andduration(fade time in ms, default 140).dismissible: falsekeeps the overlay open on a backdrop tap.
Changed
Store.setis a no-op when the new value is deeply equal to the current one (same JSON), so polling sync loops no longer re-render unchanged lists.- The neon effect is drawn with
MultiEffectinstead of a custom shader. - Controls default to the neutral Qt Quick Controls Basic style before the theme styles them.
Fixed
- Page scroll now moves its content: the wrapper is parented to the Flickable
contentIteminstead of the Flickable itself. - A
VirtualListscrolls its own rows again; row swipe gestures are limited to the x axis, and a non-interactive list passes drags to the page. - Column/row and navigation rail padding is applied to the first and last visible children, so content stays off card and window edges.
- Neon on Android renders a real glow again; the outline fallback anchors to the right item and the demo stacks it vertically on a phone.
- The switch thumb no longer lags when turning on.
- Taps inside a sheet panel no longer fall through to the backdrop and close the overlay, and the tap that opened a sheet no longer closes it.
- Sheets fade in and out on opacity instead of scaling, which is cheaper for large trees on mobile.
- Text width/elide, grid column stretching, virtual-list row opacity and input backgrounds are corrected.
- Desktop file dialogs on Linux use the Qt dialog instead of the platform
theme's native one, so the picker lists files under a KDE theme outside
Plasma instead of failing with
Unknown protocol "file". - Builds honour the app's root
.gitignoreand a new manifestignorelist, and always skip.env*andsync.db*, so secrets and local databases no longer end up in executables, APKs or the Android dev payload.
Docs
- README (English and Russian) covers the responsive shell, the new components, breakpoints, navigation rail padding and neon.
Tests
- Unit tests for
fs.open,fs.exportTo,dialog.toastand the__export-resultreply; media andfs.watchtests are isolated from the global permission gate.
[1.1.0] - 2026-11-01
Added
net.websocket(url, options?)forws://andwss://connections:open,message,closeanderrorevents, text and binary messages, subprotocols, custom headers and a connect timeout. It runs in the native host on Qt WebSockets and needs thenetpermission.- Qt WebSockets is now a build dependency; release toolchains and Android Qt bundles ship it.
- JS UI kit for QML-free apps:
card,appBar,list,scroll,icon,iconButton,chip,sheet,progressandselect, a light/dark theme and the Material Icons font. Re-renders now reconcile existing QML objects instead of rebuilding the tree, preserving focus and scroll. - QML-like TypeScript components:
bind,For,When,defineComponentand web-named components (Column,Row,Card,Header,Input,Checkbox,Modal, ...). Children are variadic; the existingui.*factories stay compatible. pulsar createnow scaffolds the TypeScript template by default. The QML starter moved to--template qml;--template jsis an alias for the default.- Android dev loop:
pulsar dev --androidbuilds a dev APK once, serves the bundle overadb reverseand reloads the app in 1–2 s. Native inputs (host C++, manifest, CMake, app id) are fingerprinted, so the APK is rebuilt and reinstalled only when they change. - Device control from the CLI while the dev loop runs:
ui,state,tap,type,expect,shot,swipe,keyandeval, coordinate input with--at, andui --systemfor system dialogs. - A flow-test API (
cli/testing.ts) for driving a running dev app withtap,type,expect,stateandshotfrom a Bun script. - In-process reload (
pulsar reload): the QuickJS context is recreated and the store is seeded from the previous session, so JS edits apply in about 200 ms without restarting the app. - A dev error overlay with a Reload button; stack frames are mapped back to the TypeScript sources in the terminal and in the overlay via inline source maps.
Changed
For/Listrender a scrollable column instead of aListViewfor now, so rows keep correct hit areas on Android. Row paths stay keyed; virtualization returns later.
Fixed
- TypeScript UI windows now render on Android: the embedded host bundles
PulsarView, applies__uitrees to the window and exposes the bridge as a context property. - Android text input and checkbox taps now reach the app store (
textChangedplus a tap overlay), so typing, toggling and adding tasks work on device. Store.setstores the new value before notifying listeners, so a UI render triggered by a change sees the updated state instead of the previous one.- Checkboxes and switches no longer emit
togglewhen their checked state is set programmatically, which could otherwise loop through the app store.
[1.0.1] - 2026-10-31
Added
pulsar doctorwarns when the active toolchain version differs from the CLI version, with the command that fixes it.
Docs
- README (English and Russian) now covers
fs.open,fs.exportToanddialog.toast, including where exported files land on desktop and Android.
Tests
- Unit tests for
fs.open,fs.exportTo,dialog.toastand the__export-resultreply, using a mock transport.
[1.0.0] - 2026-10-31
First stable release. The documented API is considered stable; the gaps listed below are planned for 1.1.
Platforms
- Linux x64 and ARM64, macOS Intel and Apple Silicon, Windows x64 and ARM64 ship a CLI, a fat toolchain with bundled Qt, and a slim toolchain without it.
- Android arm64-v8a builds a signed APK (minSdk 28, targetSdk 35).
- Linux ARM64 and Windows ARM64 are built and packaged in CI but have not been run on real hardware yet. iOS is not supported.
Added
- Single-file desktop apps: a Qt-free launcher embeds the runtime and the Qt host into one executable.
- UI from JavaScript:
ui.column/row/box/text/button/...renders a window without QML, re-rendering when theStorechanges. - Embedded QuickJS harness on the desktop (
qml-host-qjs). - Network in the native host:
net.fetchand streamingnet.requestwith timeout, redirects and abort. - OS integration: single instance with
second-instance, deep links and open files (open-url,open-file), file associations, recent documents, secure storage backed by the OS keychain, and manifest permissions enforced on every capability. - System surface: notifications, screens, theme, locale, tray, dialogs and the
full
fscapability set. - Android: in-process QuickJS and QML, lifecycle events (
app-pause,app-resume,app-stop,back-pressed), native HTTP with binary streaming, andpulsar install --androidto provision JDK, SDK, NDK and Qt. - Attachments: the multi-file SAF picker and
fs.exportToto the device Downloads on Android,fs.openanddialog.toaston both platforms, andfs.exportTo/fs.openon the desktop. - Portable runtime target with an import audit (
pulsar check --target android|portable).
Fixed
- Android: the keyboard now opens on the first tap on Samsung and Android 16; the packaged Qt bundle carries the patched input delegate.
Known gaps
- No WebSocket in
net. - The JS-rendered UI rebuilds the whole tree on every change.
- Installed apps do not update themselves;
pulsar updateonly updates the CLI. - Notification action buttons, a desktop power monitor and a native macOS menu bar are not implemented.
- Android x86_64 (emulators) is not packaged.
[0.2.0] - 2026-10-24
Added
- Android support:
pulsar build --target android, the APK toolchain bootstrap and the published Qt for Android bundles for Linux and macOS hosts. - An engine-neutral core with the
portabletarget. - Published Qt for Android bundle made relocatable and self-contained.
[0.1.3] - 2026-10-15
Added
- Releases for Linux, macOS and Windows with per-platform Qt packaging.
- Bootstrap installers for shell and PowerShell.
[0.1.0] - 2026-10-14
First public builds: Linux release, self-contained Qt runtime and the single-file layout.