local-data-studio 1.1.0__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. local_data_studio-2.0.0/CHANGELOG.md +142 -0
  2. local_data_studio-1.1.0/README.md → local_data_studio-2.0.0/PKG-INFO +178 -16
  3. local_data_studio-1.1.0/PKG-INFO → local_data_studio-2.0.0/README.md +132 -63
  4. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/IMPLEMENTATION_NOTES.md +110 -2
  5. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/IMPLEMENTATION_NOTES_ja.md +110 -2
  6. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/docs/README_ja.md +132 -16
  7. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/local_data_studio.example.toml +30 -0
  8. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/pyproject.toml +27 -13
  9. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/__init__.py +1 -1
  10. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/app.py +30 -4
  11. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/cli.py +8 -0
  12. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/runtime_config.py +2 -0
  13. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/analysis.py +7 -0
  14. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/datasets.py +76 -16
  15. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/jobs.py +43 -3
  16. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/schemas.py +57 -2
  17. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/contracts.py +1 -1
  18. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/embedding_backends.py +64 -8
  19. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/embedding_session.py +13 -12
  20. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/projection_inputs.py +88 -9
  21. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/service.py +22 -9
  22. local_data_studio-2.0.0/src/local_data_studio/server/audio_decode.py +144 -0
  23. local_data_studio-2.0.0/src/local_data_studio/server/audio_values.py +273 -0
  24. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/cache.py +16 -5
  25. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/config.py +42 -0
  26. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/__init__.py +5 -0
  27. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/common.py +60 -3
  28. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/contracts.py +14 -0
  29. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/delimited.py +244 -0
  30. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/json_reader.py +450 -0
  31. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/jsonl.py +63 -56
  32. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/line.py +1 -1
  33. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/line_cursor.py +407 -0
  34. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/line_indexing.py +388 -0
  35. local_data_studio-2.0.0/src/local_data_studio/server/dataset_readers/parquet.py +321 -0
  36. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/dataset_readers/service.py +89 -25
  37. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/db.py +20 -8
  38. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/delete_ops.py +25 -4
  39. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/eda.py +5 -5
  40. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/eda_reports.py +3 -3
  41. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/embedder_capabilities.py +7 -2
  42. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/embedder_models.py +1 -0
  43. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/files.py +7 -5
  44. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/jobs.py +28 -0
  45. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/line_index.py +61 -9
  46. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/readers.py +2 -0
  47. local_data_studio-2.0.0/src/local_data_studio/server/serialization.py +257 -0
  48. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/sql.py +175 -22
  49. local_data_studio-2.0.0/src/local_data_studio/server/transcription_config.py +137 -0
  50. local_data_studio-2.0.0/src/local_data_studio/server/transcription_service.py +385 -0
  51. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/application.js +424 -151
  52. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/atlas.js +13 -7
  53. local_data_studio-2.0.0/src/local_data_studio/static/app/audio.js +517 -0
  54. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/dom.js +3 -0
  55. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/formatting.js +17 -0
  56. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/http.js +32 -5
  57. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/images.js +21 -2
  58. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/state.js +11 -3
  59. local_data_studio-2.0.0/src/local_data_studio/static/app/transcription.js +292 -0
  60. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/translation.js +1 -1
  61. local_data_studio-2.0.0/src/local_data_studio/static/icons/pause.svg +1 -0
  62. local_data_studio-2.0.0/src/local_data_studio/static/icons/play.svg +1 -0
  63. local_data_studio-2.0.0/src/local_data_studio/static/icons/transcribe.svg +1 -0
  64. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/index.html +28 -3
  65. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/styles.css +409 -90
  66. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_api_jobs.py +114 -8
  67. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_app_contracts.py +7 -0
  68. local_data_studio-2.0.0/tests/test_atlas_audio.py +136 -0
  69. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_prompts.py +101 -0
  70. local_data_studio-2.0.0/tests/test_audio.py +213 -0
  71. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_eda.py +5 -15
  72. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_embedder_capabilities.py +30 -0
  73. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_files.py +11 -11
  74. local_data_studio-2.0.0/tests/test_readers.py +733 -0
  75. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_runtime_contracts.py +40 -5
  76. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_serialization.py +50 -4
  77. local_data_studio-2.0.0/tests/test_transcription.py +260 -0
  78. local_data_studio-2.0.0/uv.lock +5387 -0
  79. local_data_studio-1.1.0/CHANGELOG.md +0 -65
  80. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/__init__.py +0 -5
  81. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/delimited.py +0 -174
  82. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/json_reader.py +0 -86
  83. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/line_cursor.py +0 -75
  84. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/line_indexing.py +0 -57
  85. local_data_studio-1.1.0/src/local_data_studio/server/dataset_readers/parquet.py +0 -202
  86. local_data_studio-1.1.0/src/local_data_studio/server/serialization.py +0 -118
  87. local_data_studio-1.1.0/tests/test_readers.py +0 -422
  88. local_data_studio-1.1.0/uv.lock +0 -3824
  89. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/.gitignore +0 -0
  90. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/LICENSE +0 -0
  91. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_01.png +0 -0
  92. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_02.png +0 -0
  93. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_03.png +0 -0
  94. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_04.png +0 -0
  95. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_05.png +0 -0
  96. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_06.png +0 -0
  97. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_07.png +0 -0
  98. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_08.png +0 -0
  99. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_09.png +0 -0
  100. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_10.png +0 -0
  101. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_11.png +0 -0
  102. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_12.png +0 -0
  103. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon.png +0 -0
  104. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon_transparent.png +0 -0
  105. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/images/local_data_studio_icon_transparent.svg +0 -0
  106. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/__main__.py +0 -0
  107. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/__init__.py +0 -0
  108. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/__init__.py +0 -0
  109. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/atlas_proxy.py +0 -0
  110. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/mutations.py +0 -0
  111. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/services.py +0 -0
  112. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/api/static.py +0 -0
  113. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas.py +0 -0
  114. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_cache.py +0 -0
  115. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_cache_patch.py +0 -0
  116. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/__init__.py +0 -0
  117. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/command.py +0 -0
  118. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/dataset.py +0 -0
  119. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/image_values.py +0 -0
  120. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/images.py +0 -0
  121. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/output_frames.py +0 -0
  122. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/ports.py +0 -0
  123. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/process.py +0 -0
  124. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/projection.py +0 -0
  125. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/prompts.py +0 -0
  126. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/readiness.py +0 -0
  127. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/reducers.py +0 -0
  128. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/runtime.py +0 -0
  129. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/atlas_components/sampling.py +0 -0
  130. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/__init__.py +0 -0
  131. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/accumulator.py +0 -0
  132. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/heuristics.py +0 -0
  133. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/column_stats/service.py +0 -0
  134. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/deleted_rows.py +0 -0
  135. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm.py +0 -0
  136. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_client.py +0 -0
  137. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_profiles.py +0 -0
  138. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_prompt.py +0 -0
  139. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/llm_service.py +0 -0
  140. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/stats.py +0 -0
  141. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_config.py +0 -0
  142. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_service.py +0 -0
  143. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/server/translation_values.py +0 -0
  144. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/llm.js +0 -0
  145. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app/selects.js +0 -0
  146. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/app.js +0 -0
  147. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/chevron-backward.svg +0 -0
  148. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/chevron-forward.svg +0 -0
  149. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/close.svg +0 -0
  150. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/code.svg +0 -0
  151. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/content-copy.svg +0 -0
  152. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/delete-row.svg +0 -0
  153. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/delete.svg +0 -0
  154. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/refresh.svg +0 -0
  155. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/reset-settings.svg +0 -0
  156. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search.svg +0 -0
  157. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search_black.svg +0 -0
  158. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/search_white.svg +0 -0
  159. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/send.svg +0 -0
  160. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/translation.svg +0 -0
  161. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/unfold-less.svg +0 -0
  162. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/icons/unfold-more.svg +0 -0
  163. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/src/local_data_studio/static/local_data_studio_icon_transparent.svg +0 -0
  164. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas.py +0 -0
  165. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_projection.py +0 -0
  166. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_atlas_proxy.py +0 -0
  167. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_cache.py +0 -0
  168. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_cli.py +0 -0
  169. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_jobs.py +0 -0
  170. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_llm.py +0 -0
  171. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_llm_profiles.py +0 -0
  172. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_stats.py +0 -0
  173. {local_data_studio-1.1.0 → local_data_studio-2.0.0}/tests/test_translation.py +0 -0
