| 2026-09-18 |
Panel polish: settings spacing, drawer footer corners, login logo, register width
...
- Settings cards: 16px top margin (was bottom-only, the first card hugged
the page header)
- Drawer footer: stretch .shell-footer to full width — as a shrink-to-fit
flex item the margin-right:auto on the nickname never engaged, so the
name and the sign-out button sat together on the left
- Login card: the real BugTrail mark instead of the generic ph-bug icon
- Register card: 460px wide on desktop (kit .card max-width lifted)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
5 hours ago
|
Project deletion in the panel; project page works without a session
...
- DELETE /api/projects/{id} existed but had no UI: danger icon button on
each project card + GnConfirmDialog (cascade handled by the DB FK).
- /p/<token> errored for logged-out visitors: the report list hit the
owner-only /projects/{id}/reports. Added a public
/projects/by-token/{token}/reports endpoint (same shape) and pointed
ProjectPage at it.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
5 hours ago
|
Download page: breathing room around download buttons and section titles
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
7 hours ago
|
Keep extension zips out of the repo — make prod builds them
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
8 hours ago
|
Download page: extension install guide for Chrome and Firefox
...
- public /download page (nav item «Расширение»): per-browser download
buttons and step-by-step install instructions, setup (server URL is
the panel's own origin) and hotkey reference, en/ru
- npm run package -w @ltt/extension zips dist/{chrome,firefox} into
packages/web/public/ext (stable names, manifest at archive root so
"Load unpacked" works right after unpacking)
- make ext / make prod always build fresh zips; deploy/.env.example
seeds the release address bugtrail.gnexus.space
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
8 hours ago
|
Report cards: breathing room under the section title
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
8 hours ago
|
AI prompt dialog: let the textarea span the full modal width
...
The kit caps GnTextarea's wrapper at 600px; lift it for the prompt dialog
so long prompts are comfortable to review and edit.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
9 hours ago
|
AI prompt generator on the report page
...
The header gains an "AI prompt" button: it builds a ready-to-paste
bug-fix prompt for a developer's AI coding agent — description, page
URL, element context (selector, classes, text, test attributes),
environment, recorded steps and token-scoped attachment links — and
opens it in an editable dialog with a copy button. Labels follow the
panel language via i18n (en/ru).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
9 hours ago
|
BugTrail logo in the app header at 48x48
...
Wire the existing public/bugtrail.svg into GnNavigationShell's logoSrc
and raise the kit's 22px brand-image cap to 48px (global override — the
shell renders the topbar outside the scoped content slot).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
9 hours ago
|
Report page: swap header buttons, fix back navigation on share links
...
- the copy-link button now comes before "Start replay" in the header
- "Back to project" no longer depends on in-app history: on a cold
share-link visit (note or recording opened by URL) it falls back to
the report's project page — the detail GET now returns
project_share_token; without a project reference it goes to the
projects list
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
9 hours ago
|
Attachments tab shows an empty state when there is nothing to show
...
The tab no longer disappears when a report has no attachments (or when
everything is already displayed in Details) — it renders GnEmptyState
("Вложений нет" / "No attachments here") instead of a blank card.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
10 hours ago
|
Video in report details + 768px cursor crop quality
...
- web panel: screen recording now plays in the Details tab (large
video card), removed from the Attachments thumbnails to avoid
showing it twice
- screencast cap raised 1280 -> 2560 so wide viewports keep the
cursor crop at native resolution (user viewport 2552 was scaled
down to 1280, halving the video size)
- crop raised 512 -> 768 CSS px; GIF fallback stays at 512
- VP8 bitrate now scales with output size (~0.18 bits/px/frame,
capped at 4 Mbps) instead of a fixed 1 Mbps
- e2e ffprobe assertion updated to the 768px cap
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
11 hours ago
|
| 2026-09-17 |

