Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
20b5320
added a banner and moved layer menu to header
manjilasingh Apr 8, 2026
0450c20
Merge pull request #2 from manjilasingh/main
manjilasingh Apr 8, 2026
e01ef1f
refactor: update S3 paths to reflect new resource structure in variou…
romer8 May 8, 2026
3008b88
Merge pull request #3 from Aquaveo/refactor/update-s3-paths
romer8 May 8, 2026
93f04f2
Resolved grype scan failures
manjilasingh Jul 6, 2026
c9f9b57
Merge pull request #4 from manjilasingh/fix/ci-image-vulns
manjilasingh Jul 6, 2026
7f560c4
bumped pyarrow and waived pyo3 in rattler
manjilasingh Jul 7, 2026
84e823b
Merge branch 'Aquaveo:main' into fix/scan-cves-pyarrow-pyo3
manjilasingh Jul 7, 2026
7566d3e
revert: drop main image tag from dev builds
manjilasingh Jul 7, 2026
07c10c2
Merge branch 'fix/scan-cves-pyarrow-pyo3' of https://github.com/CIROH…
manjilasingh Jul 7, 2026
240191a
Merge pull request #6 from CIROH-UA/fix/scan-cves-pyarrow-pyo3
manjilasingh Jul 7, 2026
2a4f112
Added cd pipeline to deploy main code to staging and version tags to …
manjilasingh Jul 7, 2026
3def841
apply enable_open_portal var to portal config
manjilasingh Jul 7, 2026
e7eba14
Merge pull request #7 from manjilasingh/feat/cd-deploy
manjilasingh Jul 7, 2026
797d46d
added google analytics tag on deploy
manjilasingh Jul 14, 2026
bad5fe7
Merge pull request #8 from manjilasingh/feat/cd-deploy
manjilasingh Jul 14, 2026
cf39889
fix: render google analytics tag correctly
manjilasingh Jul 14, 2026
bbb3a0c
Merge pull request #9 from CIROH-UA/fix/ga-analytics
manjilasingh Jul 14, 2026
7c9db0a
test: keep the suite runnable when the msw mock server cannot load
romer8 Aug 20, 2026
39f5fd7
fix(datastream): always act on a catchment click and keep failures on…
romer8 Aug 20, 2026
f2c0f67
fix(datastream): let a second click retry a failed catchment fetch
romer8 Aug 20, 2026
12cb736
perf(datastream): skip the fetch when the clicked feature is already …
romer8 Aug 20, 2026
588b20d
fix(datastream): let a failed vpu load be retried, and show why it fa…
romer8 Aug 20, 2026
5e4d13c
perf(map): stop recomputing the flowpath color ramp on every frame
romer8 Aug 20, 2026
f598483
perf(s3): stop refetching the whole option chain on every vpu change
romer8 Aug 20, 2026
dda37ae
perf(datastream): start both variable queries at once
romer8 Aug 20, 2026
30ac996
perf(map): keep the animation out of the map component's render
romer8 Aug 20, 2026
5ff230e
refactor(datastream): load a series from the event that asks for it
romer8 Aug 20, 2026
4352932
fix(datastream): stop returning from a finally block
romer8 Aug 20, 2026
a40d037
fix(plot): react to the label-sizing breakpoint instead of reading it…
romer8 Aug 20, 2026
b54914c
perf(datastream): reuse the variable data the vpu store already holds
romer8 Aug 20, 2026
dfcfe05
refactor(datastream): load a vpu from the event that asks for it
romer8 Aug 20, 2026
a21f5d2
refactor(datastream): keep the query layer out of the timeseries store
romer8 Aug 20, 2026
f8a060c
test: make the chart loadable in tests
romer8 Aug 20, 2026
0649cad
style: apply review fixes that carry no behaviour change
romer8 Aug 20, 2026
c357091
fix(datastream): give the loading state a single owner
romer8 Aug 20, 2026
bc88d20
fix(datastream): report empty results, and stop animating a hidden layer
romer8 Aug 20, 2026
8513e72
fix(datastream): resolve the rest of the review findings
romer8 Aug 20, 2026
51dc009
fix(datastream): never leak the in-flight counters
romer8 Aug 20, 2026
c774d91
fix(datastream): put the load status where it can be seen
romer8 Aug 20, 2026
b1c6819
fix(datastream): make the header status readable in both themes
romer8 Aug 20, 2026
f8fb348
fix(map): stop flying to null island when a catchment cannot be placed
romer8 Aug 20, 2026
d924f67
fix(search): let the box be typed in, and search when asked
romer8 Aug 20, 2026
f08d3aa
perf(search): cache the id index in OPFS instead of refetching it
romer8 Aug 20, 2026
81d307e
fix(cache): actually delete a cached parquet when asked
romer8 Aug 20, 2026
a079435
perf(cache): cap the cached parquets and evict the least recently used
romer8 Aug 20, 2026
34a006e
fix(cache): do not trust a half-written cached file
romer8 Aug 20, 2026
bbfb882
fix(cache): keep the id index out of the loaded-files list
romer8 Aug 20, 2026
05ae744
fix(ui): resolve the audit findings
romer8 Aug 20, 2026
5505cee
fix(ui): label the controls, size them for touch, finish the neutrals
romer8 Aug 20, 2026
d571693
improvement patches
romer8 Aug 21, 2026
2983007
extra commits
romer8 Aug 21, 2026
550380a
Merge branch 'main' into perf/react-deckgl-review
romer8 Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/security/.grype.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@ ignore:
- package:
name: python
type: binary
reason: "Pinned to an older CPython until conda-build grows support for the latest version."
reason: "Pinned to an older CPython until conda-build grows support for the latest version."
- package:
name: pyo3
reason: "pyo3 0.25.1 is vendored in py-rattler 0.25.0 (conda's Rust solver) from the tethys-core base image. Not app runtime code and not controllable from this repo's dependencies. Revisit when the base image ships py-rattler built against pyo3 >=0.29."
12 changes: 12 additions & 0 deletions .github/workflows/build_and_push_dev_image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ jobs:
runs-on: ubuntu-latest
needs:
- scan # <- only push/tag if scan job as a whole succeeded
outputs:
# e.g. displays the new image tag dev_abc1234
image_version: ${{ steps.meta.outputs.version }}