@@ -0,0 +1,142 @@
1
+ # Changelog
2
+
3
+ Notable changes to Local Data Studio are recorded here. Release Please updates
4
+ this file from Conventional Commits when it prepares a release pull request.
5
+
6
+ ## [2.0.0](https://github.com/Onely7/local_data_studio/compare/v1.1.1...v2.0.0) (2026-11-02)
7
+
8
+
9
+ ### ⚠ BREAKING CHANGES
10
+
11
+ * **index:** Jumps past the row index return HTTP 409 with the detail {"code": "row_index_required", "row": ..., "message": ...} instead of HTTP 400, and build_line_index_with_progress reports indexed_rows and complete alongside row_count, which is None until the index is complete.
12
+ * **preview:** resolve_raw_image_file is renamed to resolve_raw_media_file, and preview responses carry audio markers instead of hex strings for audio bytes.
13
+ * **deps:** Sentence Transformers 6.2+, Transformers 5.19+, Pillow 13+, and LiteLLM 1.100.4+ are now required.
14
+ * **sql:** guard_select_sql_for_dataset was removed; synchronous callers of execute_query_guarded still receive HTTP 400 for full scans of large datasets.
15
+ * **preview:** image bytes in preview responses are thumbnails rather than the original bytes, and raw rows return image bytes as data URLs instead of hex strings.
16
+ * **readers:** Parquet and search page tokens use a new format, search responses include next_page_token, and line rows more than 1M rows past a checkpoint require the row index.
17
+
18
+ ### Features
19
+
20
+ * **atlas:** embed audio columns ([56c17ba](https://github.com/Onely7/local_data_studio/commit/56c17ba96bb07d1fcceaf36ed781673b408af1e4))
21
+ * **atlas:** support EmbeddingGemma 2 and multimodal ST 6 models ([6d1a5ef](https://github.com/Onely7/local_data_studio/commit/6d1a5ef2400f66c98d6b7d2645c95d343857fe0d))
22
+ * **index:** index rows in the background and resume interrupted scans ([858033f](https://github.com/Onely7/local_data_studio/commit/858033f7ba2fd24420f1af472dea8def643f9f59))
23
+ * **json:** stream JSON arrays and read JSON Lines saved as .json ([ca7376a](https://github.com/Onely7/local_data_studio/commit/ca7376a66b0ff19d5827e35ae07822c9a53d4678))
24
+ * **preview:** play audio in dataset cells ([6010bc8](https://github.com/Onely7/local_data_studio/commit/6010bc8d5061354e0a9ed4ed82fff83c39cc0d77))
25
+ * **sql:** run full-scan queries on large datasets in the background ([be78154](https://github.com/Onely7/local_data_studio/commit/be78154f50f953d8de4d232a1e77b0d1e5e476da))
26
+ * **transcription:** transcribe audio cells with a configurable speech model ([0f0b332](https://github.com/Onely7/local_data_studio/commit/0f0b33221dc52e1bcc05ce0641c5bcf0220379fd))
27
+ * **ui:** jump to any row and page through search results ([3dd9ff9](https://github.com/Onely7/local_data_studio/commit/3dd9ff9cdbdec0bcc8b2386767982c3a00a3f739))
28
+ * **ui:** show row totals and index far jumps with progress ([7b5389d](https://github.com/Onely7/local_data_studio/commit/7b5389d1a33a56f4f9dfe6c00a57d15577bd19c7))
29
+ * support Python 3.14 ([7678336](https://github.com/Onely7/local_data_studio/commit/7678336d2df53ba67b331a7a69e61f585b132ded))
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * **atlas:** sample large datasets instead of loading every row ([6ba0907](https://github.com/Onely7/local_data_studio/commit/6ba0907499ac1967249ea95c89aefd09c53b8e67))
35
+ * **csv:** keep quoted line breaks inside one row ([fbc8f48](https://github.com/Onely7/local_data_studio/commit/fbc8f483a9bfb18b2f64af65e735ffd318767df7))
36
+ * **readers:** scan small line files to the end instead of rejecting jumps ([ad346ef](https://github.com/Onely7/local_data_studio/commit/ad346efa6a64d5cf450e7fb310bcf5a967cda07f))
37
+ * **ui:** keep pagination and panel buttons readable on narrow screens ([23f4ca2](https://github.com/Onely7/local_data_studio/commit/23f4ca28fa34acba254478eff6fc7397b99b8285))
38
+
39
+
40
+ ### Performance Improvements
41
+
42
+ * **preview:** convert text-only pages without the thread pool ([0a2bb3c](https://github.com/Onely7/local_data_studio/commit/0a2bb3c983b02063ec64754ec1d71eeb063d1ae7))
43
+ * **preview:** send image thumbnails instead of full image bytes ([05eabcd](https://github.com/Onely7/local_data_studio/commit/05eabcdac895c87fd8a7dbaee9f0547183c70ab6))
44
+ * **readers:** read pages, jumps, and visible rows without rereading files ([be8e3ec](https://github.com/Onely7/local_data_studio/commit/be8e3ec7d4e99958218f444fdae46a7cdecb89ed))
45
+ * **readers:** scan, jump, and search large datasets in bounded time ([fef4c6f](https://github.com/Onely7/local_data_studio/commit/fef4c6fcc6c195c3ada2bcfaa23926b3973bcd70))
46
+
47
+
48
+ ### Dependencies
49
+
50
+ * **deps:** bump astral-sh/setup-uv in the github-actions group ([#53](https://github.com/Onely7/local_data_studio/issues/53)) ([96d74c5](https://github.com/Onely7/local_data_studio/commit/96d74c55310d95aed8b054027cf4065659b5f146))
51
+ * remove the unused polars dependency ([d163e9e](https://github.com/Onely7/local_data_studio/commit/d163e9ec890197aa8ef7df09fba55f4f13704257))
52
+ * replace ydata-profiling with fg-data-profiling ([ab39eca](https://github.com/Onely7/local_data_studio/commit/ab39eca11bcbb77d3023629037d38e9f0924dd68))
53
+ * upgrade numpy, scipy, matplotlib and numba ([c4c4411](https://github.com/Onely7/local_data_studio/commit/c4c44118a9136208c15608ac6631f2bb9cbdbd83))
54
+ * upgrade pandas to 2.3.3 ([a0d645e](https://github.com/Onely7/local_data_studio/commit/a0d645e05d1622c5764441b61ee9971aab573f87))
55
+
56
+
57
+ ### Documentation
58
+
59
+ * describe audio playback, transcription, and audio embeddings ([9bcb80d](https://github.com/Onely7/local_data_studio/commit/9bcb80da8d8ee6339f3a1a0cf7963a199eafe683))
60
+ * describe background indexing and large-file reading ([96d9924](https://github.com/Onely7/local_data_studio/commit/96d9924b68f1e549f65e97761ea840c195a2b266))
61
+ * describe large-dataset navigation, background SQL, and EmbeddingGemma 2 ([1cde4c2](https://github.com/Onely7/local_data_studio/commit/1cde4c26bb83d2f6a262b74c708787767cdca3ac))
62
+
63
+
64
+ ### Build System
65
+
66
+ * **deps:** upgrade dependencies and resolve security advisories ([1b40f87](https://github.com/Onely7/local_data_studio/commit/1b40f87cabf8837102e20375c5d134ffb9f59537))
67
+
68
+ ## [1.1.1](https://github.com/Onely7/local_data_studio/compare/v1.1.0...v1.1.1) (2026-07-23)
69
+
70
+
71
+ ### Bug Fixes
72
+
73
+ * preserve compatibility in dependency updates ([caf5beb](https://github.com/Onely7/local_data_studio/commit/caf5bebafbb3da47432b27bef5caf78304328f76))
74
+
75
+
76
+ ### Dependencies
77
+
78
+ * **deps:** bump https://github.com/astral-sh/ty-pre-commit ([9fa50ca](https://github.com/Onely7/local_data_studio/commit/9fa50caefd27154addf2cfc9d71afd7851242ba4))
79
+ * **deps:** bump the github-actions group with 2 updates ([6faf4ab](https://github.com/Onely7/local_data_studio/commit/6faf4ab65668734ae0ce5c247a50aeaef19e29cf))
80
+ * **deps:** bump the python-dependencies group with 4 updates ([2e5a599](https://github.com/Onely7/local_data_studio/commit/2e5a59918bb4c8666b3caf11107007298174f66c))
81
+ * **deps:** bump the python-dependencies group with 9 updates ([c7a47e5](https://github.com/Onely7/local_data_studio/commit/c7a47e50df31b5285fc669a4fe8a2a2bfceb4904))
82
+
83
+ ## [1.1.0](https://github.com/Onely7/local_data_studio/compare/v1.0.0...v1.1.0) (2026-07-15)
84
+
85
+ ### Translation
86
+
87
+ - Added manual translation for a cell or the currently visible values in a
88
+ Preview column. Translation-enabled LiteLLM profiles are selected separately
89
+ from SQL-generation profiles, and source datasets are never modified.
90
+ ([3b5d102](https://github.com/Onely7/local_data_studio/commit/3b5d102500f8a250c0c5ca60525f403cca0e7b59),
91
+ [5537318](https://github.com/Onely7/local_data_studio/commit/5537318fae385a527230250ed073031b8a2614fa))
92
+ - Added 68 target languages and independent defaults for the translation model
93
+ and target language. The target language can be set in
94
+ `local_data_studio.toml`, with browser preferences used as fallbacks.
95
+ ([943033d](https://github.com/Onely7/local_data_studio/commit/943033ddd0e93f21162db6ebbb03de13ef7c704f))
96
+ - Added bounded, cancellable background translation jobs. Server-side limits
97
+ cover rows, strings, characters, chunk size, and provider concurrency;
98
+ malformed provider responses are validated and retried once.
99
+ ([3b5d102](https://github.com/Onely7/local_data_studio/commit/3b5d102500f8a250c0c5ca60525f403cca0e7b59))
100
+ - Preserved nested list and object structure while translating natural-language
101
+ strings. Numeric, Boolean, binary, identifier, URL, image, and audio values
102
+ are excluded, and completed translations remain only in browser memory.
103
+ ([5537318](https://github.com/Onely7/local_data_studio/commit/5537318fae385a527230250ed073031b8a2614fa))
104
+
105
+ ### Data Analysis
106
+
107
+ - Applied `EDA_ROW_LIMIT` to the dataset source before pandas DataFrame
108
+ materialization when no rows are hidden in the current session. This avoids
109
+ loading an entire large JSONL dataset before selecting the requested EDA
110
+ rows. Unlimited mode (`-1`) continues to load all selected rows.
111
+ ([7d799ed](https://github.com/Onely7/local_data_studio/commit/7d799ed1e99b9d969f2c6677ab7388d3889646f1))
112
+
113
+ ### Interface
114
+
115
+ - Added translation controls and copy actions to expanded values and JSON code
116
+ views, with shared JSON syntax coloring for structured values.
117
+ - Refined the dataset selector, search and pagination controls, responsive
118
+ one-column ordering, mobile scrolling, and compact desktop toolbar so the
119
+ Preview keeps as much space as possible.
120
+ - Updated the visual theme, bundled action icons, application branding, and
121
+ screenshots while retaining the existing dataset, SQL, EDA, and Atlas
122
+ workflows.
123
+ ([0b4f5fd](https://github.com/Onely7/local_data_studio/commit/0b4f5fd1565d65105e6c147e365d7f05224e27ad),
124
+ [40944f7](https://github.com/Onely7/local_data_studio/commit/40944f739aef7ee86b546efcada9441b573b0092),
125
+ [cfa2b54](https://github.com/Onely7/local_data_studio/commit/cfa2b54b8d5edc46efe4a1eaea353a07f6fb972b),
126
+ [f9690c5](https://github.com/Onely7/local_data_studio/commit/f9690c51a918f31d6cbb07eeaeae4a7aeb08bcae))
127
+
128
+ ### Release And Documentation
129
+
130
+ - Added Release Please automation for version updates, changelog maintenance,
131
+ release pull requests, tags, and GitHub Releases.
132
+ ([4a70f10](https://github.com/Onely7/local_data_studio/commit/4a70f105308545e1cd9789b5972f1ff085cd86b0))
133
+ - Updated the English and Japanese user guides, implementation notes,
134
+ configuration example, and screenshots for translation, EDA loading, and the
135
+ refined workspace.
136
+ ([f23e800](https://github.com/Onely7/local_data_studio/commit/f23e800722f16cf00ff758761afa6f20467092d7),
137
+ [0a6e32c](https://github.com/Onely7/local_data_studio/commit/0a6e32c942cc7ee19e08bb27ae96def1b44a0ea),
138
+ [b53a213](https://github.com/Onely7/local_data_studio/commit/b53a213fa35ce8981c85e8278532c2d400878fe8))
139
+
140
+ ## [1.0.0](https://github.com/Onely7/local_data_studio/releases/tag/v1.0.0) (2026-07-13)
141
+
142
+ - Published the first stable Local Data Studio package to PyPI.
@@ -1,3 +1,49 @@
1
+ Metadata-Version: 2.5
2
+ Name: local-data-studio
3
+ Version: 2.0.0
4
+ Summary: Local data studio for JSONL/JSON/CSV/TSV/Parquet with scalable previews, image inspection, DuckDB SQL, EDA, and Embedding Atlas
5
+ Project-URL: Homepage, https://github.com/Onely7/local_data_studio
6
+ Project-URL: Repository, https://github.com/Onely7/local_data_studio
7
+ Project-URL: Issues, https://github.com/Onely7/local_data_studio/issues
8
+ Author: Daiki Shiono
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: data-exploration,data-viewer,dataset-viewer,duckdb,eda,embedding-atlas,image-datasets,jsonl,parquet
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Framework :: FastAPI
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Requires-Python: <3.15,>=3.11
23
+ Requires-Dist: av>=18.1.0
24
+ Requires-Dist: duckdb<2.0.0,>=1.4.0
25
+ Requires-Dist: embedding-atlas<0.21.0,>=0.20.0
26
+ Requires-Dist: fastapi<1,>=0.139
27
+ Requires-Dist: fg-data-profiling<5,>=4.20.0
28
+ Requires-Dist: httpx<1,>=0.28
29
+ Requires-Dist: litellm<2,>=1.100.4
30
+ Requires-Dist: pandas<3,>=2.3.3
31
+ Requires-Dist: pillow>=13.0.0
32
+ Requires-Dist: pyarrow>=24.0.0
33
+ Requires-Dist: pydantic-settings<3,>=2.6
34
+ Requires-Dist: pydantic<3,>=2.10
35
+ Requires-Dist: python-dotenv
36
+ Requires-Dist: python-multipart
37
+ Requires-Dist: qwen-vl-utils>=0.0.14
38
+ Requires-Dist: requests<3,>=2.33
39
+ Requires-Dist: scikit-learn<2,>=1.7.0
40
+ Requires-Dist: sentence-transformers>=6.2.0
41
+ Requires-Dist: starlette<2,>=1.3.1
42
+ Requires-Dist: torchvision>=0.27.1
43
+ Requires-Dist: transformers>=5.19.0
44
+ Requires-Dist: uvicorn>=0.50.0
45
+ Description-Content-Type: text/markdown
46
+
1
47
  <div align="center">
2
48
 
3
49
  # Local Data Studio <img src="images/local_data_studio_icon.png" alt="Local Data Studio Icon" align="right" width="150" style="margin-left:50px;"/>
@@ -25,21 +71,24 @@ Click the Local Data Studio logo in the top bar to open this GitHub repository i
25
71
 
26
72
  ## Key Features
27
73
 
28
- * Preview large datasets while limiting how much data is loaded
74
+ * Preview terabyte-scale datasets quickly: each page reads only the rows it shows
75
+ * Index rows in the background while you browse, so totals, far jumps, and later pages are ready sooner
29
76
  * Run read-only searches and aggregations with DuckDB SQL
30
77
  * Apply SQL timeouts, memory limits, and warnings when a query may read a large amount of data
31
78
  * Generate EDA reports for an entire dataset or SQL results
32
- * Visualize text columns, image columns, or SQL results with Embedding Atlas
79
+ * Visualize text, image, or audio columns, or SQL results, with Embedding Atlas
33
80
  * Inspect complete row contents with the **Row Inspector**
34
81
  * Display images from URLs, local file paths, and values stored in `{bytes, path}` format
35
82
  * Open enlarged image previews and switch between multiple images in the same row
83
+ * Play audio stored as bytes, Hugging Face `Audio` values, data URLs, or file paths
84
+ * Transcribe audio with a configured speech-recognition model such as Qwen3-ASR or Whisper
36
85
  * Manually translate visible cells or columns with configured LiteLLM-compatible models
37
86
  * Upload files by dragging and dropping them into the application
38
87
  * Hide rows while the application page is open and, when needed, delete them from the source file
39
88
 
40
89
  ## Supported Environments and Data Formats
41
90
 
42
- * Python 3.11, 3.12, or 3.13
91
+ * Python 3.11, 3.12, 3.13, or 3.14
43
92
  * Supported formats: `.jsonl`, `.json`, `.csv`, `.tsv`, and `.parquet`
44
93
 
45
94
  ## Quick Start
@@ -102,7 +151,17 @@ Use the controls at the top of the page to change what is displayed:
102
151
 
103
152
  * **Search**: Searches the data.
104
153
  * **Rows**: Changes the number of rows shown per page.
105
- * **Prev** / **Next**: Moves to the previous or next page.
154
+ * **Go to row**: Enter a row number and press `Enter` to jump directly to that row.
155
+ When the row lies past the indexed part of a large JSONL, CSV, TSV, or JSON file, the rows up to it are indexed first.
156
+ The progress appears above the table, with a **Cancel** button.
157
+ * **Prev** / **Next**: Moves to the previous or next page of the data or of the search results.
158
+
159
+ The number at the left of each row is its position in the dataset, so it stays the same after jumps, searches, and hidden rows.
160
+
161
+ The line above the table shows the number of columns and the rows on screen, followed by the total number of rows.
162
+ Parquet totals are known immediately.
163
+ For JSONL, CSV, TSV, and JSON files, the total is an estimate, such as `of about 2.4B`, until the background row index reaches the end of the file.
164
+ Image cells show small thumbnails; select an image to view it at its original resolution.
106
165
 
107
166
  <img src="images/local_data_studio_03.png" alt="Searching data and moving between pages" width="45%">
108
167
 
@@ -116,6 +175,10 @@ If the server has a LiteLLM model connection setting, called a model profile, yo
116
175
  You can choose from configured OpenAI, Anthropic, Gemini, hosted vLLM, and other LiteLLM-compatible models.
117
176
 
118
177
  SQL execution is subject to timeouts, memory limits, and checks for queries that may read a large amount of data.
178
+
179
+ On datasets larger than 256 MiB, queries that aggregate, sort, deduplicate, join, or use window functions scan the whole dataset in the background.
180
+ While such a query runs, its progress is shown and **Run Query** changes to **Cancel Query**.
181
+ Up to 1,000,000 result rows are cached, so later pages, **Show raw row**, and EDA or Atlas on the query results reuse them without scanning again.
119
182
  For restrictions on generated SQL, see [LLM Model Profiles for SQL Generation and Translation](#llm-model-profiles-for-sql-generation-and-translation).
120
183
 
121
184
  <img src="images/local_data_studio_04.png" alt="SQL console" width="45%">
@@ -141,7 +204,7 @@ The default value is `minimal`.
141
204
 
142
205
  ### 5. Visualize Embeddings
143
206
 
144
- An embedding represents the features of text or an image as a sequence of numbers called a vector.
207
+ An embedding represents the features of text, an image, or audio as a sequence of numbers called a vector.
145
208
  Embeddings usually contain many numbers, which makes them difficult to compare directly on a screen.
146
209
  Local Data Studio uses methods such as UMAP, t-SNE, and PCA to convert embeddings into two-dimensional coordinates and displays them with Embedding Atlas.
147
210
  This conversion is called **dimensionality reduction**.
@@ -149,13 +212,14 @@ Some configuration keys and internal code use the term `projection`, but this RE
149
212
 
150
213
  To use this feature, you must provide a local encoder model in Hugging Face format.
151
214
  Hugging Face format means that the model's configuration files and related data are stored in the expected directory structure.
152
- An encoder model converts text or images into embeddings.
215
+ An encoder model converts text, images, or audio into embeddings.
153
216
 
154
217
  Place the model under `models/embedder`, or under the directory specified by `--models-dir` or `EMBEDDER_MODELS_DIR`.
155
218
 
156
219
  Example locations:
157
220
 
158
221
  ```text
222
+ models/embedder/google/embeddinggemma-2
159
223
  models/embedder/google/siglip2-base-patch16-224
160
224
  models/embedder/Qwen/Qwen3-Embedding-0.6B
161
225
  models/embedder/Qwen/Qwen3-VL-Embedding-2B
@@ -165,7 +229,7 @@ A directory appears in the **Model** selector when it contains model-identifying
165
229
 
166
230
  Under **Visualize Embedding**, select the following:
167
231
 
168
- 1. A text or image column
232
+ 1. A text, image, or audio column
169
233
  2. The model to use
170
234
  3. The library that loads the model and computes embeddings, referred to as the backend
171
235
  4. The dimensionality-reduction method used to convert embeddings into two dimensions
@@ -197,6 +261,26 @@ If the field is left empty, the default prompt stored with the model is used.
197
261
 
198
262
  </details>
199
263
 
264
+ <details>
265
+ <summary><strong>Using EmbeddingGemma 2</strong></summary>
266
+
267
+ [EmbeddingGemma 2](https://huggingface.co/google/embeddinggemma-2) embeds text, images, and audio into the same 768-dimensional space.
268
+ The model is not gated, so you can download it without a Hugging Face token:
269
+
270
+ ```bash
271
+ hf download google/embeddinggemma-2 --local-dir models/embedder/google/embeddinggemma-2
272
+ ```
273
+
274
+ Select `google/embeddinggemma-2` as the **Model**.
275
+ Sentence Transformers embeds text, image, and audio columns, and Transformers embeds text columns.
276
+ The model expects a task prefix on text, so for visualization enter `task: clustering | query: ` in **Prompt**.
277
+ Leave **Prompt** empty for image columns, because images are embedded without a prefix.
278
+ Audio is also embedded without a prefix, so a prompt is ignored for audio columns.
279
+ Audio is resampled to 16 kHz, and clips longer than 300 seconds are embedded from their start.
280
+ In Atlas, the audio column shows each clip's file name and duration.
281
+
282
+ </details>
283
+
200
284
  <img src="images/local_data_studio_07.png" alt="Embedding Atlas settings" width="45%"> <img src="images/local_data_studio_08.png" alt="Embedding Atlas visualization" width="45%">
201
285
 
202
286
  ### 6. Use the Row Inspector and Enlarged Image View
@@ -219,7 +303,56 @@ If that fails, it uses `path` as a fallback.
219
303
 
220
304
  <img src="images/local_data_studio_09.png" alt="Row Inspector" width="45%"> <img src="images/local_data_studio_10.png" alt="Enlarged image preview" width="45%">
221
305
 
222
- ### 7. Translate Visible Values
306
+ ### 7. Play and Transcribe Audio
307
+
308
+ Local Data Studio recognizes WAV, FLAC, MP3, OGG (including Opus), AAC, M4A, and AIFF audio stored in these forms:
309
+
310
+ * Bytes in a binary column
311
+ * Dictionaries (objects) in `{ "bytes": ..., "path": ... }` format, such as Hugging Face `Audio` values
312
+ * `data:audio/...` URLs
313
+ * Audio URLs and relative or absolute file paths
314
+
315
+ In the table, an audio value appears as a play button with its duration, format, and size.
316
+ WAV and FLAC show their duration before playback; other formats show it once they have been played.
317
+ An expanded field shows a full player with a seek bar and volume control.
318
+ Only one clip plays at a time, and playback continues while the table updates.
319
+
320
+ Preview pages do not carry audio bytes.
321
+ Audio is loaded only when you play it or expand its row, so pages of large clips stay light.
322
+ Relative paths are resolved next to the dataset file first and then below the data directory and `file_serve_roots`; files outside those directories are not served.
323
+ The browser loads audio URLs directly.
324
+
325
+ To transcribe audio, add a speech-recognition model to the `[transcription]` section of `local_data_studio.toml` and select it in **Transcriber** in the toolbar.
326
+ For example, download Qwen3-ASR 1.7B and configure it as follows:
327
+
328
+ ```bash
329
+ hf download Qwen/Qwen3-ASR-1.7B-hf --local-dir models/asr/Qwen/Qwen3-ASR-1.7B-hf
330
+ ```
331
+
332
+ ```toml
333
+ [transcription]
334
+ default_model = "qwen3-asr-1.7b"
335
+
336
+ [[transcription.models]]
337
+ id = "qwen3-asr-1.7b"
338
+ label = "Qwen3-ASR 1.7B"
339
+ model = "models/asr/Qwen/Qwen3-ASR-1.7B-hf"
340
+ ```
341
+
342
+ Use the `-hf` repository, because Transformers cannot load the original `Qwen/Qwen3-ASR-1.7B` checkpoint.
343
+ `model` can also be a Hugging Face model ID such as `openai/whisper-large-v3-turbo`; any model that the Transformers speech-recognition pipeline loads works.
344
+ Add `language = "ja"` to a model to fix the language instead of detecting it, or `device = "cpu"` or `device = "cuda:1"` to choose where it runs.
345
+
346
+ The transcription icon in a column header transcribes the audio that is visible in that column; select it again to cancel.
347
+ The **Transcribe** button in an expanded field transcribes that field's audio.
348
+ Each transcript appears below its audio with the detected language and a copy icon.
349
+
350
+ The model loads on first use, which can take a minute, and is released after `idle_unload_seconds` (600 seconds by default).
351
+ Qwen3-ASR 1.7B uses about 4 GB of GPU memory.
352
+ Audio longer than `chunk_seconds` is split at quiet points, and clips longer than `max_audio_seconds` are rejected.
353
+ Transcripts are cached under the cache directory by audio content and model, so the same clip is not transcribed twice.
354
+
355
+ ### 8. Translate Visible Values
223
356
 
224
357
  To use translation, set `translation = true` in an LLM model profile.
225
358
  Then select a model and target language from the toolbar at the top of the page.
@@ -296,6 +429,7 @@ The main sections are as follows:
296
429
  * `[server]`: Server settings
297
430
  * `[settings]`: EDA, Embedding Atlas, source-file deletion, and related settings
298
431
  * `[llm]`: LLM model profiles used for SQL generation and manual translation
432
+ * `[transcription]`: Speech-recognition models and limits for audio transcription
299
433
  * `[translation]`: Initial target language and translation request limits
300
434
 
301
435
  For example, configure the data location and the maximum number of rows loaded for EDA as follows:
@@ -388,7 +522,7 @@ The environment variables below can also be specified in the TOML `[settings]` s
388
522
  * `EMBEDDER_MODELS_DIR`: The parent directory containing local Hugging Face encoder models. By default, Local Data Studio uses `models/embedder` under the workspace or current working directory.
389
523
  * `ATLAS_HOST`, `ATLAS_PORT`: The IPv4 loopback host used by an Embedding Atlas child process, meaning a separate process started by Local Data Studio, and the first port number to check when selecting an internal port. A loopback host refers only to the same computer. `localhost` is normalized to `127.0.0.1`. IPv6 and externally reachable hosts are not allowed. Browsers do not connect to this port directly.
390
524
  * `ATLAS_MAX_INSTANCES`: The maximum number of pending and running Atlas child processes combined. The default is `4`, and the value must be at least `1`.
391
- * `ATLAS_SAMPLE`: The maximum number of rows used for embedding computation and dimensionality reduction and stored in the cached Atlas Parquet file. Sampling is applied after SQL, with a fixed random seed of 42 so that the same rows are selected for the same input. When unset or set to `0`, all selected rows are used. Negative values are rejected.
525
+ * `ATLAS_SAMPLE`: The maximum number of rows used for embedding computation and dimensionality reduction and stored in the cached Atlas Parquet file. Sampling is applied after SQL, with a fixed random seed of 42 so that the same rows are selected for the same input. When unset or set to `0`, all selected rows are used, except that datasets larger than 256 MiB use a sample of 100,000 rows. Negative values are rejected.
392
526
  * `ATLAS_BATCH_SIZE`: The number of rows processed at once during embedding computation. When unset or set to `0`, the Embedding Atlas default is used.
393
527
  * `ATLAS_CACHE_MAX_BYTES`: The maximum total size of Embedding Atlas-related files stored in `./cache/atlas`. When the limit is exceeded, the oldest cache files are removed first.
394
528
  * `ATLAS_TEXT_MAX_CHARS`: The maximum number of characters retained from a text cell for both embedding input and the cached Atlas Parquet file. Set this to `0` to disable truncation.
@@ -399,6 +533,14 @@ The environment variables below can also be specified in the TOML `[settings]` s
399
533
 
400
534
  </details>
401
535
 
536
+ <details>
537
+ <summary><strong>Large Dataset Settings</strong></summary>
538
+
539
+ * `BACKGROUND_INDEX`: When `true` (the default), opening a JSONL, CSV, TSV, or JSON file indexes its rows in the background, so the total row count, far jumps, and later pages are available without waiting for a full scan. The scan pauses while pages and rows are being loaded, and it stops when you open another file; its progress is kept and resumed later. Set it to `false` to index rows only when you select **Count Rows** or jump past the indexed rows. The `--background-index` and `--no-background-index` command-line options override this setting.
540
+ * `BACKGROUND_INDEX_MAX_BYTES`: How many bytes of each file the background index reads. The default is 16 GiB (`17179869184`). Files up to this size are indexed completely, which also gives their exact row count. Set it to `0` to index whole files of any size.
541
+
542
+ </details>
543
+
402
544
  <details>
403
545
  <summary><strong>Data Deletion Settings</strong></summary>
404
546
 
@@ -413,7 +555,7 @@ The environment variables below can also be specified in the TOML `[settings]` s
413
555
  For development or source-code changes, you can run Local Data Studio from the repository.
414
556
  The following software is required:
415
557
 
416
- * Python 3.11, 3.12, or 3.13
558
+ * Python 3.11, 3.12, 3.13, or 3.14
417
559
  * Git, which is used to download the source code from GitHub
418
560
  * uv, which creates the Python environment and installs the required libraries
419
561
 
@@ -512,7 +654,8 @@ Atlas pages are served through Local Data Studio, so you do not need to forward
512
654
  * Searching and generating EDA reports may take time for large datasets.
513
655
  * Row counting, full-dataset search, sample statistics, and EDA run as background jobs that support progress reporting and cancellation.
514
656
  * Setting `EDA_ROW_LIMIT=-1` loads all selected rows into memory for analysis. Use this only when the complete dataset fits comfortably in memory.
515
- * JSON array files at terabyte (TB) scale are not recommended. Use JSONL or Parquet to browse very large datasets more efficiently.
657
+ * JSON array files are previewed page by page, but counting, indexing, and searching them is several times slower than for JSONL. Use JSONL or Parquet for very large datasets.
658
+ * **Count Rows** indexes a JSONL, CSV, TSV, or JSON file to its end. Jumps past the indexed rows index the rows up to the target automatically.
516
659
  * t-SNE can become dramatically slower and consume much more memory as the amount of data increases. Set a practical `ATLAS_SAMPLE` limit for large datasets.
517
660
 
518
661
  > [!WARNING]
@@ -530,9 +673,26 @@ You can skip it if you only need the standard browsing and analysis features.
530
673
  <details>
531
674
  <summary><strong>Large-Dataset Preview and Background Processing</strong></summary>
532
675
 
533
- For supported formats, previews of very large datasets use cursor-based `page_token` values instead of large `OFFSET` values.
534
- `OFFSET` skips a specified number of rows from the beginning, and larger values may require more work to pass over earlier rows.
535
- A `page_token` records the current position and is used to move efficiently between the previous and next pages.
676
+ Previews never read a dataset from its beginning to reach a page.
677
+
678
+ * JSONL, CSV, TSV, and JSON pages continue from the byte position recorded in a `page_token`.
679
+ A sparse row index, with one checkpoint every 10,000 rows, lets **Go to row** start reading near the requested row.
680
+ The background index, **Count Rows**, and jumps past the index extend one shared scan from where the last scan stopped.
681
+ Searches and jumps also record the checkpoints they pass.
682
+ Without nearby checkpoints, one jump may skip at most 1,000,000 rows unless less than 256 MiB remains to be read; farther jumps index the rows up to the target first.
683
+ * `.json` files that hold one JSON value per line are read like JSONL. JSON arrays are read element by element, so the whole document is never loaded.
684
+ * CSV and TSV files whose quoted fields contain line breaks are read record by record, following RFC 4180 quoting.
685
+ If quotes in a file are unbalanced, rows are split at every line break and a warning is shown.
686
+ * Parquet pages are read by physical row number using the row-group metadata, so any row is available immediately.
687
+ The file's metadata is read once and kept in memory, and only the data pages a page needs are read.
688
+ The next page continues from where the previous page stopped, without decoding its row group again.
689
+ * Each page reads at most 32 MiB of source data, so pages of very large rows contain fewer rows.
690
+ * Rows shown on the current page are kept in memory, up to 64 MiB, so the **Row Inspector**, enlarged images, and audio playback open them without reading the file again.
691
+ * Searches resume after the previous page's last match instead of starting over.
692
+
693
+ Line scans read 16 MiB blocks and locate rows with vectorized byte searches on several threads.
694
+ Counting rows and searching therefore run close to disk speed.
695
+ Jumps and single-row reads start with a 256 KiB read and grow it only when needed.
536
696
 
537
697
  Row counting, full-dataset search, sample statistics, and EDA run as background jobs that support progress reporting and cancellation.
538
698
 
@@ -622,7 +782,7 @@ Values converted into encoder input format are stored only in an internal embedd
622
782
 
623
783
  When `ATLAS_SAMPLE=N` is specified, DuckDB selects rows deterministically after SQL filtering and before creating a pandas DataFrame.
624
784
  As a result, at most `N` rows are materialized for embedding computation, dimensionality reduction, and the cached Atlas Parquet file.
625
- When `ATLAS_SAMPLE=0`, all selected rows are processed.
785
+ When `ATLAS_SAMPLE=0`, all selected rows are processed, except that datasets larger than 256 MiB use a sample of 100,000 rows.
626
786
 
627
787
  Text and prompt templates are expanded only for the current embedding batch.
628
788
  Image `bytes` values are written incrementally to a temporary disk-backed work area, and only the data required for the current batch is loaded into memory.
@@ -674,6 +834,8 @@ Image and multimodal models require a native `modules.json` to run through Sente
674
834
 
675
835
  As a result, image-only DINOv3 checkpoints can use only the Transformers backend and rely on the model-declared `pooler_output`.
676
836
  Qwen3-VL-Embedding models with a native Sentence Transformers pipeline can use both backends.
837
+ EmbeddingGemma 2 declares text, image, audio, and video inputs.
838
+ Sentence Transformers embeds its text and image columns, while the tokenizer-based Transformers adapter is offered for text only.
677
839
 
678
840
  Only backends for which an executable adapter can be confirmed are selectable.
679
841
  `remote_code` is available only when `ATLAS_TRUST_REMOTE_CODE=true` explicitly permits execution of code from the model repository.
@@ -746,7 +908,7 @@ Resolve all errors before committing.
746
908
  ## Acknowledgements
747
909
 
748
910
  * [Dataset Viewer by Hugging Face](https://github.com/huggingface/dataset-viewer): Used as a reference for the UI and feature design.
749
- * [YData Profiling](https://github.com/ydataai/ydata-profiling): Used to generate EDA reports.
911
+ * [fg-data-profiling](https://github.com/Data-Centric-AI-Community/fg-data-profiling) (formerly YData Profiling): Used to generate EDA reports.
750
912
  * [Embedding Atlas](https://github.com/apple/embedding-atlas): Used for interactive embedding visualization.
751
913
 
752
914
  ## License