Record silent WebM screen video instead of GIF during recordings
...
The recorder now captures continuous screencast frames via the CDP
screencast API and encodes them into a silent WebM (VP8, ~15 fps, capped
at 800px wide) uploaded as recording.webm. WebCodecs VideoEncoder is not
exposed to service workers, so encoding runs in an offscreen document
(chrome.offscreen) fed by base64 frame batches over a runtime port; the
result is verified with a local <video> playback probe and falls back to
the cursor-following GIF when encoding or verification fails (Firefox,
old Chrome, broken output).
Root cause of the earlier corrupt output: webm-muxer silently produces a
broken file when the first chunk's timestamp is non-zero — media
timestamps now start at the first frame and the muxer uses
firstTimestampBehavior: "offset".
The e2e now validates the uploaded recording with ffprobe (vp8 codec,
positive duration) and still covers the GIF fallback path, console-step
dump, navigation survival and replay.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|

Record screen video around the cursor + console dump per recording
...
The recorder now captures continuous screen video instead of single frames
per event. captureVisibleTab is quota-limited to ~2 shots/sec, so the video
rides a CDP screencast (Page.startScreencast) over the chrome.debugger
connection: frames arrive throttled to ~15 fps, decimated past 600 to bound
memory. At submit, the GIF is cropped to a 512×512 square centered on the
cursor position from the mouse track at each frame's time, paced by real
frame gaps — a "video" of exactly the area the tester was looking at.
Firefox and a busy debugger degrade to the old per-event screenshots; the
video path is a videoCapture setting (default on, like hoverReplay).
Console errors now ride along with recordings: a MAIN-world document_start
tap wraps console.error/warn and the uncaught error/rejection handlers,
posts through the relay content script, and lands as "console" timeline
steps (capped at 200, text truncated at 2000 chars). New consoleCapture
setting; the server schema, shared types and the panel timeline (warning
icon) accept the new step type; replay counts such no-effect steps as
played so the played/total summary stays honest.
E2E generates a console error + warning mid-recording, asserts the console
steps, and validates the GIF header: 512px wide with 3+ frames.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|