steps:
- name: Download digests
Expand Down Expand Up @@ -184,3 +187,12 @@ jobs:
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}

# Auto-deploy merges to main onto the staging server (nrds-staging.ciroh.org)
deploy-staging:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: merge
uses: ./.github/workflows/deploy.yml
with:
environment: staging
image_tag: ${{ needs.merge.outputs.image_version }}
8 changes: 8 additions & 0 deletions .github/workflows/build_and_push_prod_image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,11 @@ jobs:
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ github.ref_name }}
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:latest

# Deploy the released version to the production server (nrds.ciroh.org)
deploy-prod:
needs: merge
uses: ./.github/workflows/deploy.yml
with:
environment: prod
image_tag: ${{ github.ref_name }}
85 changes: 85 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: deploy

on:
# Called by the dev/prod image workflows after an image is published
workflow_call:
inputs:
environment:
description: "Target environment (staging or prod)"
required: true
type: string
image_tag:
description: "Image tag to deploy (e.g. dev_abc1234 or v1.2.0)"
required: true
type: string

# Manual deploy / rollback: pick any previously published tag
workflow_dispatch:
inputs:
environment:
description: "Target environment"
required: true
type: choice
options:
- staging
- prod
image_tag:
description: "Image tag to deploy (e.g. dev_abc1234 or v1.2.0)"
required: true
type: string

env:
REGISTRY_IMAGE: awiciroh/tethys-nrds
CONTAINER_NAME: tethys-nrds

