Repository navigation
Releases
v0.6.2
Compare: v0.6.1...v0.6.2
A health-report fix, and the deployment and CI fixes after the first automatic deploy of v0.6.1.
Fixed
- The detailed health report (
/v1/health?detailed=true) said the Earth Engine service account was not configured on a host that uses default credentials (GEE_USE_DEFAULT_CREDENTIALS); it now reports credentials from either source. - The first automatic deploy after a merge into
masterconfigured the host from its first-boot checkout, where the configure script did not exist, and failed; a branch deploy now checks outorigin/<branch>. Tag deploys were unaffected.
Changed
- The deploy targets a GitHub environment named after the site,
dt4lc.org, instead ofdemo; the workflow is "Deploy dt4lc.org", and the Deployments page links to the site. Sync dev with masterfast-forwardsdevtomasterafter a release whendevhas no commits of its own, with a deploy key that thedevruleset admits (SYNC_DEPLOY_KEY), so the two branches point at the same commit; whendevhas moved on it opens the pull request as before.- The
Release gateadmitsci/*branches with workflow and documentation changes only, likedocs/*(CONTRIBUTING).
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc/backend:0.6.2
docker pull ghcr.io/ipt-mmda/dt4lc/frontend:0.6.2Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.6.2 https://github.com/IPT-MMDA/dt4lc.git
cd dt4lc
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsv0.6.1
Compare: v0.6.0...v0.6.1
The public demo and its deployment, and the CI that keeps it current.
Added
- A public demo host on Google Cloud, described as Terraform in
deploy/gcp/terraform/: the APIs, a static address, the firewall (80 and 443 public, SSH through IAP), an Earth Engine service account that the VM runs as, a Debian 12 VM that provisions itself on first boot (deploy/gcp/startup.sh: Docker Engine, Compose v2, Caddy, the repository, a.envwith every non-secret value), and an optional Cloud DNS zone.deploy/gcp/finish.shstarts the stack and runs the runbook's checks;deploy/gcp/update.shmoves the host to a release. - Automatic deploys (
.github/workflows/deploy.yml): after the images of a release tag or ofmasterare published, the demo host is updated over an IAP tunnel. GitHub Actions authenticates through Workload Identity Federation, so no key is stored; the project id and the host come from repository variables. Terraform plans on pull requests that touch the configuration and applies onmasteronce remote state is set up (TF_STATE_BUCKET). The host's sign-in, allowlist and LLM-provider settings come from a GitHub environment,demo: each deploy writes its variables and secrets into the host's.env(deploy/gcp/configure.sh). docker-compose.ghcr.ymlruns the published images instead of building them (DT4LC_IMAGE_TAG).- Release rules in CI: the
Release gatecheck admits pull requests intomasterfromdev(a release),hotfix/*(a patch bump) ordocs/*(documentation and workflows only);Sync dev with masteropens a pull request frommasterintodevafter each push tomaster; a documentation-only push tomasterbuilds no images. GEE_USE_DEFAULT_CREDENTIALS=truelets Earth Engine use the host's default credentials, the attached service account on Google Cloud orgcloud auth application-default login, instead of a key file. Organisation policy forbids service-account keys on new Google Cloud projects.scripts/ghcr_prune.pydeletes stale container package versions by tag pattern.- README badges (CI, release, DOI, JOSS status, licence) and the Zenodo DOIs in
CITATION.cff.
Changed
- The backend image installs torch from the CPU wheel index (
TORCH_INDEXbuild argument), so it no longer carries the CUDA libraries that no container used: 1.1 GB instead of 12.3 GB. A GPU image is--build-arg TORCH_INDEX=https://download.pytorch.org/whl/cu124. CITATION.cffcites the Zenodo concept DOI, which resolves to the latest release.- Hotfixes have a documented path:
hotfix/<topic>frommaster, a patch bump, a pull request intomaster, thenmasterback intodev(CONTRIBUTING).
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc/backend:0.6.1
docker pull ghcr.io/ipt-mmda/dt4lc/frontend:0.6.1Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.6.1 https://github.com/IPT-MMDA/dt4lc.git
cd dt4lc
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsv0.6.0
Compare: v0.5.1...v0.6.0
A conversation-first workspace replaces the job-centred interface: you describe an analysis in plain language, and the assistant says what it will do, runs it and shows the result in the same message. v0.6.0-alpha.1 was a preview with the backend contracts and the Workspace.
Added
- Workspace. One message per analysis: the assistant's intent, the plan steps with their times and Cancel, then a result card, an interpretation and follow-up suggestions. A failed analysis keeps its steps open, with the reason in plain words and fixes as buttons.
- Proposals. When no built-in analysis fits, the assistant proposes one (Run · Change · Explain), and the analysis that runs is marked Composed by the assistant. NDMI, NBR, SAVI and NDBI are composed even without an assistant. The new
algorithms/band-mathandalgorithms/band-math-changeaccept only numbers, band names, arithmetic operators and parentheses. - Result cards for index, change, classification, field-boundary and statistics results, with a legend, the source line, km² statistics, and On map · GeoTIFF · PNG · GeoPackage · Details.
- Conversation replies stream as markdown and never start a job. Dates in the prompt pick the file ("NDVI for 1 June").
- Composer: +, From map, From library and drag-and-drop, with attachment chips that show the sensor, bands, resolution, size and dates.
- The bundled Kakhovka sample attaches with one click (
POST /v1/sample). - A Preparing model step with the download size and time left when a model's weights are missing.
- New screens:
- the landing page at
/; - Capabilities, six tiers computed from the live server state;
- Map mode, with the imagery panel, region presets, drawing and Send to chat, result layers with legends, and a Compare swipe (building on pull requests #51 by nik4nd and #35 by NataliaGon);
- the Library, analyses and files in one table;
- Result detail (
/app/results/:id), with readable download names such aswater-change_ndwi_2023-06-01_2023-06-09.tif; - Settings for operators (
/app/settings: Assistant, Models, Access, Data sources, Server), saved to an overrides file, never to.env.
- the landing page at
- Sessions and sign-in. Every visitor starts as a guest: 5 analyses an hour, with work kept for 24 hours in that browser. GitHub sign-in makes an allowlisted address a member (no limit, work kept on any browser) or an operator (also Settings and every owner's jobs). A guest's work moves to the account on sign-in.
- Public demo deployment:
docker compose --profile demowithdocker-compose.demo.yml. It pre-installs the model weights, rate-limits each client IP in nginx, publishes no backend port and removes guest data on a schedule. The runbook isdocs/DEPLOY_DEMO.md. - Look and accessibility: a new visual language with light and dark themes, self-hosted Inter and IBM Plex Mono fonts, phone (390 px) and tablet (834 px) layouts, and keyboard and screen-reader support.
- New endpoints:
GET /v1/jobs/{id}/events,POST /v1/jobs/{id}/confirm,DELETE /v1/jobs/{id},GET /v1/jobs/{id}/statistics.csv,POST /v1/sample,DELETE /v1/files/{id},GET /v1/session,GET /v1/auth/status,GET /v1/auth/github/login,GET /v1/auth/github/callback,POST /v1/auth/logout,GETandPUT /v1/settings,POST /v1/settings/assistant/testandGET /v1/tiles/{z}/{x}/{y}. - The University of Maryland seal in the landing page's footer, next to the MMDA and University of Geneva logos.
Changed
- Breaking: every response sets a signed
dt4lc_sessioncookie, and a client that does not send it back is a new guest on every request. API scripts must keep a cookie jar (curl -c jar -b jar). - Breaking:
POST /v1/chatis the conversation endpoint. It streams markdown replies and never plans or runs a job, so theplanning,plan_ready,executingandcompleteframes are gone. Analyses go throughPOST /v1/jobsand its event stream. - Breaking:
GET /v1/capabilitiesreturns{summary, assistant, offline, banner, tiers}for the caller instead of{instances: [...]}.GET /v1/modelsstill lists the models. - Breaking: a composed plan stops at
proposaluntilPOST /v1/jobs/{id}/confirm, andPOST /v1/executerefuses an unconfirmed one with 409CONFIRMATION_REQUIRED. - Breaking:
/v1/planand/v1/executeanswer conversation and file-less prompts with 422 (NOT_AN_ANALYSIS, ormissing_input) instead of 500. - Breaking: result statistics are keyed by band code (
B2, …) instead ofband_<n>, each date's change index is clipped to [−1, 1], artifact references gainsize_bytesanddownload_name(theirurlends in&name=), and every finished job has acard. Older jobs are returned as stored. - Map tiles are warped to Web Mercator, and multi-band rasters render in true colour by default.
- The v0.5 routes (
/chat,/dashboard,/map,/jobs,/jobs/:jobId,/data,/models,/settings) redirect to the new screens under/app. CITATION.cffand the README give the licence asAGPL-3.0-or-later(version 3 or any later version), aspyproject.tomldoes.- From this release on,
release/vX.Y.Zis merged intodev, anddevintomaster, with merge commits, never squashed, somasterkeeps every commit with its author. The detailed v0.5.x history stays on therelease/v0.5.0andrelease/v0.5.1branches.
Removed
- The v0.5 pages: Chat, the Dashboard page, the Jobs page with its job details, the Data page and the Models page. The Workspace takes over chat and the dashboard, the Library jobs and data, and Result detail the job details. Capabilities shows each model's state, and operators pre-download models in Settings → Models.
Fixed
- Tiles of areas outside a raster are transparent.
- The map panels no longer overlap (#67, bug 4).
- The map credits the oblast boundaries in its attribution control ("Oblast boundaries: OCHA / HDX, CC BY-IGO 3.0"), as their licence requires, and
THIRD_PARTY_LICENSES.mdgives their source and licence.
Security
- Jobs, events, statistics, deletes, downloads, tiles and files of another owner answer 404. Jobs and uploads from before v0.6.0 have no owner and are visible to operators only.
- Attachments on
POST /v1/jobsandPOST /v1/chatmust be the caller's own upload, sample copy or job output, or a file that belongs to no one, such as an Earth Engine export. A path outside the server's roots answers 403, and a missing file or another owner's 404, before the guest quota counts the request. - A guest's sixth analysis in an hour (
POST /v1/jobs, counted at confirm for proposals, andPOST /v1/execute) answers 429GUEST_QUOTA. - Model download, cancel and delete need a member or an operator (403
MODEL_GATED). On the demo, only operators download.
Upgrading from 0.5.1
- Local installs now start everyone as a guest. On a single-user machine, set
DEV_ROLE=operator(ormember), configure GitHub sign-in with yourself inOPERATOR_EMAILS, or raiseGUEST_ANALYSES_PER_HOURandGUEST_SESSION_HOURS. - Set
SESSION_SECRET, or every session resets when the server restarts. Behind HTTPS, setSESSION_COOKIE_SECURE=true. - Existing jobs and uploads are kept, without an owner: operators see them, and the guest cleanup never removes them. The job database migrates itself on start.
- The new variables are all in
.env.example, with comments. - Settings changes go to
resources/.cache/settings.json(DT4LC_SETTINGS_PATH) and take precedence over.env, so back the file up with the job database. - Docker: rebuild both images (
docker compose up -d --build), and rundocker compose downbefore switching between the default and the demo stack.
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc/backend:0.6.0
docker pull ghcr.io/ipt-mmda/dt4lc/frontend:0.6.0Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.6.0 https://github.com/IPT-MMDA/dt4lc.git
cd dt4lc
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsv0.6.0-alpha.1
Compare: v0.5.1...v0.6.0-alpha.1
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc-project/backend:0.5.1
docker pull ghcr.io/ipt-mmda/dt4lc-project/frontend:0.5.1Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.6.0-alpha.1 https://github.com/IPT-MMDA/DT4LC-project.git
cd DT4LC-project
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsChanges
- Merge story/p1-policy-bypasses: model download/cancel/delete gated by role, /v1/execute counts the guest quota (9d47668)
- Count /v1/execute against the guest quota; refuse composed plans (c77b7f7)
- Gate model download, cancel and delete by role (6bb7625)
- Merge story/p2-card-polish: result cards show the bare maps with server-styled legends (Refs #19, #25) (619eb34)
- Accept any running count within the fake LLM's hold in workspace-running (d096a19)
- Check the bare card image and the docked map's ramp in the Workspace flows (2079d87)
- Show the bare maps on result cards, with legends in the server's colours (8d946ae)
- Regenerate the job fixtures with bare map refs, styles and class colours (4c32135)
- Merge story/p2-render-polish: styled RGBA tiles, bare map PNGs, class legends (Refs #19) (9086a37)
- Draw tiles in the raster's style as RGBA, transparent off the raster (d699af4)
- Give LULC and snow classes a legend: colour, percent and area (e01d1bb)
- Tag result rasters with their colours and write bare map PNGs (a8fa4e9)
- Merge story/p2-states: guest/member/offline badge and quota line, gated model sentence, conversation retention (Refs #25) (05c0bfe)
- Add E2E flows for the conversation list, the guest quota and a mid-run reload (Refs #25) (d147df1)
- Keep conversations as the session says; rename and delete them in the list (47532b1)
- Delete chat and job helpers the Workspace made dead (78abe89)
- Render a gated or missing model as one assistant sentence with fixes (8c0488b)
- Show the session badge per role and the guest quota line (cc44eed)
- Merge story/p2-result-cards: result cards per artifact kind, docked-map result layers (Refs #19, #25) (26fbb63)
- Add the result card E2E flow and re-shoot composed done (Refs #25) (2d9b1c8)
- List result layers in the docked map and enable Fit to result (Refs #19) (f319dce)
- Render the result card per artifact kind, replacing ResultSlot (Refs #19) (f444e25)
- Pick the result card from a job's artifacts, with real job fixtures (3a4578a)
- Add result layers and fit requests to the map store (Refs #19) (01d0198)
- Merge story/p2-analysis: the analysis message driven by the job event stream (Refs #25) (9d29f96)
- Add the analysis message E2E flows and the e2e:workspace groups (Refs #25) (b9fbe39)
- Render the analysis message from its events, replacing AnalysisPlaceholder (706db5b)
- Add the analysis reducer and the job event subscription (d255229)
- Add a fake HuggingFace Hub and per-rule delay_ms to the E2E harness (Refs #25) (f61da89)
- Merge story/p2-messages: markdown replies, file and region chips, composer and empty state over POST /v1/chat (Refs #18, #22, #25) (f403dfa)
- Cover the + upload and the drop zone in the composer flow (Refs #25) (7719e1c)
- Add the Workspace message and composer E2E flows (Refs #25) (a56dac5)
- Add the composer and the Workspace empty state (a69b3bb)
- Add the message components: markdown replies, file and region chips (93ad013)
- Send Workspace messages through POST /v1/chat (31f7c75)
- Add a fetch-based SSE parser and the POST /v1/chat stream client (ba64a56)
- Keep pending, the chat region and file metadata on conversations (07464be)
- Add react-markdown 10.1.0 and remark-gfm 4.0.1 for assistant replies (fb13275)
- Merge story/p2-shell: Workspace shell, v0.6.0 routes, dead pages deleted, map colours from tokens (5b120b1)
- Add the Workspace empty-state E2E flows (Refs #25) (3cede1a)
- Start the docked map's attribution collapsed (50a294b)
- Delete the pages and components the v0.6.0 IA makes dead (1275250)
- Add the Workspace shell and the v0.6.0 routes (e9aa86d)
- Add session, sample and health helpers for the Workspace (04f8509)
- Paint map regions, drawing and boundaries from the design tokens (QA D2) (fbb96cc)
- Default the API base to the same origin and use the DT favicon (153a118)
- Merge story/p1-routing-fixes: change only when asked, single-image on the later file, model triggers tightened, explanatory questions stay conversational (8cb1ccb)
- Answer explanatory questions even with files attached (283425c)
- Route every prompt the Workspace sends in one table test (419beeb)
- Run Prithvi and Delineate only for their own phrases (05ca103)
- Compare two attachments only when the prompt asks for change (60db40c)
- Rank trigger matches by the term the user wants (8c4126e)
- Match -ed and -ing endings of trigger words (4823ff5)
- Merge story/p1-api-docs: document the v0.6.0 API contracts (Refs #25, #11, #22, #18) (66f3185)
- docs: document role, quota and cache isolation in the E2E README (bff1c25)
- docs: fix stale /v1/chat, capabilities and health statements (bbf0306)
- docs: list the new endpoints, E2E smoke run and session settings in README (3312e03)
- docs: document the v0.6.0 API contracts in API.md (a5866d9)
- Merge story/p2-backend-support: POST /v1/sample, km² cover areas in change results, follow-up prompts (26eaeb9)
- Add follow-up prompts to done events and job results (528120e)
- Take the change threshold from a named-index prompt (4a77e6b)
- Attach the bundled Kakhovka sample with POST /v1/sample (db223cd)
- Report areas_km2 and water/vegetation cover areas in change results (9d90c26)
- Merge story/p1-conversation: /v1/chat answers in markdown without jobs; pending intent resumes on an attachment (3fb150f)
- Answer conversation through POST /v1/chat without creating a job (ca02a75)
- Use whole registry descriptions in the capability catalog, as a markdown list (108dd8a)
- Merge story/p1-region: region jobs with Earth Engine fetch steps, EE_NOT_CONFIGURED without credentials (Refs #22, Refs #18) (d023975)
- Accept a region on POST /v1/jobs; fail it with EE_NOT_CONFIGURED without credentials (02f570c)
- Add Earth Engine fetch steps for regions sent from the map (62ec39a)
- Merge story/p1-proposal: composed plans stop at a proposal, confirm runs them; B7 refusal; whole-word template matching (38944e3)
- Classify a prompt naming a composable index as an analysis (16101e5)
- Stop composed plans at a proposal and run them on POST /v1/jobs/{id}/confirm (eee242c)
- Compose named indices as proposals; refuse missing bands and plans without analysis (3162f71)
- Match template keywords and triggers as whole words; never template band math (99459b4)
- Merge story/p1-capabilities: tiered capabilities document from the registry and server state (Refs #11) (8de4795)
- Serve the tiered capabilities document from GET /v1/capabilities (31d8a4b)
- Add ui: blocks to the registry for the Capabilities page (2bb10d9)
- Merge story/p1-model-prep: Preparing model step with download progress, MODEL_GATED for guests (5786fd9)
- Emit a Preparing model step for members and refuse guests with MODEL_GATED (4dd9143)
- Check model input bands first, prepare missing weights as a step, keep ModelNotInstalledError (20a1e6f)
- Add a blocking ModelManager.download with byte progress, and model_states() (4d32ea0)
- Merge story/p1-sessions: guest session cookie, owners, roles and the hourly guest quota (8758475)
- Run E2E flows as guests with a 1000-analysis limit (330bba0)
- Add guest sessions, job and upload owners, and the hourly guest quota (14ea3f1)
- Merge story/p1-job-events: SSE job event stream with persisted log, replay and cancel (ef451e6)
- Stream job events over SSE at GET /v1/jobs/{id}/events (c7e2bb5)
- Record a persisted event log on every job (3536f2f)
- Merge story/p1-band-math: algorithms/band-math with an AST-checked formula (8ce96a9)
- Let the LLM planner emit band-math steps with a config (f79562a)
- Reject unsafe band-math formulas in plan validation (8ee7bfe)
- Add band-math algorithm with an AST-checked formula (05ef828)
- Merge story/p1-upload-metadata: raster metadata line from POST /v1/upload (4e0568c)
- Merge story/p1-health-assistant: assistant status in /v1/health (2196aae)
- Merge story/p1-cache-paths: env overrides for cache, temp and outputs paths (Refs #25) (cffc1d0)
- Return raster metadata from POST /v1/upload (518635d)
- Report assistant status in /v1/health (2a4c303)
- Point the E2E API cache, temp and outputs dirs at its temp state dir (e65da04)
- Add DT4LC_CACHE_PATH, DT4LC_TEMP_PATH and DT4LC_OUTPUTS_PATH overrides (985fc6f)
- Merge story/p0-chat-store: one chat store with conversations, 24 h retention and a real context counter (6beea27)
- Test that useJobSync settles analyses in every conversation (5429c47)
- Merge chat state into one store with conversations and analysis messages (361e327)
- Merge story/p0-e2e: Playwright E2E harness with smoke flow (Refs #25) (ab157a2)
- Document the E2E harness (2bc7679)
- Run the E2E smoke flow in CI and upload its output (7510f81)
- Add the E2E runner, flow helper and smoke flow (81f4575)
- Add a scripted fake Ollama server for E2E_LLM=fake (1d8b963)
- Resolve chrome-headless-shell from the cache and add the libroot helper (f2c1335)
- Add playwright-core 1.64.1 as a pinned dev dependency (14b872f)
- Merge story/p0-brand: public/brand with MMDA, UNIGE and the DT monogram (d0719d8)
- Merge story/p0-tokens: design tokens, self-hosted fonts, template SVGs removed (26601b6)
- Add public/brand with the MMDA and UNIGE logos ...
v0.5.1
Compare: v0.5.0...v0.5.1
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc-project/backend:0.5.1
docker pull ghcr.io/ipt-mmda/dt4lc-project/frontend:0.5.1Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.5.1 https://github.com/IPT-MMDA/DT4LC-project.git
cd DT4LC-project
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsChanges
v0.5.0
Compare: v0.4.0...v0.5.0
Container Images
Both images are published to GitHub Container Registry. Pull with:
docker pull ghcr.io/ipt-mmda/dt4lc-project/backend:0.5.0
docker pull ghcr.io/ipt-mmda/dt4lc-project/frontend:0.5.0Run with Docker Compose
The compose file builds the images from source:
git clone --branch v0.5.0 https://github.com/IPT-MMDA/DT4LC-project.git
cd DT4LC-project
cp .env.example .env # API keys are optional; without them the bundled Ollama model is used
docker compose --profile ollama up -d # UI at http://localhost, API docs at http://localhost/docsChanges
v0.2.0-alpha.3
v0.2.0-alpha.2
v0.2.0-alpha.1
Summary
Complete rewrite of the DT4LC (Digital Twin for Land Cover) framework, transforming it from a Streamlit-based prototype into a production-ready cognitive digital twin platform with a modern React frontend, FastAPI backend, and LLM-powered orchestration engine.
Highlights
- Complete architecture redesign with Context Orchestration Engine (COE)
- Modern React + TypeScript frontend replacing Streamlit UI
- Multi-provider LLM support (Gemini, Groq, Ollama, Apertus) with automatic fallback
- Comprehensive test suite with 107+ tests
- Docker-based deployment with full orchestration
- CI/CD pipeline with linting, type checking, and automated testing
New Features
Context Orchestration Engine (COE)
- Intent Classifier: Smart routing between pipeline execution and conversational responses
- Context Agent: Extracts structured understanding from natural language requests
- Planner: Hybrid template/LLM-based pipeline generation
- Plan Validator: Validates execution plans against registry constraints
Multi-Provider LLM Support
- Gemini: Google's fast cloud LLM (gemini-2.0-flash, gemini-2.5-flash, gemini-2.5-pro)
- Groq: Ultra-fast inference (300+ tokens/sec)
- Ollama: Local LLM support (llama3.2, mistral)
- Apertus: Swiss AI's multilingual model for GPU deployments
- Automatic fallback chain with configurable priority
Algorithm Registry
- NDVI Analysis: Vegetation health index calculation
- Statistics: Comprehensive raster statistics
- Change Detection: Before/after comparison with multiple methods
Model Integration
- Prithvi: NASA/IBM foundation model for geospatial reconstruction
- Delineate-Anything: Agricultural field boundary detection
- Generic preprocessor system for model-specific data preparation
Modern Frontend (React + TypeScript)
- Chat-based interface with file upload support
- Real-time job status tracking
- Interactive result visualization (maps, charts, statistics)
- Model management dashboard
- Responsive design with Tailwind CSS
Production Infrastructure
- FastAPI backend with async job queue
- Docker Compose orchestration (frontend, backend, Ollama)
- Nginx reverse proxy configuration
- Health checks and metrics endpoints
Breaking Changes
- Complete rewrite - not backwards compatible with previous Streamlit version
- New API endpoints (
/v1/chat,/v1/jobs,/v1/upload) - Configuration via
.envfile instead of Streamlit secrets
Technical Details
New Directories
dta/ # Digital Twin Application
├── dti/ # Digital Twin Instance
│ ├── coe/ # Context Orchestration Engine
│ │ └── llm/ # LLM providers
│ ├── algorithms/ # NDVI, Statistics, Change Detection
│ ├── models/ # Prithvi, Delineate-Anything
│ └── preprocessors/ # Data preprocessing
server/ # FastAPI backend
cognitive_ui/ # React frontend (rewritten)
tests/ # Comprehensive test suite
docs/ # Architecture & API documentation
v0.4.0
Compare: v0.1.0...v0.4.0
This is the version submitted to JOSS (review openjournals/joss-reviews#11334).
Container images
docker pull ghcr.io/ipt-mmda/dt4lc-project/backend:0.4.0
docker pull ghcr.io/ipt-mmda/dt4lc-project/frontend:0.4.0Run from source
git clone --branch v0.4.0 https://github.com/IPT-MMDA/DT4LC-project.git
cd DT4LC-project
cp .env.example .env # add API keys (optional)
docker compose up -d # backend on :8000, frontend on :80The attached dt4lc-deploy-0.4.0.zip holds only docker-compose.yml, .env.example, README.md and LICENSE. Its compose file builds the images from source, so use the clone above.
Known issues (will be fixed in v0.5.0)
- Without API keys the Docker setup cannot use the bundled Ollama model:
.env.exampleoverrides the Ollama URL and the Ollama healthcheck fails. Reported in the JOSS review as finding 4. - The JOSS reviewers' issues #59–#65 are addressed in v0.5.0.