Record the mouse path and play it back with a virtual cursor
...
- Recording: content script samples mousemove at ~25 Hz (2 px / 40 ms
thresholds), batches it to the background every second and before
submit; stored as reports.mouse_track (viewport + points, capped and
decimated server-side) via a new alembic migration
- Replay: a virtual cursor (overlay arrow) walks the recorded path,
scaled to the current viewport, dispatching synthetic mousemoves so
JS hover handlers stay live; clicks snap the cursor to the target
- Replay errors: page-load timeout aborts with a clear message, a
closed tab aborts, per-step failures (missing elements) are
collected, reported in the flash and in the replay result
- Panel: "Start replay" button on recording reports talks to the
extension through a new tiny relay content script (window messages,
no extension-id config), with presence check and toasts for
missing extension / no response / partial replay (en + ru)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Add BugTrail logo: extension icons, favicons and popup/options branding
...
SVG mark (brand/bugtrail.svg): a bug at the head of the trail of steps
it walked, Tokyo Night palette. PNG icons 16/32/48/128 are rendered
from it (verify-logo.mjs) and shipped in the extension manifest;
web panel gets an SVG favicon; popup and options headers show the mark
instead of the generic bug glyph.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Rename the service to BugTrail
...
Bug + trail: the recorded trail of actions leading to the bug.
User-facing rename in the web panel shell, extension manifest/popup/
options, API title, i18n locales and README; Firefox id is now
bugtrail@gnexus.space. Internal @ltt/* package scopes unchanged.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Report page: replace nonexistent ph-cursor-click timeline icon
...
The bundled Phosphor set has no cursor-click glyph, so click steps in
the steps timeline rendered an empty marker. Use ph-mouse-simple, and
audit all other icon names against the bundled icons.css (all valid).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Make the annotation editor comfortable to draw in
...
- AnnotationEditor gains a fit="contain" mode: the canvas scales to fit
its box entirely instead of being cropped to container width.
- Report page: "Edit annotations" now opens a fullscreen editor overlay
(toolbar + large canvas + Save/Cancel, Escape cancels) instead of the
small inline editor.
- Extension composer: widened to 920px and the screenshot area now takes
55vh with the canvas contain-fit, so there is actual room to draw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|

Annotated screenshots in lightbox; region/whole-page capture in extension
...
- Extract shared shapeDraw.ts (pen/arrow/rect/text) used by both the
annotation editor and the viewer.
- ScreenshotViewer lightbox now renders a canvas with the screenshot plus
annotation shapes baked in, so opening a screenshot fullscreen shows the
drawn version instead of the raw image.
- New RegionSelector step in the extension: after picking an element, the
page is captured pristine (before any overlay renders) and the user can
either drag a region on the page (cropped at devicePixelRatio) or take
the whole page via the button / Enter.
- Whole-page capture scrolls and stitches viewport tiles, hiding the
overlay and fixed/sticky elements; per-tile captures retry with backoff
because captureVisibleTab is throttled.
- NoteComposer receives the screenshot from the region selector instead of
capturing on its own; e2e updated (Enter = whole page).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Web: drop avatars, show navigation on shared project/report pages
...
- remove GnAvatar from the shell footer and the settings profile card
- AppShell falls back to a plain centered body when nobody is logged in, so
ProjectPage and ReportPage can wrap it too: logged-in users get the nav
shell on share-token pages, anonymous visitors keep the bare layout
- pages no longer carry their own max-width/padding (the shell body owns it)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Report page: full-width status select, icon-only edit button
...
- CompactSelect accepts "100%" width; the status select now fills its card
- kit cards wrap content in .card-content (padding:15px) on top of the card's
own padding — move report-card padding there so controls reach the edges
- description edit is a GnIconButton (pencil, sm) instead of a labeled button
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Report page: full-width layout, attachment previews, screenshot lightbox
...
- stretch the kit's GnTabs (.tabs-panels shrink-wraps as a flex item) so the
details grid and panels span the whole shell
- attachments tab: image thumbnails with filename/size tiles instead of a
bare file list
- ScreenshotViewer: fullscreen lightbox with wheel/toolbar zoom capped at the
image's natural resolution, drag-to-pan, Esc/backdrop close (a drag that
ends off the image no longer closes it)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
UI: redesign extension options page, panel tweaks from review
...
- options page: was losing its styles — the content pass overwrote
assets/style.css (cssCodeSplit:false, shared asset name); options now
emits assets/options.css and the page uses kit components (GnCard/
GnInput/GnButton/GnSelect/GnAvatar) for the same look as the panel
- panel: hide the kit topbar "current section" chip entirely (page
headers already carry context)
- ProjectsPage: vertical rhythm via a 20px column gap; project cards
redesigned (name + compact copy icon, clamped description, footer
link "Open →" instead of the clunky boxed button); gap between the
create-modal action buttons
- e2e: options-page assert follows the new profile markup
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|

UI polish: fix black-on-dark leftovers, spacing, unstyled elements
...
- theme.css: design tokens mirroring kit's hardcoded Tokyo Night palette
(--ltt-* + --color-* aliases used by @ltt/ui and the overlay)
- CompactSelect: kit GnSelect is a 54px/600px form control — compact
variant for toolbar filters and the report status select
- ProjectPage: filters were blank (null modelValue matches no <option>)
and huge; drop the floating GnTable caption chip
- AppShell: empty topbar chip is now a user identity + logout; remove
unused props
- ReportPage/ProjectsPage/SettingsPage: kit .card is width:max-content/
max-width:340px — cards fill their grid now; toolbar shows localized
project count; PageHeader on settings
- ElementContext/EnvironmentInfo: row separators, dim labels, formatted
CAPTURED date, selector rendered as a code chip
- ScreenshotViewer: optional labels prop (panel passes i18n strings)
- i18n: ru plural rules ("1 проект"), no hardcoded EN strings on
auth pages; hide kit's "Forgot password?" stub link
- extension overlay: define --color-* vars on the shadow mount point
- Makefile: ext:watch/ext:test targets never parsed (colon in
.PHONY/rules) — renamed to ext-watch/ext-test
- shot.mjs: screenshot harness for visual review of all pages
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Web panel: Vue 3 + gnexus-ui-kit, auth, projects, reports, i18n
...
- Monorepo packages: @ltt/shared (types+client), @ltt/ui (AnnotationEditor,
ScreenshotViewer, ElementContext, EnvironmentInfo), @ltt/web (panel)
- Kit assets served at /assets in dev and build (absolute font URL workaround)
- Pages: login/register, projects, public project+report pages (token=auth),
settings with en/ru switcher
- Annotation editor: pen/arrow/rect/text, Tokyo Night palette, undo,
fraction coordinates, vector shapes persisted via attachment PATCH
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|