jobs:
deploy:
# Runner label must match the environment name (staging / prod)
runs-on:
- self-hosted
- ${{ inputs.environment }}
environment: ${{ inputs.environment }}

steps:
- name: Pull image
run: docker pull "$REGISTRY_IMAGE:${{ inputs.image_tag }}"

- name: Replace container
run: |
# Google Analytics: only injected when the environment defines GA_TRACKING_ID
GA_ARGS=()
if [ -n "${{ vars.GA_TRACKING_ID }}" ]; then
GA_ARGS=(-e "GOOGLE_ANALYTICS_GTAG_PROPERTY_ID=${{ vars.GA_TRACKING_ID }}")
fi

docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
docker run -d \
--name "$CONTAINER_NAME" \
--restart unless-stopped \
-p 127.0.0.1:8080:80 \
-e NGINX_PORT=80 \
-e SKIP_DB_SETUP=false \
-e ALLOWED_HOSTS='${{ vars.ALLOWED_HOSTS }}' \
-e CSRF_TRUSTED_ORIGINS='${{ vars.CSRF_TRUSTED_ORIGINS }}' \
"${GA_ARGS[@]}" \
"$REGISTRY_IMAGE:${{ inputs.image_tag }}"

- name: Health check
run: |
echo "Waiting for app to come up (first boot runs salt setup)..."
for i in $(seq 1 30); do
if curl -fsSL -o /dev/null http://127.0.0.1:8080/; then
echo "App is up after ~$((i * 5))s"
exit 0
fi
sleep 5
done
echo "App did not respond within 150s; container logs:"
docker logs --tail 100 "$CONTAINER_NAME"
exit 1

- name: Remove unused images
run: docker image prune -f

- name: Summary
run: echo "Deployed \`$REGISTRY_IMAGE:${{ inputs.image_tag }}\` to **${{ inputs.environment }}**" >> "$GITHUB_STEP_SUMMARY"
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ reactapp/config/production.env
coverage
reactapp/wdyr.js

docs
.impeccable
.context
DESIGN.md

# singularity

Expand Down
7 changes: 5 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ ENV PORTAL_SUPERUSER_PASSWORD=pass
ENV PROJ_LIB=/opt/conda/envs/tethys/share/proj

ENV NVM_DIR=/usr/local/nvm
ENV NODE_VERSION=24.4.1
ENV NODE_VERSION=24.18.0
ENV NODE_VERSION_DIR=${NVM_DIR}/versions/node/v${NODE_VERSION}
ENV NODE_PATH=${NODE_VERSION_DIR}/lib/node_modules
ENV PATH=${NODE_VERSION_DIR}/bin:$PATH
Expand Down Expand Up @@ -77,7 +77,10 @@ RUN cd ${APP_SRC_ROOT} \
&& ${NPM} install \
&& ${NPM} run build \
&& rm -rf node_modules \
&& ${PDM} install --no-editable --production
&& ${PDM} install --no-editable --production \
# node is only needed to build the frontend; remove it so node CVEs
# don't flag the runtime image in security scans
&& rm -rf ${NVM_DIR}

ADD salt/ /srv/salt/

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@
"^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)": "<rootDir>/reactapp/config/tests/transforms/fileTransform.js"
},
"transformIgnorePatterns": [
"[/\\\\]node_modules[/\\\\](?!(ol|ol-mapbox-style|plotly.js|react-plotly.js)[/\\\\]).+\\.(js|jsx|mjs|cjs|ts|tsx)$",
"[/\\\\]node_modules[/\\\\](?!(ol|ol-mapbox-style|plotly.js|react-plotly.js|d3-[a-z-]+|internmap|delaunator|robust-predicates)[/\\\\]).+\\.(js|jsx|mjs|cjs|ts|tsx)$",
"^.+\\.module\\.(css|sass|scss)$"
],
"moduleFileExtensions": [
Expand Down
Loading
Loading