Kepler.gl is a powerful open source geospatial analysis tool for large-scale data sets.
This report summarizes scanner evidence for keplergl/kepler.gl, a TypeScript project with 12,073 GitHub stars. SynthScan examined 406,363 lines of code across 1773 source files, recording 634 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 608 finding(s).
Are imports declared and package/API names verified? 14 finding(s).
Are wrappers, guards, and repeated structures necessary? 539 finding(s).
Which changes need focused human review? 634 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 634 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/browser/components/side-panel/layer-list.spec.js | 133 | function renderLayerListForInstances({emptySharedGroup = false} = {}) { | CODE |
| LOW | test/browser/layer-tests/heatmap-layer-specs.js | 490 | function createHeatmapGeojsonLayer(values) { | CODE |
| LOW | test/browser/layer-tests/flow-field-layer-specs.js | 404 | function createFlowFieldGeojsonDataset(id = 'flow-geojson-data') { | CODE |
| LOW | test/node/utils/layer-utils-test.js | 36 | async function createDefaultColorDataset(columns, rowCount = 3) { | CODE |
| LOW | test/node/processors/shapefile-files-test.js | 17 | function createPointShapefileBuffers({x = -122.4, y = 37.8, name = 'alpha'} = {}) { | CODE |
| LOW | test/node/processors/file-handler-test.js | 697 | async function assertCompleteGeoArrowLayer( | CODE |
| LOW | test/node/reducers/vis-state-test.js | 3760 | function testSetFilterDynamicDomainGPU(t, setFilter) { | CODE |
| LOW | test/node/reducers/vis-state-test.js | 7338 | function loadDualLonLatPolygonState() { | CODE |
| LOW | test/node/reducers/vis-state-test.js | 9393 | function mockStateWithFilterAndIntervalBasedAnimationLayer() { | CODE |
| LOW | test/helpers/rtl-utils.js | 28 | export function mockHTMLElementClientSize(prop, value) { | CODE |
| LOW | test/helpers/mock-state.js | 155 | function mockStateWithLayerCustomColorBreaksLegends() { | CODE |
| LOW | test/helpers/mock-state.js | 215 | function mockStateWithSyncedTimeFilter() { | CODE |
| LOW | test/helpers/mock-state.js | 329 | export function mockStateWithArcNeighbors(state) { | CODE |
| LOW | test/helpers/mock-state.js | 382 | function mockStateWithMultiFilters() { | CODE |
| LOW | test/helpers/mock-state.js | 566 | export function mockStateWithLayerDimensions(state) { | CODE |
| LOW | test/helpers/mock-state.js | 636 | function mockStateWithCustomMapStyle(customType = 'LOCAL') { | CODE |
| LOW | test/helpers/mock-state.js | 703 | function mockStateWithTooltipFormat() { | CODE |
| LOW | test/helpers/mock-state.js | 734 | function mockStateWithGeocoderDataset() { | CODE |
| LOW | test/helpers/mock-state.js | 780 | function mockStateWithLayerStyling() { | CODE |
| LOW | test/helpers/mock-state.js | 1258 | export function stateWithTimeFilterAndTripLayer() { | CODE |
| LOW | test/helpers/mock-state.js | 1264 | export function stateWithTimeFilterSyncedWithTripLayer() { | CODE |
| LOW | test/helpers/component-utils.js | 23 | export function mockHTMLElementClientSize(prop, value) { | CODE |
| LOW | test/helpers/mock-state-utils.js | 39 | export function applyExistingDatasetTasks(reducer, initialState) { | CODE |
| LOW | test/helpers/layer-utils.js | 51 | export function testCreateLayerFromConfig(t, tc, LayerClasses = KeplerLayerClasses) { | CODE |
| LOW | examples/custom-layer/src/app.tsx | 25 | function CustomLayerConfiguratorFactory( | CODE |
| LOW | examples/demo-app/src/actions.js | 37 | export function loadRemoteResourceSuccess(response, config, options, remoteDatasetConfig) { | CODE |
| LOW | examples/demo-app/src/actions.js | 47 | export function loadRemoteDatasetProcessedSuccessAction(result) { | CODE |
| LOW | …/src/cloud-providers/foursquare/foursquare-provider.js | 57 | function extractMapFromFSQResponse(response) { | CODE |
| LOW | examples/demo-app/src/utils/runtime-config.js | 67 | export function applyDemoApplicationDefaults() { | CODE |
| LOW | examples/demo-app/src/utils/runtime-config.js | 167 | export async function loadAndApplyRuntimeConfig() { | CODE |
| LOW | examples/demo-app/src/reducers/index.js | 125 | async function loadRemoteResourceSuccessTask({ | CODE |
| LOW | examples/demo-app-sqlrooms/src/actions.js | 38 | export function loadRemoteResourceSuccess(response, config, options, remoteDatasetConfig) { | CODE |
| LOW | examples/demo-app-sqlrooms/src/actions.js | 48 | export function loadRemoteDatasetProcessedSuccessAction(result) { | CODE |
| LOW | …/src/cloud-providers/foursquare/foursquare-provider.js | 57 | function extractMapFromFSQResponse(response) { | CODE |
| LOW | …es/demo-app-sqlrooms/src/components/assistant-tools.ts | 15 | export function createAssistantSkillTools(store: StoreApi<DemoRoomState>) { | CODE |
| LOW | examples/demo-app-sqlrooms/src/reducers/index.js | 150 | async function loadRemoteResourceSuccessTask({ | CODE |
| LOW | bindings/python/keplergl/serializers.py | 120 | def _serialize_dataframe_arrow(df: pd.DataFrame, name: str) -> dict: | CODE |
| LOW | bindings/python/keplergl/_html_export.py | 117 | def _serialize_datasets_for_html(data: dict, json_encoder=str) -> str: | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 423 | def test_serialize_dataframe_arrow_default_off(self, sample_df): | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 430 | def test_serialize_geodataframe_ignores_use_arrow(self, sample_gdf): | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 439 | def test_serialize_unsupported_type(self): | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 444 | def test_serialize_empty_dataframe(self): | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 452 | def test_serialize_single_row_dataframe(self): | CODE |
| LOW⚡ | bindings/python/tests/test_serializers.py | 459 | def test_serialize_dataframe_with_various_dtypes(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 23 | def test_serialize_dataframe_with_cities(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 39 | def test_serialize_dataframe_with_hex_data(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 56 | def test_serialize_dataframe_with_nan_filled(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 71 | def test_serialize_geodataframe(self, sample_gdf): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 77 | def test_serialize_geodataframe_with_timestamp(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 99 | def test_serialize_geodataframe_points_from_xy(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 116 | def test_serialize_geodataframe_with_polygons(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 132 | def test_serialize_geodataframe_with_crs(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 143 | def test_serialize_empty_geodataframe(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 154 | def test_serialize_all_null_geometry_geodataframe(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 165 | def test_serialize_geodataframe_multiple_geometry_columns(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 209 | def test_serialize_geodataframe_non_default_active_geometry(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 239 | def test_serialize_geodataframe_null_secondary_geometry(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 262 | def test_serialize_geojson_dict(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 269 | def test_serialize_geojson_feature_collection(self): | CODE |
| LOW | bindings/python/tests/test_serializers.py | 292 | def test_serialize_geojson_string(self): | CODE |
| 465 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/docker-compose.ghcr.yml | 1 | # No-build demo-app. Pulls the published image; does not clone or compile kepler.gl. | COMMENT |
| LOW | test/browser/components/tooltip-config-test.js | 21 | COMMENT | |
| LOW | test/browser/components/common/range-plot-test.js | 61 | COMMENT | |
| LOW | …t/browser/components/side-panel/color-selector-test.js | 461 | // name: 'Ice And Fire 8', | COMMENT |
| LOW | …owser/components/side-panel/layer-configurator-test.js | 281 | 'gps_data.lng', | COMMENT |
| LOW | …owser/components/side-panel/layer-configurator-test.js | 301 | // value: 'gps_data.lng', | COMMENT |
| LOW | test/browser/layer-tests/hexagon-layer-specs.js | 221 | Object.keys(layerData).sort(), | COMMENT |
| LOW | test/node/processors/file-handler-test.js | 141 | // const expectedResults = [ | COMMENT |
| LOW | test/node/reducers/vis-state-test.js | 4881 | stateWithFilterPlot.filters[0].timeBins.smoothie['15-second'], | COMMENT |
| LOW | test/node/reducers/vis-state-test.js | 4901 | // lineChart: { | COMMENT |
| LOW | test/node/reducers/vis-state-test.js | 4921 | // {x: 1474071675000, y: 30.0292134, delta: 'last', pct: 0.00009290816741525582}, | COMMENT |
| LOW | test/node/reducers/vis-state-test.js | 4941 | // // gps_data.lat | COMMENT |
| LOW | examples/custom-layer/src/custom-contour-layer.js | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | examples/demo-app-sqlrooms/src/app.tsx | 881 | centerMap: true | COMMENT |
| LOW | src/types/layers.d.ts | 401 | }; | COMMENT |
| LOW | src/types/layers.d.ts | 421 | // strokeColor: any; | COMMENT |
| LOW | src/layers/src/base-layer.ts | 1721 | const userBackground = Boolean(textLabel[i].background || backgroundProps?.background); | COMMENT |
| LOW | src/layers/src/base-layer.ts | 1741 | // -background and -characters, and deck.gl drops the pair when those | COMMENT |
| LOW | src/layers/src/flow-field-layer/flow-field-layer.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/layers/src/tile3d-layer/tile3d-layer.ts | 81 | } | COMMENT |
| LOW | src/layers/src/tile3d-layer/tile3d-layer.ts | 221 | // module is added/removed, existing models keep their old shaders. | COMMENT |
| LOW | src/layers/src/heatmap-layer/deck-heatmap-layer.ts | 401 | // Detect a transition out of globe mode. In globe mode we frame the density | COMMENT |
| LOW | src/layers/src/heatmap-layer/deck-heatmap-layer.ts | 461 | COMMENT | |
| LOW | src/layers/src/heatmap-layer/deck-heatmap-layer.ts | 581 | if (!triPositionBuffer || !triTexCoordBuffer || !normalizedCommonBounds) { | COMMENT |
| LOW | src/deckgl-layers/src/globe/atmosphere-layer.ts | 201 | fragColor.a *= fTerminatorOpacityFactor; | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-backface-cull.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-backface-cull.ts | 21 | // - a surface point is visible from the camera exactly when the angle between its | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-view.ts | 81 | COMMENT | |
| LOW | src/deckgl-layers/src/globe/globe-view.ts | 121 | } | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-view.ts | 241 | // | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-view.ts | 341 | // projection math (globe vs flat mercator). That makes deck's TileLayer/MVTLayer | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-layers.ts | 281 | if (backgroundColor) { | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-layers.ts | 301 | // - depthMask: false → don't write depth (avoid self z-fighting on the shell) | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-layers.ts | 321 | const GLOBE_SATELLITE_ZOOM_OFFSET = 0; | COMMENT |
| LOW | src/deckgl-layers/src/globe/index.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/deckgl-layers/src/globe/mvt-label-layer.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/deckgl-layers/src/globe/globe-depth-disk-layer.ts | 21 | // Depth writes only happen with depthTest enabled. The disk is opaque-black-ish | COMMENT |
| LOW | …deckgl-layers/src/raster/raster-processing-uniforms.ts | 81 | #define colormap_categoricalMinValue_ALIAS rasterProcessing.colormap_categoricalMinValue | COMMENT |
| LOW | …gl-layers/src/raster/webgl/color/sigmoidal-contrast.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | …gl-layers/src/raster/webgl/color/sigmoidal-contrast.ts | 21 | // 20 is a lot. | COMMENT |
| LOW | …deckgl-layers/src/raster/webgl/color/gamma-contrast.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/deckgl-layers/src/layer-utils/cpu-aggregator.ts | 601 | layerData: {}, | COMMENT |
| LOW | src/deckgl-layers/src/layer-utils/aggregation-utils.ts | 121 | // | COMMENT |
| LOW | src/mcp/src/commands/table-command.ts | 81 | // high-risk, confirmation-gated command. Fail fast with an actionable | COMMENT |
| LOW | src/mcp/src/commands/layer-creation-command.ts | 301 | // recoverable error. Only run this when colorType is explicitly 'unique': | COMMENT |
| LOW | src/mcp/src/commands/add-column-command.ts | 121 | // Pass the user-provided datasetName (label or id) to | COMMENT |
| LOW | src/mcp/src/commands/load-data-command.ts | 141 | const fileName = | COMMENT |
| LOW | src/components/src/map-container.tsx | 741 | COMMENT | |
| LOW | src/components/src/map-container.tsx | 1501 | // ending) arrives with all interaction flags false. If we defer it, the | COMMENT |
| LOW | …c/components/src/modals/globe-export-video-preview.tsx | 101 | mapboxApiUrl: mapProps?.mapboxApiUrl, | COMMENT |
| LOW | …s/src/common/animation-control/animation-controller.ts | 221 | const delta = | COMMENT |
| LOW | src/components/src/side-panel/custom-panel.tsx | 21 | }; | COMMENT |
| LOW | src/deckgl-arrow-layers/src/constants.ts | 1 | // SPDX-License-Identifier: MIT | COMMENT |
| LOW | src/reducers/src/map-state-updaters.ts | 641 | // if current viewport is synced, and we are unsyncing it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | website/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/custom-reducer/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/replace-component/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/custom-map-style/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/open-modal/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/node-app/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/clicked-feature/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/duckdb-vite/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/get-started-vite/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/custom-layer/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/custom-theme/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/demo-app/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/demo-app-sqlrooms/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| MEDIUM | examples/get-started/.yarnrc.yml | 3 | # Define the registry to use when fetching packages. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | bindings/python/keplergl/_html_export.py | 132 | f" datasets.push({{info: {{id: {json.dumps(name, ensure_ascii=False)}, label: {json.dumps(name, ensure_ | CODE |
| HIGH | bindings/python/keplergl/_html_export.py | 139 | f" datasets.push({{info: {{id: {json.dumps(name, ensure_ascii=False)}, label: {json.dumps(name, ens | CODE |
| HIGH⚡ | bindings/python/keplergl/_html_export.py | 243 | window.React = React.default || React; | CODE |
| HIGH⚡ | bindings/python/keplergl/_html_export.py | 244 | window.ReactDOM = Object.assign({{}}, ReactDOM.default || ReactDOM, ReactDOMClient); | CODE |
| HIGH⚡ | bindings/python/keplergl/_html_export.py | 245 | window.Redux = Redux.default || Redux; | CODE |
| HIGH⚡ | bindings/python/keplergl/_html_export.py | 246 | window.ReactRedux = ReactRedux.default || ReactRedux; | CODE |
| HIGH | bindings/python/keplergl/_html_export.py | 340 | react.createElement(KeplerElement, null) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | test/browser/layer-tests/zarr-layer-specs.js | 1197 | deckLayer.props.metadata.multiscales.layout.map(level => level.asset), | CODE |
| CRITICAL | test/browser/layer-tests/cluster-layer-specs.js | 605 | const members = () => layer.state.aggregatorState.layerData.data.flatMap(cell => cell.points); | CODE |
| CRITICAL | test/node/reducers/vis-state-test.js | 3433 | state.datasets.replacement.filterRecord.cpu.some(filter => filter.id === state.filters[0].id), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/custom-layer/src/app.tsx | 21 | // ── Custom layer configurator ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/app.tsx | 80 | // ── Store ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/app.tsx | 103 | // ── Sample data ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/app.tsx | 202 | // ── Window size hook ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/app.tsx | 214 | // ── App component ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/custom-contour-layer.js | 16 | // ── Layer icon (simple SVG shown in the layer type selector) ───────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/custom-contour-layer.js | 28 | // ── vis-config entries ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/custom-contour-layer.js | 67 | // ── Required columns ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/custom-layer/src/custom-contour-layer.js | 71 | // ── Custom layer class ──────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bindings/python/package-lock.json | 10232 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | bindings/python/package-lock.json | 11177 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", | CODE |
| MEDIUM | src/deckgl-layers/src/globe/globe-layers.ts | 298 | // is a precision-robust occluder that works at any zoom, so: | COMMENT |
| MEDIUM | …deckgl-arrow-layers/src/layers/geo-arrow-text-layer.ts | 243 | // TODO privide more robust data comparators | COMMENT |
| MEDIUM | src/reducers/src/vis-state-updaters.ts | 747 | // TODO: Shan, make the animation config function more robust | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | bindings/python/keplergl/serializers.py | 40 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | bindings/python/keplergl/_html_export.py | 74 | except (json.JSONDecodeError, TypeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …mo-app/src/cloud-providers/dropbox/dropbox-provider.js | 162 | // TODO: implement pagination, so we don't need to get all the thumbs all at once | COMMENT |
| LOW | …lrooms/src/cloud-providers/dropbox/dropbox-provider.js | 162 | // TODO: implement pagination, so we don't need to get all the thumbs all at once | COMMENT |
| LOW | src/layers/src/vector-tile/common-tile/tile-dataset.ts | 62 | // TODO: implement later | COMMENT |
| LOW | src/components/src/common/column-stats-chart.tsx | 378 | // TODO: implement display for ordinal breaks | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bindings/python/keplergl/__init__.py | 6 | CODE | |
| LOW | bindings/python/keplergl/__init__.py | 7 | CODE | |
| LOW | bindings/python/keplergl/_html_export.py | 6 | CODE | |
| LOW | bindings/python/tests/test_widget.py | 6 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bindings/python/keplergl/widget.py | 29 | CODE | |
| LOW | bindings/python/keplergl/widget.py | 81 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bindings/python/keplergl/serializers.py | 63 | CODE | |
| LOW | bindings/python/keplergl/_html_export.py | 44 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/build-publish-pypi.yml | 97 | # Check if version contains prerelease indicators (a, b, rc, dev) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bindings/python/keplergl/__init__.py | 9 | __all__ = ["KeplerGl", "__version__"] | CODE |