Releases: lightly-ai/lightly-studio
Releases · lightly-ai/lightly-studio
Release list
v1.0.3
Added
- Python SDK:
limitparameter onImageDataset.add_samples_from*methods to index only the first N samples of a dataset. - Python dataset queries now support model evaluation queries on the annotation level.
- View class distribution for image classification.
- Custom embedding models can be registered.
Changed
- Embedding plot legend is now compact and scrollable, and the WebGPU fallback message is no longer shown.
What's Changed
- Add VideoFrameDataset + VideoFrameSample type (frames() and querying to follow) by @MalteEbner in #1502
- Add limit support to fsspec file listing by @IgorSusmelj in #1544
- New argument to limit how many samples to index by @IgorSusmelj in #1545
- Restore 1.0.2 section in changelog by @IgorSusmelj in #1550
- Add Fast Track verdict contract and guardrail framework by @michal-lightly in #1539
- Fast Track: Add guardrail runner by @michal-lightly in #1546
- [Prefactor] Extract shared embed_image_files_batched helper by @JonasWurst in #1553
- Migrate LoadingLoggingContext call sites to FileOutcomeReport by @JonasWurst in #1552
- Make object embeddings opt-out by @MalteEbner in #1548
- Image folder ingest: record missing/broken outcomes instead of silent skip by @JonasWurst in #1558
- Add VideoDataset.frames() and queryable VideoFrameSampleField by @MalteEbner in #1555
- Add frontend ESLint runner and complexity ESLint config by @LeonardoRosaa in #1549
- Fast Track: Add git context provider + local run tooling by @michal-lightly in #1554
- Embed COCO instance-segmentation crops by @MalteEbner in #1566
- Fast Track: Add API-backed guardrail context by @michal-lightly in #1565
- Fast Track: Add Guardrails CI entry + workflow (judges only) by @michal-lightly in #1570
- Add frontend complexity guardrail by @LeonardoRosaa in #1567
- Fix plugin filter resolving to AnnotationsFilter instead of SampleFilter by @horatiualmasan in #1568
- Add VideoFrameSample.parent_video (read parent-video fields from a frame) by @MalteEbner in #1572
- Fix AnnotationMetricQuery.confusion() by @lukas-lightly in #1573
- Add batched embedding helper for in-memory PIL images. by @horatiualmasan in #1574
- Fast Track: Add file status to ChangedFile by @LeonardoRosaa in #1579
- Add tests/docs for video frame sampling by @lukas-lightly in #1577
- Add backend complexity guardrail by @LeonardoRosaa in #1571
- Annotation/labelformat & COCO ingest: record missing/already-present/added outcomes (LIG-10031) by @JonasWurst in #1569
- Fix: Improve UX for embedding plot and its legend by @IgorSusmelj in #1551
- Video ingest: record missing/broken/already-present in the per-run report (LIG-10032) by @JonasWurst in #1591
- Fix plugins doc register by @JonasWurst in #1580
- Add embedding-region model and point-in-polygon core by @ikondrat in #1584
- Add docs for AnnotationMetricQuery by @lukas-lightly in #1547
- Docs for object-level embeddings by @MalteEbner in #1599
- Add VideoFrameSampleField.parent_video (filter frames by parent video) by @MalteEbner in #1590
- Fast Track: Add patch field to ChangedFile by @LeonardoRosaa in #1592
- Filter images by embedding-plot region selection by @ikondrat in #1585
- Add: Tutorial for curating a dataset for YOLO training by @IgorSusmelj in #1595
- Fast Track: Add diff size guardrail by @LeonardoRosaa in #1598
- use annotation_type by @ikondrat in #1603
- backend part to filter annotations by embedding-plot region selection by @ikondrat in #1586
- Send image embedding-plot selection as geometry by @ikondrat in #1587
- Add shared test coverage guardrail base by @LeonardoRosaa in #1594
- Fast Track: add frontend TypeScript test coverage guardrail by @LeonardoRosaa in #1596
- Remove unnecessary export wrapper functions. by @MalteEbner in #1605
- Preserve user-entered percentage by @LeonardoRosaa in #1609
- Delete Annotation embedding when deleting a annotation by @horatiualmasan in #1606
- Add: yolo26 model evaluation tutorial by @IgorSusmelj in #1613
- Introduce FalsePositiveMetricStub by @lukas-lightly in #1607
- Make export tests follow the test-layout conventions by @MalteEbner in #1611
- Refactor load_into_collection_from_paths by @horatiualmasan in #1617
- feat: introduce bar chart configuration by @ikondrat in #1616
- Fast Track: add backend test coverage guardrail by @LeonardoRosaa in #1597
- Add count_mode to image annotation count endpoint by @LeonardoRosaa in #1622
- Introduce BarChart component to use it in the Data distribution Panel by @ikondrat in #1618
- Update docs and readme by @IgorSusmelj in #1619
- Introduce Dataset distribution panel by @ikondrat in #1620
- View class distribution for image classification by @ikondrat in #1623
- Backend: numeric metadata histogram bins by @ikondrat in #1624
- Add hover-point and thumbnail-URL resolution for the embedding plot by @IgorSusmelj in #1559
- Allow registering a custom embedding model to override the env default by @JonasWurst in #1625
- Bump version to 1.0.3 by @ikondrat in #1626
Full Changelog: v1.0.2...v1.0.3
v1.0.2
Added
- Annotation classes can now be shown or hidden individually in the grid views using an eye icon toggle in the Annotation Classes sidebar.
- Python SDK:
target_fpsparameter onVideoDataset.add_videos_from_pathto subsample frames to a
lower frame rate. Retained frames keep their original frame numbers. - Sampling in Browser now supports combining multiple strategies (diversity, typicality, similarity, metadata weighting, class balancing) in a single selection.
- Sampling dialog now accepts a percentage input alongside the absolute sample count. Editing either field updates the other based on the current
filtered sample count. - Deduplication strategy is available in the Sampling Dialog in the GUI
- Improve confusion matrix usability for large numbers of classes
- Python dataset queries now support classifications, object detections, and segmentation mask annotations.
- Python dataset queries now model evaluation queries on the sample level.
- Improved performance when tagging all samples in the GUI for large datasets.
- Annotation source selection for exports: when multiple annotation collections exist, the export dialog shows a dropdown to choose which collection to export from. The annotation source can also be specified via the Python API using the
annotation_collection_idparameter. - All embedding plot legend entries (especially e.g.
Excluded by filters,No category, etc.) can be hidden by clicking on them. - YOLO object detection export: object detection annotations can now be exported in YOLO format from the GUI export dialog, via the Python API (
dataset.export().to_yolo_object_detections(...)), and via the export API (export_format=object_detection_yolo). - Object-level (annotation) embeddings: annotations can now be embedded and searched by text or image similarity and visualized in the embedding plot.
What's Changed
- Add: first frontend e2e test for model evaluations by @IgorSusmelj in #1427
- Replace CreateSamplingDialog with SamplingCombinationDialog by @LeonardoRosaa in #1433
- Remove legacy create sampling dialog by @LeonardoRosaa in #1438
- Add EmbeddingDeduplicationStrategy sampling strategy by @horatiualmasan in #1435
- Filter-based tagging: INSERT … SELECT tag-assignment helper (PR1) by @michal-lightly in #1441
- Persist enforce coloring by class setting by @JonasWurst in #1436
- Make evaluation run name unique per dataset by @lukas-lightly in #1439
- Extract shared build_sample_ids_query resolver by @michal-lightly in #1442
- Centralize effective annotation coloring mode by @JonasWurst in #1444
- Add percentage input to the combination sampling dialog number of samples field by @LeonardoRosaa in #1432
- Add
ls.start_guito example files and rename Pascal VOC examples by @LeonardoRosaa in #1447 - Resolve evaluation sample metrics by run name by @lukas-lightly in #1437
- Add: examples for docs and readme to add annotations manually by @IgorSusmelj in #1440
- Replace FilterWithCollectionId generics with a video filter union by @michal-lightly in #1448
- Factor out repeated filter functionality into GridFilterBase by @michal-lightly in #1446
- Apply class-enforced colors to classification UI by @JonasWurst in #1449
- Apply class-enforced colors to image annotation overlays and side panel by @JonasWurst in #1454
- Add color intensity and log scale options to confusion matrix chart by @ikondrat in #1456
- Add image crop embedding infrastructure by @horatiualmasan in #1461
- Hide source color markers in AnnotationSourcePill when class coloring is enforced by @JonasWurst in #1462
- Pass color and zoom options through ConfusionMatrix component by @ikondrat in #1457
- Add topNMatrix utility for ranking and filtering confused classes by @ikondrat in #1458
- Endpoint to tag samples defined by a filter by @michal-lightly in #1445
- Add ClassSetDialog component for filtering confusion matrix classes by @ikondrat in #1459
- Add ConfusionMatrixPanel component with interactive class filtering by @ikondrat in #1460
- Add confusion matrix panel evaluation usage by @ikondrat in #1463
- Add annotation crop resolvers for object-level embeddings. by @horatiualmasan in #1468
- Add SampleEvaluationQuery class by @lukas-lightly in #1464
- Add confusion-cell sample filter by @JonasWurst in #1471
- Cache embedding generators across collections in EmbeddingManager by @horatiualmasan in #1469
- Speed up sample_embedding_resolver.get_by_sample_ids more than 10x on Postgres by @MalteEbner in #1472
VideoDataset.add_videos_from_path: addtarget_fpsargument to index frames at a lower frame rate by @MalteEbner in #1452- Drop SampleEvaluationQuery.match() by @lukas-lightly in #1476
- Fix tooltip for top menu elements by @horatiualmasan in #1470
- Drop match() method from annotation query classess by @lukas-lightly in #1477
- Fix right-side padding between image grid and scrollbar by @LeonardoRosaa in #1478
- Add select-all filter snapshot stores to useGlobalStorage by @michal-lightly in #1474
- Emit cell-click events from ConfusionMatrix chart by @JonasWurst in #1475
- evaluations(pr1): evaluate an explicit sample set in ImageDatasetEvaluate by @ikondrat in #1481
- Add documentation for annotation queries by @lukas-lightly in #1485
- feat: refactor evaluation routes into a barrel package by @ikondrat in #1484
- Add docs for sample evaluation query by @lukas-lightly in #1490
- Thread confusion_cell through image filter plumbing by @JonasWurst in #1493
- split evaluation route tests per function by @ikondrat in #1486
- Add routing function to trigger model evaluation from gui by @ikondrat in #1487
- Fix: CSS for hamburger menu on smaller screens by @IgorSusmelj in #1443
- Compute and store crop embeddings at import time by @horatiualmasan in #1465
- Speed up get_all_by_collection_id ~30x on Postgres by @MalteEbner in #1495
- Introduce *MetricStub dataclasses by @lukas-lightly in #1496
- Renumber reserved category block to reserve index 0 for Hidden by @michal-lightly in #1497
- Add annotation class visibility toggles in grid view by @LeonardoRosaa in #1480
- Wire confusion-matrix cell click to the image-grid filter by @JonasWurst in #1494
- Capture select-all filter snapshot + fix video_frame discriminator by @michal-lightly in #1479
- Tag by filter for unmodified select-all by @michal-lightly in #1491
- Hide plot points when their reserved legend category is hidden by @michal-lightly in #1498
- Plot selection excludes the hidden bucket by @michal-lightly in #1506
- Expose annotation types per source by @ikondrat in #1488
- Change create_run_and_image to create_run by @lukas-lightly in #1509
- Pass annotation source at export by @horatiualmasan in #1505
- Make non-categorical legend rows clickable to hide points by @michal-lightly in #1510
- Add annotation class visibility toggles in videos and video frames grid view by @LeonardoRosaa in #1499
- Resolve confusion-matrix FP...
v1.0.1
Added
- Show plugin description and a link to documentation when no plugins are available.
- When sorting the image grid by a numeric field, the field value is now shown as an overlay on each sample.
- Query editor now supports annotation
sourceandconfidencefields in queries. - Panel toggles (Embeddings, Query, Evaluation) moved to a right-rail icon menu beside the collection grid.
- Python SDK:
annotation_sourceparameter onImageDataset.add_samples_from*methods and
Sample.add_annotation/add_annotationsto import or add annotations to a named source. - Python SDK:
Annotation.annotation_sourceproperty to read the annotation source name. - Python SDK:
Sampling.deduplicatemethod to select a deduplicated subset based on embedding distance.
Changed
- The embedding plot legend now reflects the active filter: categories with no
matching samples are hidden. When there are more values than fit in the
legend, the least frequent values are merged into a single "Other" category.
Fixed
- Fixed embedding rendering for users without WebGPU by updating
embedding-atlasfrom0.10.0to0.21.0. - The query filter is now applied consistently across features that use the image filter, such as the embedding plot, sampling, and select-all.
- Brush tool's
Finishbutton gives better visual feedback when an annotation can be finished.
What's Changed
- Update quickstart in readme by @JonasWurst in #1345
- Clean up examples and remove Sampling License note by @JonasWurst in #1346
- Update intro in lightlystudio readme by @JonasWurst in #1349
- Small documentation improvements by @michal-lightly in #1358
- Update docs: Enterprise page by @michal-lightly in #1357
- Remove Advanced tab in docs by @michal-lightly in #1360
- Add useSamplingCombinationDialog hook by @LeonardoRosaa in #1361
- Add combination sampling dialog by @LeonardoRosaa in #1347
- Hide strategy tooltip when sampling dropdown closes by @LeonardoRosaa in #1366
- Batch embedding insertion into DB + tqdm progress bar by @MalteEbner in #1362
- Add combination sampling feature flag by @LeonardoRosaa in #1364
- Remove spinner arrows from numeric inputs in Sampling components by @LeonardoRosaa in #1367
- Highlight the current docs page by @michal-lightly in #1363
- Add annotation source support to combination sampling dialog by @LeonardoRosaa in #1365
- Enable CI on merge_group trigger by @MalteEbner in #1370
- Store embeddings as numpy arrays to reduce load memory by @MalteEbner in #1369
- Docs: Update recommendations for meta data by @JonasWurst in #1372
- Factor out hooks from SamplingCombinationDialog by @LeonardoRosaa in #1371
- Fix Run Selected Classifiers button layout by @michal-lightly in #1353
- Make annotation details left panel scrollable by @LeonardoRosaa in #1375
- Refactor OrderByExpression to enable order-value retrieval by @horatiualmasan in #1359
- Make embedding plot legend filter-aware by @michal-lightly in #1374
- Show sort value in GUI by @horatiualmasan in #1368
- Reset embedding plot legend hide-toggles when the legend changes by @michal-lightly in #1378
- Always show selection checkbox on grid items by @LeonardoRosaa in #1379
- Add link to documentation and description on plugin page by @LeonardoRosaa in #1376
- use overview video in docs by @JonasWurst in #1373
- Display confidence in annotation detail panel by @michal-lightly in #1380
- Add CI for docs build by @michal-lightly in #1381
- Add confidence and annotations source fields to the Langium grammar by @lukas-lightly in #1382
- Add: Tooltip for annotation lock by @IgorSusmelj in #1387
- Fix undo for semantic segmentation annotation creation by @LeonardoRosaa in #1386
- Reorder quickstart examples by @horatiualmasan in #1377
- Update embedding-atlas by @LeonardoRosaa in #1388
- Add AnnotationSourceField by @lukas-lightly in #1384
- Remove outdated Linux/Firefox note for embedding plots by @LeonardoRosaa in #1390
- Add NullableNumericalField for
confidencefield by @lukas-lightly in #1392 - Fix: Explain 'add query filter' in GUI better with tooltip and other text by @IgorSusmelj in #1385
- Update sampling combination dialog copy by @LeonardoRosaa in #1394
- Add annotation_source to ImageDataset.add_samples_from* by @horatiualmasan in #1400
- Update README.md by @JonasWurst in #1383
- Docs: Reformulate Annotations by @JonasWurst in #1393
- Limit diversity strategy to one per sampling combination by @LeonardoRosaa in #1396
- Prevent negative strength values for diversity and class-balancing strategies by @LeonardoRosaa in #1404
- Add annotation_source to Sample.add_annotations by @horatiualmasan in #1401
- Deep copy rework by @mihnea-necsulescu in #1399
- Add deep copy benchmark script by @mihnea-necsulescu in #1403
- Run unit tests conditionally on directory changes by @michal-lightly in #1405
- Fix: Add hint about how to add annotations to the GUI by @IgorSusmelj in #1406
- Fixing the annotation source dropdown by @lukas-lightly in #1410
- Simplify order of strategies hint by @LeonardoRosaa in #1411
- Revert "Fix: Explain 'add query filter' in GUI better with tooltip and other text (#1385)" by @LeonardoRosaa in #1417
- Apply query filter to embedding plot coloring and other features by @michal-lightly in #1409
- Add right rail tabs for collection side panels by @LeonardoRosaa in #1391
- Move db_***.py files into a database directory by @MalteEbner in #1341
- Extract frontend tests into a parallel CI job by @michal-lightly in #1414
- Rework delete dataset by @mihnea-necsulescu in #1408
- Parallelize backend DuckDB tests by @michal-lightly in #1418
- Improve bulk tag assignment performance by @MalteEbner in #1419
- Index FKs by @mihnea-necsulescu in #1415
- Fix unreadable red hint text in strategy tooltip by @LeonardoRosaa in #1395
- Add delete dataset benchmark by @mihnea-necsulescu in #1416
- Split general e2e tests into two shards by @michal-lightly in #1422
- Disable brush tool Finish button until an annotation is active by @michal-lightly in #1421
- Add validation tooltip to sampling combination dialog create button by @LeonardoRosaa in #1412
- Parallelise backend Postgres tests by @michal-lightly in #1425
- Fix Select trigger layout and add variant prop by @LeonardoRosaa in #1423
- Add EmbeddingDeduplicationStrategy sampling strategy by @horatiualmasan in #1420
- Remove combination sampling feature flag by @LeonardoRosaa in #1426
- gui_benchmark.py: add options to use Postgres and full enterprise backend + Benchmark on 10M by @...
v1.0.0
Added
- Show confusion matrix in evaluation results for classification.
- Enable picker for annotation source menu
- Embedding plot: added a "No coloring" option to the "Color by" dropdown to disable coloring.
- Show ground truth and prediction annotation sources in run details panel
- Image details view: annotations are now grouped by annotation source.
- Image details view: annotation source visibility can be toggled.
- Image details view: pick the target annotation source for new annotations from an on-canvas selector.
- Added Model Evaluation:
- Users can manage annotations from different sources, e.g. ground truth and predictions.
- Users can evaluate per sample metrics for object detection, classification and semantic segmentation
- Users can sort the image grid by the sample metrics: finding errors quickly.
- Users can display confusion matrix to find error patterns.
Changed
- Header menu: show collection name in Annotations entries
- Embedding plot coloring now supports multiple categories per sample, resolving issues with toggling visibility of categories in the legend.
- Made annotation and plot colors more distinguishable.
- General UI improvements.
Fixed
- Embedding plot: when a coloring has more categories than the legend can display, the extra
categories are now grouped into an "Other" entry instead of exceeding the available legend slots. - Grid top bar no longer overflows its container or covers the grid when a side panel is open;
it now shrinks with the available width and wraps onto a second line when too narrow. - Fixed operations on large datasets (more than ~65,535 samples) failing on PostgreSQL with
number of parameters must be between 0 and 65535. - Fixed cascaded delete for annotations linked by calculated metrics.
- Grid annotation source selection now persists when navigating to image details and back.
What's Changed
- Add evaluation metric fields to sort-by dropdown by @LeonardoRosaa in #1131
- Add useEvaluationRuns hook to fetch dataset evaluation runs by @ikondrat in #1162
- Add confusion matrix implementation by @horatiualmasan in #1150
- introduce component to render evaluation run item by @ikondrat in #1163
- Add documentation for plugin repository by @JonasWurst in #1151
- Add color_category and legend to embedding plot coloring by metadata field by @LeonardoRosaa in #1135
- Remove schema.d.ts, openapi-fetch, and legacy build scripts by @michal-lightly in #1159
- Add api endpoint for confusion matrix by @horatiualmasan in #1166
- Add PlotPanel category color utils by @LeonardoRosaa in #1169
- Add tag coloring helpers to tag_resolver by @michal-lightly in #1172
- Embedding coloring factor out common logic by @michal-lightly in #1176
- Upgrade Tanstack to v6 by @michal-lightly in #1134
- Add examples for bulk-adding metadata by @MalteEbner in #1171
- Add PlotColorByPopover for embedding colors by @LeonardoRosaa in #1168
- Respect image or video filters in sampling selection by @LeonardoRosaa in #1164
- Add plot color-by support to the embedding panel by @LeonardoRosaa in #1178
- Add TagColorBy support to embedding coloring by @michal-lightly in #1177
- Add similarity strategy to selection endpoint by @lukas-lightly in #1179
- Release DB session before media streaming I/O by @horatiualmasan in #1175
- Implement AnnotationColorBy for embedding plot coloring by @michal-lightly in #1180
- Add interactive plot legend category visibility by @LeonardoRosaa in #1182
- Docs v2: Write Annotations page by @JonasWurst in #1160
- Remove lightly-edge-sdk dependency by @michal-lightly in #1185
- Annotation Docs: Clean Up by @JonasWurst in #1186
- Introduce panel to show evaluation runs by @ikondrat in #1165
- Docs: annotation collections and predictions by @JonasWurst in #1189
- feat: wire evaluation runs panel by @ikondrat in #1173
- Enable Annotation Collection by @JonasWurst in #1188
- feat: introduce confusion matrix component by @ikondrat in #1183
- Add class balancing to selection API by @lukas-lightly in #1190
- Add frontend similarity selection UI by @lukas-lightly in #1187
- Add tags color-by option to embedding plot by @LeonardoRosaa in #1191
- Add annotations color-by option to embedding plot by @LeonardoRosaa in #1194
- Support integer metadata fields for embedding plot colouring by @LeonardoRosaa in #1193
- Update frontend guideline with Tanstack v6 changes by @michal-lightly in #1184
- Mute Unassigned category color in embedding plot by @michal-lightly in #1200
- Rename to "Label Sources" and "Label Classes" by @MalteEbner in #1207
- Fix DatasetGridHeader to use collection dataset ID by @LeonardoRosaa in #1197
- Add uniform class balancing selection by @lukas-lightly in #1210
- Upgrade Vite to v6 and Vitest to v3 by @michal-lightly in #1205
- Add close button to query editor panel by @michal-lightly in #1211
- Add filters panel title by @michal-lightly in #1209
- Introduce build-dirty dev command by @michal-lightly in #1203
- Install Alembic in LightlyStudio by @horatiualmasan in #1199
- Extract useCreateSelection hook from CreateSelectionDialog by @LeonardoRosaa in #1202
- Fix GUI query not refetching after TanStack v6 upgrade by @michal-lightly in #1213
- Add similarity form for sample selection dialog by @LeonardoRosaa in #1218
- Refactor CreateSelectionDialog to use useCreateSelection hook by @LeonardoRosaa in #1215
- Add class balancing form for sample selection dialog by @LeonardoRosaa in #1217
- Add strategy select component for sample selection dialog by @LeonardoRosaa in #1219
- Stop keyboard event propagation from QueryEditor by @michal-lightly in #1214
- feat: show confusion matrix in evaluation panel by @ikondrat in #1208
- Update Github actions to be compatible with node 24 by @lukas-lightly in #1226
- Factor out filter chip, use it for query filter by @michal-lightly in #1216
- Load applied query when reopening query editor by @michal-lightly in #1224
- Surface SSL errors instead of generic connection failure by @mihnea-necsulescu in #1196
- Fix query editor Apply button disabled on first open by @michal-lightly in #1212
- Add annotation source support to class balancing by @lukas-lightly in #1223
- Allow 16 samples a row in the grid by @horatiualmasan in #1232
- Shorten top bar button text by @michal-lightly in #1234
- Annotation renaming - PR 1/4 by @MalteEbner in #1228
- Remove SessionDep from media serving endpoints by @horatiualmasan in #1192
- Link Lightly Query Language reference into docs by @michal-lightly in #1238
- Rename annotation
label->class_namein the Python SDK (PR 2/4) by @MalteEbner in #1229 - Reorder plot legend by @LeonardoRosaa in #1235
- Replace sort-by popover wi...
v1.0.0rc1
This is a release candidate for v1.0.0.
Please install it explicitly:
pip install lightly-studio==1.0.0rc1
# or
pip install --pre lightly-studioAdded
- Sample selection respects the current image or video filters.
- Added sort-by support via GUI.
- Added similarity selection option.
- Show confusion matrix in evaluation results for object detection.
- Added option to select annotation source for class balancing.
- Added query editor for advanced filtering with custom queries.
Changed
- Renamed the annotation class field
labeltoclass_nameacross the Python SDK and query language. Breaking change. - Renamed the
collection_nameandnamearguments toannotation_source. Breaking change. - Renamed selection to sampling. Breaking change.
Fixed
- Fixed hovering over breadcrumb links on detail pages (annotations, video frames) triggering unwanted navigation.
What's Changed
- Add evaluation metric fields to sort-by dropdown by @LeonardoRosaa in #1131
- Add useEvaluationRuns hook to fetch dataset evaluation runs by @ikondrat in #1162
- Add confusion matrix implementation by @horatiualmasan in #1150
- introduce component to render evaluation run item by @ikondrat in #1163
- Add documentation for plugin repository by @JonasWurst in #1151
- Add color_category and legend to embedding plot coloring by metadata field by @LeonardoRosaa in #1135
- Remove schema.d.ts, openapi-fetch, and legacy build scripts by @michal-lightly in #1159
- Add api endpoint for confusion matrix by @horatiualmasan in #1166
- Add PlotPanel category color utils by @LeonardoRosaa in #1169
- Add tag coloring helpers to tag_resolver by @michal-lightly in #1172
- Embedding coloring factor out common logic by @michal-lightly in #1176
- Upgrade Tanstack to v6 by @michal-lightly in #1134
- Add examples for bulk-adding metadata by @MalteEbner in #1171
- Add PlotColorByPopover for embedding colors by @LeonardoRosaa in #1168
- Respect image or video filters in sampling selection by @LeonardoRosaa in #1164
- Add plot color-by support to the embedding panel by @LeonardoRosaa in #1178
- Add TagColorBy support to embedding coloring by @michal-lightly in #1177
- Add similarity strategy to selection endpoint by @lukas-lightly in #1179
- Release DB session before media streaming I/O by @horatiualmasan in #1175
- Implement AnnotationColorBy for embedding plot coloring by @michal-lightly in #1180
- Add interactive plot legend category visibility by @LeonardoRosaa in #1182
- Docs v2: Write Annotations page by @JonasWurst in #1160
- Remove lightly-edge-sdk dependency by @michal-lightly in #1185
- Annotation Docs: Clean Up by @JonasWurst in #1186
- Introduce panel to show evaluation runs by @ikondrat in #1165
- Docs: annotation collections and predictions by @JonasWurst in #1189
- feat: wire evaluation runs panel by @ikondrat in #1173
- Enable Annotation Collection by @JonasWurst in #1188
- feat: introduce confusion matrix component by @ikondrat in #1183
- Add class balancing to selection API by @lukas-lightly in #1190
- Add frontend similarity selection UI by @lukas-lightly in #1187
- Add tags color-by option to embedding plot by @LeonardoRosaa in #1191
- Add annotations color-by option to embedding plot by @LeonardoRosaa in #1194
- Support integer metadata fields for embedding plot colouring by @LeonardoRosaa in #1193
- Update frontend guideline with Tanstack v6 changes by @michal-lightly in #1184
- Mute Unassigned category color in embedding plot by @michal-lightly in #1200
- Rename to "Label Sources" and "Label Classes" by @MalteEbner in #1207
- Fix DatasetGridHeader to use collection dataset ID by @LeonardoRosaa in #1197
- Add uniform class balancing selection by @lukas-lightly in #1210
- Upgrade Vite to v6 and Vitest to v3 by @michal-lightly in #1205
- Add close button to query editor panel by @michal-lightly in #1211
- Add filters panel title by @michal-lightly in #1209
- Introduce build-dirty dev command by @michal-lightly in #1203
- Install Alembic in LightlyStudio by @horatiualmasan in #1199
- Extract useCreateSelection hook from CreateSelectionDialog by @LeonardoRosaa in #1202
- Fix GUI query not refetching after TanStack v6 upgrade by @michal-lightly in #1213
- Add similarity form for sample selection dialog by @LeonardoRosaa in #1218
- Refactor CreateSelectionDialog to use useCreateSelection hook by @LeonardoRosaa in #1215
- Add class balancing form for sample selection dialog by @LeonardoRosaa in #1217
- Add strategy select component for sample selection dialog by @LeonardoRosaa in #1219
- Stop keyboard event propagation from QueryEditor by @michal-lightly in #1214
- feat: show confusion matrix in evaluation panel by @ikondrat in #1208
- Update Github actions to be compatible with node 24 by @lukas-lightly in #1226
- Factor out filter chip, use it for query filter by @michal-lightly in #1216
- Load applied query when reopening query editor by @michal-lightly in #1224
- Surface SSL errors instead of generic connection failure by @mihnea-necsulescu in #1196
- Fix query editor Apply button disabled on first open by @michal-lightly in #1212
- Add annotation source support to class balancing by @lukas-lightly in #1223
- Allow 16 samples a row in the grid by @horatiualmasan in #1232
- Shorten top bar button text by @michal-lightly in #1234
- Annotation renaming - PR 1/4 by @MalteEbner in #1228
- Remove SessionDep from media serving endpoints by @horatiualmasan in #1192
- Link Lightly Query Language reference into docs by @michal-lightly in #1238
- Rename annotation
label->class_namein the Python SDK (PR 2/4) by @MalteEbner in #1229 - Reorder plot legend by @LeonardoRosaa in #1235
- Replace sort-by popover with Select component by @LeonardoRosaa in #1233
- Fix sort order consistency and support order_by with text embedding similarity by @LeonardoRosaa in #1237
- Refactor CreateSelectionDialog to use new components by @LeonardoRosaa in #1220
- Fix color-by empty state UX by @LeonardoRosaa in #1195
- fix: remove DEFAULT class when creating new annotations by @ikondrat in #1231
- Fix: links in docs are properly colored by @IgorSusmelj in #1242
- Rename selection to sampling by @lukas-lightly in #1240
- Refactor right panel state to single activePanel store by @michal-lightly in #1227
- Remove query...
v0.4.14
[0.4.14] - 2026-05-18
Added
- Added
ImageDataset.add_annotations_from_coco,add_annotations_from_yolo, andadd_annotations_from_labelformatmethods to attach named annotation collections to images already in the dataset. Re-using the samenameappends; a newnamecreates a new collection. Enables ingesting ground truth and predictions from multiple sources side-by-side. - Added
lt_train_scriptto the Python API (lightly_studio.lt_train_script) to generate a LightlyTrain object detection script from split tags. The helper exports train/val COCO annotation files viadataset.export(...).to_coco_object_detections(...)and writestrain_object_detection.pywith the exported paths. - Image samples can be sorted in the grid using image attributes and metadata.
- Added drag-and-drop from the image grid into the image search area.
- Added a select-all button to select all grid items matching the active filters.
- Added
Cmd+A/Ctrl+Akeyboard shortcut to select all samples matching the current filters in grid views (images, videos, video frames, annotations). - Added API endpoints to fetch only sample IDs with optional filters for images, video frames, and annotations (used by the select-all keyboard shortcut).
Changed
- Refactored annotation mask rendering to use a shared web worker pool instead of spawning one worker per canvas.
- Few-shot classifier predictions now land in an annotation collection named after the classifier instead of the generic
annotationcollection, so multi-prediction views can distinguish classifiers. Rerunning a classifier reuses the same collection. - Removed the license key requirement for sampling.
What's Changed
- Fix: Refactor of the tag backend and frontend by @IgorSusmelj in #974
- Introduce QueryExpr Pydantic model by @michal-lightly in #978
- Refactor GridItem to centralize grid item rendering and interactions by @LeonardoRosaa in #971
- Rename AnnotationType.INSTANCE_SEGMENTATION to AnnotationType.SEGMENTATION_MASK by @LeonardoRosaa in #959
- Add pooled mask renderer workers by @LeonardoRosaa in #967
- feat: add deps to run monaco and LSP in browser by @ikondrat in #988
- feat: introduce query editor component by @ikondrat in #990
- Unify grid rendering by @LeonardoRosaa in #991
- Rename function names to the new segmentation mask design by @LeonardoRosaa in #993
- Translate QueryExpr to MatchExpression by @michal-lightly in #987
- feat: introduce useImageUpload by @ikondrat in #985
- Add QueryExpr tests against a database by @michal-lightly in #989
- Add GridContainer for unified grid state rendering by @LeonardoRosaa in #994
- feat: introduce CollectionSearchInput by @ikondrat in #983
- feat: introduce CollectionSearchImage by @ikondrat in #980
- Add QueryExpr to SampleFilter by @michal-lightly in #992
- feat: introduce useFileDrop by @ikondrat in #986
- Improve annotation canvas rendering with shared worker pooling by @LeonardoRosaa in #966
- Rename instance segmentation export naming to segmentation mask by @LeonardoRosaa in #995
- Add (another) Langium grammar prototype by @lukas-lightly in #996
- Rename InstanceSegmentationAnnotation to SegmentationMaskAnnotation by @LeonardoRosaa in #1001
- feat: add button to get value by @ikondrat in #998
- Rename CreateInstanceSegmentation to CreateSegmentationMask by @LeonardoRosaa in #1004
- feat: introduce feature flag to enable query filtering by @ikondrat in #1003
- feat: enable type check for QueryEditor logic by @ikondrat in #1002
- Unify sample/video/frame grid rendering with GridContainer and GridItem by @LeonardoRosaa in #997
- Cosmetic fixes to langium grammar by @lukas-lightly in #1007
- Rename “instance segmentation” to “segmentation mask” across docs and codebase by @LeonardoRosaa in #1008
- Add API tests for query expressions by @michal-lightly in #999
- Refactor GroupsGrid to use shared GridContainer state handling by @LeonardoRosaa in #1010
- Send a parsed query to QueryEditor from the LSP web worker by @michal-lightly in #1012
- Rename image collection frontend routes from /samples to /images by @LeonardoRosaa in #1011
- Enterprise Docs: Add Local Storage Connection Docs for On-Premise Deployment by @MalteEbner in #1000
- Remove unused SampleGrid and SampleGridItem components by @LeonardoRosaa in #1018
- Rename remaining instance segmentation references to segmentation mask in backend by @LeonardoRosaa in #1016
- Refactor AnnotationsGrid to use shared GridContainer/Grid/GridItem components by @LeonardoRosaa in #1015
- Query API: instance segmentation to semantic segmentation by @LeonardoRosaa in #1014
- feat: fix issue with initialising the language client by @ikondrat in #1019
- Rename frontend InstanceSegmentation files to SegmentationMask by @LeonardoRosaa in #1017
- Rename frontend image route helpers from samples to images by @LeonardoRosaa in #1021
- fix export sample labels for segmentation formats by @LeonardoRosaa in #1023
- Add comments to the query grammar by @michal-lightly in #1025
- Rename image grid state from samples to images by @LeonardoRosaa in #1026
- Rename instance segmentation query to segmentation mask by @LeonardoRosaa in #1028
- Rename image collection UI component to Images by @LeonardoRosaa in #1031
- Make hardcoded query compatible with COCO dataset by @michal-lightly in #1030
- Clarify image specific wording and rename isSamples by @LeonardoRosaa in #1032
- Fix query editor startup by @michal-lightly in #1029
- Introduce Langium field types by @lukas-lightly in #1013
- Use Monarch highlighter for query editor - Part I by @michal-lightly in #1020
- Prepare tests for frontend query parsing by @michal-lightly in #1035
- Add memory consumption performance tests by @LeonardoRosaa in #1037
- Frontend query parsing tests by @michal-lightly in #1038
- Add Langium keywords/terminals by @lukas-lightly in #1034
- Docs: sampling page by @JonasWurst in #975
- Fix delete annotation with tag by @LeonardoRosaa in #1041
- feat: use non-worker solution for QueryEditor to avoid using problematic monaco-languageclient by @ikondrat in #1039
- feat: introduce query editor to images grid by @ikondrat in #1040
- Add: Backend endpoint and resolvers for only retrieving sample ids based on filters by @IgorSusmelj in #1043
- Add: Frontend changes for select all samples using ctrl-a or cmd-a by @IgorSusmelj in #1045
- Convert local relative paths to absolute for add_samples_from_coco by @horatiualmasan in #1044
- Keep only the SQL Langium dialect by @lukas-lightly in #1042
- Temporarily disable E2E tests that are timing out by @lukas-lightly in #1049
- Add classification annotation to the grammar by @lukas-lightly in #1046
- Improve tif image support by @MalteEbner in https://github.com/lightly-ai/lightly-studio/pull...
v0.4.13
[0.4.13] - 2026-04-21
Added
- Added a floating selection panel to grid pages.
- Tags can be created and assigned directly from the sample and annotation detail view.
- Tags can be created and assigned directly from the side panel in the grid view.
- Tags can be renamed directly from the side panel in the grid view.
- Tags can be deleted from the side panel in the grid view.
- Show Embedding Plot selection as a filter item in the left panel.
- Added thumbnail quality setting in the Settings dialog. Enable "High Quality Thumbnails" to load compressed JPEG thumbnails in grid views, reducing bandwidth for large datasets.
- Added
Dataset.update_metadatamethod to update metadata of multiple samples at once. - Exposed Pascal VOC segmentation export from the Python interface.
- Added cloud storage support for Pascal VOC semantic segmentation annotations.
Changed
- Embedding plot shows only 2 categories
FilteredandNot Filtered.
Fixed
- Fixed annotation editing UX in sample details by showing a Saving indicator while changes are persisted.
What's Changed
- Add useAnnotationsFilter hook by @horatiualmasan in #861
- Fix: Update css rules to render long text nicely by @IgorSusmelj in #865
- Update metadata of multiple samples at once by @lukas-lightly in #869
- Move coding guidelines by @michal-lightly in #871
- Streamline PR instructions by @michal-lightly in #873
- Add more
dataset_idfields by @lukas-lightly in #874 - Enforce per-pixel instance segmentation and remove semantic segmentation mode. by @LeonardoRosaa in #875
- Remove semantic segmentation settings keyboard shortcut by @LeonardoRosaa in #880
- Move best practices to a separate guideline by @michal-lightly in #876
- Unify segmentation label naming to “Segmentation Mask” by @LeonardoRosaa in #878
- Switch Pascal VOC Export to Instance Segmentation by @LeonardoRosaa in #882
- Store Pascal VOC segmentations as instance segmentation by @LeonardoRosaa in #879
- Change ObjectTrackTable foreign key by @lukas-lightly in #877
- Support cloud-storage paths for Pascal VOC semantic segmentation imports by @LeonardoRosaa in #872
- Replace annotation_type with explicit export_format across export API and UI by @LeonardoRosaa in #886
- Condense frontend guidelines by @michal-lightly in #881
- PE: Model loading logs non verbose by @JonasWurst in #895
- Update the backend guideline by @michal-lightly in #891
- Link all coding guidelines by @michal-lightly in #897
- Keep embedding plot selection when when applying filters by @horatiualmasan in #890
- Print connection message when connecting to enterprise by @MalteEbner in #902
- Introduce show_bounding_boxes_for_segmentation setting by @LeonardoRosaa in #900
- Update label filters counts using embedding plot selection by @horatiualmasan in #887
- Add bounding box visibility toggle for images and videos by @LeonardoRosaa in #884
- Remove semantic_segmentation annotation type and unify segmentation handling by @LeonardoRosaa in #892
- feat: restore scroll state on history back by @ikondrat in #898
- Change foreign key in AnnotationLabelTable by @lukas-lightly in #903
- Use dataset_id in to_annotation_create() by @lukas-lightly in #906
- Persist cloud credentials on the server side by @mihnea-necsulescu in #885
- Internalize remove-tag logic into SegmentTags component by @JonasWurst in #899
- feat: allow to fetch all frames without pagination by @ikondrat in #910
- fix: use immutable updates in annotation crop selection store by @michal-lightly in #907
- Migrate export functions to dataset_id by @lukas-lightly in #908
- feat: Fetch all frames without pagination.frontend by @ikondrat in #911
- Enterprise Docs page: Overview + How to Connect by @MalteEbner in #917
- Create GUI Performance Testing Benchmark by @MalteEbner in #904
- feat: prerender annotations as data urls for for video by @ikondrat in #918
- add 1 week lifetime by @ikondrat in #914
- feat: missed schema update by @ikondrat in #923
- feat: add useSelectionSummary hook by @michal-lightly in #915
- feat: add SelectionPill component and integrate into collection layout by @michal-lightly in #916
- Tag Details: Add tag popover by @JonasWurst in #913
- Make selected items highlight nicer by @michal-lightly in #919
- Add tag from details view by @JonasWurst in #889
- Feat: Add on-the-fly thumbnail generation for faster grid view loading by @IgorSusmelj in #922
- Tag workflow: Add tag input component by @JonasWurst in #926
- Improve segmentation preview rendering by @LeonardoRosaa in #924
- feat: add test for prev/next appearance by @ikondrat in #929
- Fix browser sample focus outline by @michal-lightly in #925
- Enterprise documentation: Add Cloud Storage Docs by @MalteEbner in #928
- feat: fix issue with flackiness in scroll restoration test for annotations by @ikondrat in #937
- Introduce useInstanceSegmentationPreview types by @LeonardoRosaa in #943
- Introduce createPreviewRenderer by @LeonardoRosaa in #945
- feat: introduce utils to fetch collections to simplify logic in layout.ts by @ikondrat in #939
- Introduce createBrushDrawer by @LeonardoRosaa in #944
- Introduce createSourceMaskManager by @LeonardoRosaa in #946
- feat: clean up collection loading by @ikondrat in #940
- feat: introduce middleware to track too long requests by @ikondrat in #947
- Add ObjectDetectionQuery and ObjectDetectionField by @lukas-lightly in #941
- Introduce useInstanceSegmentationPreview hook by @LeonardoRosaa in #935
- Docs: Add Metadata page content by @michal-lightly in #938
- Docs: Add Captions page content by @michal-lightly in #936
- Faster segmentation preview rendering by @LeonardoRosaa in #932
- Support destination-out for eraser by @LeonardoRosaa in #951
- Add ClassificationField and ClassificationQuery by @lukas-lightly in #950
- Docs: Write the Tags page by @michal-lightly in #934
- Docs: Add Export page content by @michal-lightly in #948
- Rework tag workflow by @JonasWurst in #933
- Remove TagCreateDialog by @JonasWurst in #956
- Rename DatasetExport to ImageDatasetExport by @michal-lightly in #957
- Expose PascalVoc export from the Python interface by @michal-lightly in #958
- Faster preview rendering while erasing by @LeonardoRosaa in #952
- Introduce InstanceSegmentationField and InstanceSegmentationQuery by @lukas-lightly in #95...
v0.4.12
[0.4.12] - 2026-04-01
Added
- Added tooltips to features in annotation items in the right panel to improve usability.
- Added keyboard navigation (Space + W/A/S/D) for moving within the zoomable image container.
- Added instance segmentation export to COCO in the GUI.
- Added semantic segmentation export to PASCAL VOC in the GUI.
- Added instance segmentation export to YouTube-VIS in the GUI.
- Added scopes to operators: now operators are tied to certain scopes and also retrieve filters. This enables to execute operators on specific collections, with specific filters, or even on individual samples.
- Added
ImageSample.add_annotationsmethod, as well asVideoSample.add_annotations. - Added
ImageSample.add_captionsmethod, as well asVideoSample.add_captions. - Added
SampleMetadata.updatemethod, allowing batch metadata updates of samples. - Added support for Python 3.14.
- Added
lightly-studiocommand line command. Uselightly-studio guito start the GUI.
Changed
- Smarter font loading reduces initial download from 500kB to 150kB
- Reduced grid page size to 32 items to improve grid view performance.
- Added DatasetTable to the database model, databases from previous versions are incompatible with this one.
- Improved the documentation structure.
Fixed
- Speedup frontend by eliminating two redundant initial video list requests.
- Fixed semantic text search in image and video grids so editing an active query no longer resets or clears the search unexpectedly.
- Fixed tag creation dialog layout so long tag lists stay scrollable instead of expanding the modal.
- Improved video details playback so annotation overlays update more smoothly under higher browser latency.
- Fixed video details playback stopping one frame before the end.
What's Changed
- Add a new CI job for group e2e tests by @michal-lightly in #714
- feat: introduce badge component from shadcn-svelte by @ikondrat in #725
- feat: introduce component to render group component by @ikondrat in #729
- feat: introduce route and redirect to the first group component by @ikondrat in #731
- Add tooltips to features in annotation items in the right panel by @LeonardoRosaa in #718
- Add AnnotationsFilter to VideoFilter by @horatiualmasan in #737
- Add export for instance segmentations by @lukas-lightly in #671
- Operator Context: Add Context and Feedback to Dialog by @JonasWurst in #666
- Fix video tag input by @horatiualmasan in #720
- Run unit tests on Postgres by @mihnea-necsulescu in #736
- Add a navigation e2e test by @michal-lightly in #719
- Fix redundant requests to fetch videos from frontend by @IgorSusmelj in #740
- Add adapter for Labelformat YouTubeVis input by @horatiualmasan in #706
- Add AnnotationsFilter to SampleFilter by @horatiualmasan in #744
- Upgrade mypy to 1.19.1. Also upgrade all the types packages by @MalteEbner in #745
- Operator Context: Add GUI handling and example by @JonasWurst in #664
- Operator Context: update LightlyTrain Examples by @JonasWurst in #748
- feat: introduce component to render video details for group component with video type by @ikondrat in #738
- Rename get_hierarchy() parameter by @lukas-lightly in #750
- Update Ruff to 0.12 by @MalteEbner in #753
- Run E2E tests on Postgres by @mihnea-necsulescu in #752
- Operator: reload after operator execute by @JonasWurst in #747
- Upgrade ruff to 0.14.14 by @MalteEbner in #754
- Remove get_child_collection_by_name() by @lukas-lightly in #756
- Enterprise token connection by @mihnea-necsulescu in #757
- Add WASD navigation to zoomable container by @LeonardoRosaa in #715
- Make overriding segmentation masks undoable by @LeonardoRosaa in #730
- Reduce font size for distribution by @IgorSusmelj in #759
- Use AnnotationsFilter for filtering from GUI by @horatiualmasan in #741
- Add export to video dataset by @horatiualmasan in #755
- Docs menu initial restructure by @michal-lightly in #761
- Upgrade ruff to 0.15.6 by @MalteEbner in #763
- Introduce DatasetTable by @lukas-lightly in #762
- Refresh the python guidelines by @michal-lightly in #764
- Support database cleanup for Postgres by @mihnea-necsulescu in #765
- Add semantic segmentation export within the GUI by @LeonardoRosaa in #760
- Upgrade sqlalchemy to 2.0.48 and sqlmodel to 0.0.33 by @MalteEbner in #767
- Clarify docs: Cloud storage for videos is supported by @MalteEbner in #770
- Upgrade all packages by @MalteEbner in #768
- Add support for python 3.14 by @MalteEbner in #776
- Remove a prerelease note by @michal-lightly in #777
- increase wait for server timeout by @mihnea-necsulescu in #781
- Run CI unit tests on Postgres by @mihnea-necsulescu in #771
- Add Sample.add_annotations() method by @lukas-lightly in #782
- feat: introduce hook to get information about currentFrame by playbackTime or frameNumber by @ikondrat in #778
- feat: introduce component to to provide information about currentFrame by @ikondrat in #779
- Enable video annotation export in GUI by @horatiualmasan in #769
- Clean up after updates to AnnotationsFilters by @horatiualmasan in #751
- feat: introduce VideoPlayer component by @ikondrat in #786
- Run E2E tests on Postgres by @mihnea-necsulescu in #774
- Add
Sample.add_captionsmethod by @lukas-lightly in #787 - feat: fix problem with weird urls for sample and video details by @ikondrat in #790
- Add video annotation E2E workaround by @lukas-lightly in #792
- feat: component to show VideoSampleMetadata by @ikondrat in #791
- Add FilterWithCollectionId by @horatiualmasan in #783
- Use matrices for both DuckDB and Postgres unit tests by @mihnea-necsulescu in #789
- Re-enable video frame caption tests by @horatiualmasan in #766
- feat: fix issue with video filter by @ikondrat in #796
- Add Search and Filter in GUI docs by @MalteEbner in #795
- feat: reuse SampleDetailsCaptionsSegment to show captions by @ikondrat in #793
- feat: introduce function to generate url with optional params by @ikondrat in #797
- Update duckdb version by @MalteEbner in #800
- Rename some
dataset_idoccurrences toroot_collection_idby @lukas-lightly in #788 - Add SampleMetadata.update(), allowing bulk updates by @lukas-lightly in #785
- Remove unnecessary dependencies. by @MalteEbner in #803
- Open 'Contact Us' in a new tab by @JonasWurst in #808
- feat: use correct instructions for claude by @ikondrat in #733
- Use FilterWithCollectionId in VideoFrameAdjacentFilter by @horatiualmasan in #801
- Make pandas a required dependency by @lukas-lightly in #814
- Add ...
v0.4.11
[0.4.11] - 2026-03-10
Added
- Added option to customize the semantic segmentation keyboard shortcut in the settings dialog.
- Operators lifecycle management: operators now have
startupandshutdownmethods, which be default pass. The new methods can be used for example to start and stop inference server.
Changed
- Improved semantic segmentation loading performance in the GUI.
Fixed
- Navigation menu immediately updates to display the Captions page when the first caption is added.
What's Changed
- Operator Context: add hook useOperatorContext by @JonasWurst in #676
- Remove filter by parent sample id from AnnotationsFilter by @horatiualmasan in #711
- Operator Lifecycle: Return error to GUI when operator is not ready by @JonasWurst in #684
- Improve semantic segmentation loading performance by @LeonardoRosaa in #685
- Update navigation menu when the first caption is added by @michal-lightly in #712
- Remove the test_db fixture by @mihnea-necsulescu in #721
- Enable updating semantic keyboard shortcut by @LeonardoRosaa in #717
- feat: introduce hook to get group components for frontend by @ikondrat in #709
- feat: update guideline for ai to avoid $app/stores by @ikondrat in #726
- feat: introduce getVideoURLById utility by @ikondrat in #724
- Add AnnotationsFilter to ImageFilter by @horatiualmasan in #716
- feat: disable ssr by @ikondrat in #727
- feat: introduce aligned typography usage by @ikondrat in #723
- feat: introduce typeguards for image and video views by @ikondrat in #728
- feat: improve component handling by @ikondrat in #592
- Bump version to 0.4.11 by @MalteEbner in #732
Full Changelog: v0.4.10...v0.4.11
v0.4.10
[0.4.10] - 2026-03-09
Added
Dataset.export()now supports instance segmentation export to COCO usingto_coco_instance_segmentations().- Added keyboard shortcuts: to switch between the brush and eraser; to adjust the brush size.
Changed
- Replaced grid size slider icons with clickable
+/−buttons for zooming in and out. - Restructured the navigation menu to follow the dataset structure. This makes the menu work with group datasets.
- Disable annotation class text rendering in the detail view by default (can be changed in settings).
Fixed
- Fixed crosshair helper lines in annotation draw mode so vertical and horizontal lines remain the same thickness when zooming.
- Settings dialog is now scrollable on small screens.
- Added
✕button to clear an active text search, matching the existing image search behavior. - Fixed "Annotation updated successfully" toast appearing when clicking a bounding box without moving or resizing it.
- Improved deletion UX in sample details and captions list views: replaced confirmation popups with immediate deletion and Ctrl+Z undo support.
- Fixed grid not scrolling to the top when text search results are returned from cache.
- Fixed performance issues where annotations lagged behind the video.
- Fixed concurrency issue on video datasets.
What's Changed
- feat: intorduce layout card component by @ikondrat in #639
- feat: introduce base component to render images by @ikondrat in #640
- feat: introduce component to render preview for video by @ikondrat in #641
- Build breadcrumb levels for the new navigation by @michal-lightly in #625
- Plugin Context: Add supported scope to operator by @JonasWurst in #631
- Extend navigation menu to a leaf by @michal-lightly in #636
- Context Plugin: Add context to execute and migrate by @JonasWurst in #632
- feat: introduce component to render group components as a menu by @ikondrat in #642
- Fix: Avoid extra 'annotation updated successfully' toast by @IgorSusmelj in #646
- Add video filter to video frame adjacent by @LeonardoRosaa in #628
- Add 'x' button to clear text search input by @IgorSusmelj in #645
- Fix: Make settings menu scrollable on small screens by @IgorSusmelj in #647
- feat: get information about collection_id by group_id by @ikondrat in #650
- Context Plugin: update endpoint by @JonasWurst in #634
- Use new hierarchy navigation by @michal-lightly in #637
- Add get_all_by_video_ids video frame resolver by @horatiualmasan in #661
- Operator Context: Move collection_id from route to body by @JonasWurst in #660
- feat: introduce groups_resolver.get_group_samples_by_group_id by @ikondrat in #654
- Add get_all_by_dataset_id object track resolver by @horatiualmasan in #662
- Filter by annotation_types in get_all_by_object_track_id by @horatiualmasan in #663
- Fix: Avoid unnecessary pop up for annotation deletion by @IgorSusmelj in #659
- Maintain video filters when navigating between frames by @LeonardoRosaa in #658
- feat: introduce conversion function for ImageView by @ikondrat in #653
- Make sure vertical helper lines stay small by @IgorSusmelj in #670
- Add DatasetExport.to_coco_instance_segmentations() by @lukas-lightly in #560
- Fix: Update readme and docs to use simplified VideoDataset import by @IgorSusmelj in #669
- Make frontend format command faster by @michal-lightly in #648
- feat: introduce GroupComponentView model by @ikondrat in #655
- Fix: Rename subsection from Metadata Filters to Metadata by @IgorSusmelj in #673
- Operator Context: Add Example by @JonasWurst in #665
- Show group component names in the menu by @michal-lightly in #678
- API endpoint for exporting instance segmentations by @lukas-lightly in #562
- Rename no tags text and create tag button by @IgorSusmelj in #679
- Operator Context: Prepare Backend for GUI changes by @JonasWurst in #675
- Clean up annotation filters by @horatiualmasan in #677
- hot fix load semantic segmentation by @LeonardoRosaa in #649
- Operator Lifecycle: Enhance BaseOperator with startup/shutdown methods by @JonasWurst in #681
- Highlight only the current collection in the menu by @michal-lightly in #680
- Update grid view slider by @IgorSusmelj in #674
- Disable non-allowed operations in the GUI by @mihnea-necsulescu in #686
- Allow switching between brush and eraser via keyboard by @LeonardoRosaa in #689
- Eager load annotations for video frames by @horatiualmasan in #693
- Read frames ahead of time for video playback. by @horatiualmasan in #696
- Disable annotation text rendering by default by @IgorSusmelj in #695
- Operator lifecycle: add operator registry handling by @JonasWurst in #683
- Fix image grid stuck on effect_update_depth_exceeded by @michal-lightly in #694
- Clear selection on collection change by @michal-lightly in #704
- Fix missing space between spinner and loading text in Captions by @michal-lightly in #703
- feat: introduce get_group_component_details_by_ids resolver by @ikondrat in #672
- Scroll to the top when the embedding search text query changes by @mihnea-necsulescu in #707
- Video load improvements within the GUI by @LeonardoRosaa in #708
- Operator Lifecycle: Enhance startup and shutdown management by @JonasWurst in #682
- Bump version to 0.4.10 by @JonasWurst in #713
Full Changelog: v0.4.9...v0.4.10