{"id":317515,"name":"BioDT","description":"Prototype Digital Twins to help protect and restore biodiversity.","url":"https://github.com/biodt/biodt-shiny","last_synced_at":"2026-05-27T08:30:20.505Z","repository":{"id":240221097,"uuid":"611241693","full_name":"BioDT/biodt-shiny","owner":"BioDT","description":"This repository contains a shiny application which is intended as the simplest way of interacting with BioDT by end-users.","archived":false,"fork":false,"pushed_at":"2026-04-28T14:25:57.000Z","size":291424,"stargazers_count":9,"open_issues_count":17,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-05T22:03:23.262Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BioDT.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-03-08T12:23:27.000Z","updated_at":"2026-04-28T07:50:34.000Z","dependencies_parsed_at":"2024-05-20T09:42:10.171Z","dependency_job_id":"b200f203-7b2a-4e99-a4f1-16adafa51dd5","html_url":"https://github.com/BioDT/biodt-shiny","commit_stats":null,"previous_names":["biodt/biodt-shiny"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/BioDT/biodt-shiny","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioDT%2Fbiodt-shiny","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioDT%2Fbiodt-shiny/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioDT%2Fbiodt-shiny/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioDT%2Fbiodt-shiny/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BioDT","download_url":"https://codeload.github.com/BioDT/biodt-shiny/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioDT%2Fbiodt-shiny/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33007321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"BioDT","name":"BioDT","uuid":"106523593","kind":"organization","description":"Horizon EU Biodiversity Digital Twin","email":null,"website":"https://biodt.eu","location":null,"twitter":"BiodiversityDT","company":null,"icon_url":"https://avatars.githubusercontent.com/u/106523593?v=4","repositories_count":1,"last_synced_at":"2023-05-11T09:29:08.647Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/BioDT","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-05-11T09:29:08.653Z","updated_at":"2023-05-11T09:29:08.653Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BioDT","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BioDT/repositories"},"packages":[],"commits":{"id":10127871,"full_name":"biodt/biodt-shiny","default_branch":"main","total_commits":995,"total_committers":10,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":99.5,"dds":0.6391959798994975,"past_year_total_commits":166,"past_year_total_committers":6,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":27.666666666666668,"past_year_dds":0.6144578313253012,"last_synced_at":"2026-05-24T07:02:19.786Z","last_synced_commit":"14f5be960bac879cfd80019244867a72d9eb2231","created_at":"2025-05-30T00:12:58.949Z","updated_at":"2026-05-24T07:01:41.145Z","committers":[{"name":"Tomas Martinovic","email":"tomas.martinovic@vsb.cz","login":"Nithador","count":359},{"name":"Ondřej Salamon","email":"ondrej.salamon@vsb.cz","login":"osalamon","count":334},{"name":"Zhenggang Gao","email":"zga@kth.se","login":"artyinfact","count":81},{"name":"Kata Sara-aho","email":"kata.sara-aho@csc.fi","login":"csckata","count":81},{"name":"Radek Halfar","email":"hal0068@vsb.cz","login":null,"count":43},{"name":"Simon Rolph","email":"simrol@ceh.ac.uk","login":"simonrolph","count":37},{"name":"Souza Allan","email":"allansou@lx2-870-27966.ad.helsinki.fi","login":null,"count":21},{"name":"Tuomas Rossi","email":"tuomas.rossi@csc.fi","login":"trossi","count":17},{"name":"DylanCarbone","email":"dylcar@ceh.ac.uk","login":"DylanCarbone","count":11},{"name":"julio.paneque","email":"julio.paneque@lifewatch.eu","login":null,"count":11}],"past_year_committers":[{"name":"nithador","email":"tomas.martinovic@vsb.cz","login":"Nithador","count":64},{"name":"osalamon","email":"ondrej.salamon@vsb.cz","login":"osalamon","count":57},{"name":"Radek Halfar","email":"hal0068@vsb.cz","login":null,"count":29},{"name":"Zhenggang Gao","email":"zga@kth.se","login":"artyinfact","count":8},{"name":"julio.paneque","email":"julio.paneque@lifewatch.eu","login":null,"count":7},{"name":"Kata Sara-aho","email":"kata.sara-aho@csc.fi","login":"csckata","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/biodt%2Fbiodt-shiny/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-26T00:00:10.885Z","repositories_count":6242128,"commits_count":883143487,"contributors_count":34922287,"owners_count":1157677,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"biodt/biodt-shiny","html_url":"https://github.com/biodt/biodt-shiny","last_synced_at":"2026-05-16T03:02:10.618Z","status":"error","issues_count":78,"pull_requests_count":115,"avg_time_to_close_issue":3619004.0222222223,"avg_time_to_close_pull_request":203419.1320754717,"issues_closed_count":45,"pull_requests_closed_count":106,"pull_request_authors_count":7,"issue_authors_count":6,"avg_comments_per_issue":0.7051282051282052,"avg_comments_per_pull_request":0.16521739130434782,"merged_pull_requests_count":102,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":31,"past_year_pull_requests_count":78,"past_year_avg_time_to_close_issue":2182557.6923076925,"past_year_avg_time_to_close_pull_request":214646.49315068492,"past_year_issues_closed_count":13,"past_year_pull_requests_closed_count":73,"past_year_pull_request_authors_count":5,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":0.5161290322580645,"past_year_avg_comments_per_pull_request":0.0641025641025641,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":70,"created_at":"2025-05-30T00:13:08.861Z","updated_at":"2026-05-16T03:02:10.618Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/biodt%2Fbiodt-shiny","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/biodt%2Fbiodt-shiny/issues","issue_labels_count":{"Cultural Ecosystem Services":16,"enhancement":14,"design":10,"Grassland":6,"accessibility":5,"bug":4,"Honeybee":4,"Wild Boar Diseases":1,"documentation":1,"tests":1,"honeybee":1,"priority3":1,"invalid":1,"feature":1},"pull_request_labels_count":{"feature":1,"Grassland":1},"issue_author_associations_count":{"COLLABORATOR":77,"NONE":1},"pull_request_author_associations_count":{"COLLABORATOR":115},"issue_authors":{"Nithador":39,"csckata":18,"simonrolph":8,"osalamon":7,"DylanCarbone":5,"sharifX":1},"pull_request_authors":{"osalamon":48,"artyinfact":35,"DylanCarbone":10,"Nithador":9,"JulioLP":7,"trossi":4,"simonrolph":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-24T00:00:44.577Z","repositories_count":14684301,"issues_count":34045147,"pull_requests_count":111452032,"authors_count":11272524,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"COLLABORATOR":1},"past_year_pull_request_author_associations_count":{"COLLABORATOR":6},"past_year_issue_authors":{"simonrolph":1},"past_year_pull_request_authors":{"osalamon":3,"artyinfact":2,"JulioLP":1},"maintainers":[{"login":"osalamon","count":55,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/osalamon"},{"login":"Nithador","count":48,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/Nithador"},{"login":"artyinfact","count":35,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/artyinfact"},{"login":"csckata","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/csckata"},{"login":"DylanCarbone","count":15,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/DylanCarbone"},{"login":"simonrolph","count":10,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/simonrolph"},{"login":"JulioLP","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/JulioLP"},{"login":"trossi","count":4,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/trossi"}],"active_maintainers":[{"login":"osalamon","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/osalamon"},{"login":"artyinfact","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/artyinfact"},{"login":"JulioLP","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/JulioLP"},{"login":"simonrolph","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/simonrolph"}]},"events":{"total":{"ReleaseEvent":3,"DeleteEvent":29,"MemberEvent":3,"PullRequestEvent":82,"ForkEvent":2,"IssuesEvent":50,"WatchEvent":5,"IssueCommentEvent":50,"PushEvent":391,"PullRequestReviewEvent":3,"CreateEvent":41},"last_year":{"ReleaseEvent":3,"DeleteEvent":19,"PullRequestEvent":5,"IssuesEvent":3,"WatchEvent":3,"IssueCommentEvent":2,"PushEvent":86,"CreateEvent":6}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/rhino-test.yml","sha":null,"kind":"manifest","created_at":"2024-05-17T12:27:01.861Z","updated_at":"2024-05-17T12:27:01.861Z","repository_link":"https://github.com/BioDT/biodt-shiny/blob/main/.github/workflows/rhino-test.yml","dependencies":[{"id":18128141514,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":18128141515,"package_name":"r-lib/actions/setup-r","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":18128141516,"package_name":"r-lib/actions/setup-renv","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":18128141517,"package_name":"actions/setup-node","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":18128141518,"package_name":"cypress-io/github-action","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2024-05-17T12:27:01.933Z","updated_at":"2024-05-17T12:27:01.933Z","repository_link":"https://github.com/BioDT/biodt-shiny/blob/main/Dockerfile","dependencies":[{"id":18128141519,"package_name":"rocker/r-ver","ecosystem":"docker","requirements":"4.3.3","direct":true,"kind":"build","optional":false}]}],"score":5.5606816310155285,"created_at":"2025-05-30T00:12:53.749Z","updated_at":"2026-05-27T08:30:20.510Z","avatar_url":"https://github.com/BioDT.png","language":"R","category":"Biosphere","sub_category":"Ecological and Environmental Modeling","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# BioDT Web Application\n\n## Overview\n\nThis repository contains the codes for the Shiny web application hosted at [app.biodt.eu](https://app.biodt.eu). The Shiny app is intended as the simplest way of interacting with BioDT by end-users. The app uses [Shiny framework](https://shiny.posit.co/) on top of [R language ](https://www.r-project.org/) and is built using power of [development framework Rhino](https://appsilon.github.io/rhino/).\n\n## Quick Start with Docker Compose\n\nThe easiest way to run the BioDT Shiny app is using Docker Compose:\n\n### Prerequisites\n\n* [Docker](https://docs.docker.com/get-docker/)\n* [Docker Compose](https://docs.docker.com/compose/install/)\n\n### Running the app\n\n1. Clone the repository:\n\n```bash\ngit clone git@github.com:BioDT/biodt-shiny.git\ncd biodt-shiny\n```\n\n2. Setup local data (see [section 4](#4-get-local-data) for details on which pDTs require data)\n\n   **Note:** By default, the `docker-compose.yml` expects data in `${PWD}/app/data`. If you place your data in a different location, update the left-hand side of the volume mount in `docker-compose.yml`:\n   \n   ```yaml\n   volumes:\n     - \"/your/custom/path:/app/data\"  # Change /your/custom/path to your data location\n   ```\n\n3. Start the application:\n\n```bash\ndocker compose up\n```\n\n4. Open your browser and navigate to `http://localhost:7860`\n\nTo stop the application, press `Ctrl+C` or run:\n\n```bash\ndocker compose down\n```\n\n**Note:** The Honeybee and Disease Outbreaks pDTs require Docker socket access (`/var/run/docker.sock`) which is already configured in the `docker-compose.yml` file.\n\n## Getting Started (development set up)\n\n### 0. Prerequisites\n\nOn your local computer there have to be downloaded and installed these binaries and frameworks (ie. R packages):\n\n* [Git](https://git-scm.com/downloads)\n* [R language](https://cran.r-project.org/)\n* [Shiny framework](https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/index.html) (see instructions below)\n* [Rhino development framework](https://appsilon.github.io/rhino/#installation) (see instructions below)\n* You might also want to have [Node.js installed](https://nodejs.org/en/download/package-manager) due to utilization [of the state of the art JavaScript and Sass development tools provided by Rhino](https://appsilon.github.io/rhino/articles/tutorial/create-your-first-rhino-app.html#dependencies)\n\n\n### 1. Get the code\n\nClone the repository:\n\n```bash\ngit clone git@github.com:BioDT/biodt-shiny.git\n```\n\nOpen the project directory in your preferred IDE, for example ([RStudio](https://posit.co/download/rstudio-desktop/) or (VS Code)[https://code.visualstudio.com/download]).\n\n### 2. Install required packages\n\nStart by installing [renv](https://rstudio.github.io/renv/) package.\n\n```R\ninstall.packages(\"renv\")\n```\n\nThen install all the dependencies by calling `renv::restore()` command. All the dependencies are stored in the `renv.lock` file.\n\n```R\nrenv::restore()\n```\n\n### 3. Setup local development, or production, environment\n\nWe utilize a [common way for setting up your enviroment](https://appsilon.github.io/rhino/articles/how-to/manage-secrets-and-environments.html). There are two common options depending whether you want to run the app locally for development purposes (`dev`), or in production environment (`prod`), ie. for example dockerized app hosted at [app.biodt.eu](https://app.biodt.eu).\n\nIn the working directory you need to create your own `.Renviron` file which is git ignored. You can easily do it by issuing the following command in your Bash (Zsh, etc) terminal\n\n```\ncp .Renviron.example .Renviron\n```\n\n**Config env variable**\n\nIn the file please config what enviroment you want the app run at. For **development**:\n\n```bash\n(...)\nR_CONFIG_ACTIVE=\"dev\"\n(...)\n```\n\nFor **production** delete the line `R_CONFIG_ACTIVE=\"dev\"` and **uncomment this line** which results in:\n\n```bash\n(...)\nR_CONFIG_ACTIVE=\"prod\"\n(...)\n```\n\nOther environment variables, which aren't secrets (ie. git ignored) and are publicily avaible, can be seen and/or edit in the file `config.yml`. At the time (May 2024) the file contains dummy variables, serving as an example only.\n\n**Config .Rprofile**\n\nWe prefer to use PPM packages where possible and therefore it is advised to use following lines in the `.Rprofile` file in the home directory of the project.\n\n```r\nsource(\"renv/activate.R\")\n\noptions(repos = c(PPM = \"https://packagemanager.posit.co/cran/latest\"))\n```\n\nIn case of Windows and MacOS environment You might want to add one more line after these two:\n\n```r\noptions(pkgType = \"binary\")\n```\n\nNote! **You might probably want to restart (re-open) your R terminal at this moment and restart your R session**.\n\n### 4. Get local data\n\nNot all pDTs require local data, and data is only needed when accessing specific pDT pages. Therefore, you typically don't need to download all data for development.\n\n**pDTs that don't require local data:**\n- Invasive Alien Species (data is embedded)\n- Real-time Bird Monitoring (data is fetched automatically)\n\n**For pDTs that do require local data:**\n\nFirst, you need to create a folder to hold this data. This folder is ignored by git so you need to create it first. You can do this manually or run in R\n\n```\ndir.create(\"app/data\")\n```\n\nIf you need access to data for development, please contact tomas.martinovic@vsb.cz or reach out through LifeWatch ERIC channels.\n\nEach pDT's shiny module has its own folder for local data within this which you can see specified in the `config.yml` file. The folder names are:\n\n - Crop wild relatives: `app/data/cwr`\n - BEEHAVE: `app/data/honeybee`\n - Cultural ecosystem services: `app/data/ces`\n - Disease outbreaks: `app/data/disease_outbreak`\n - Forest biodiversity: `app/data/forest_bird`\n - Grassland dynamics: `app/data/grassland`\n - Real-time bird monitoring: `app/data/rtbm` \n\n### 5. Launch the app\n\nNow you should be ready to launch the app, which you can do using this command in your R terminal.\n\n```R\nshiny::runApp()\n```\n\n### Development\n\nPlease feel free to create a branch and pull requests for making significant changes to the Shiny app.\n\n## Modules\n\nThe app is modularized and each pDT have files in its own subfolder. UI files are located mainly in the `app/view` subfolder, R function mainly in the `app/logic` subfolder. UI files for each pDT is located:\n\n * BEEHAVE: `app/view/honeybee`\n * Cultural Ecosystem Services: `app/view/ces`\n * Crop wild relatives: `app/view/cwr`\n * Disease outbreaks: `app/view/disease_outbreaks`\n * Forest biodiversity: `app/view/forest`\n * GRASSLAND: `app/view/grassland`\n * Invasive alien species: `app/view/ias`\n * RTBM (Real-time Bird Monitoring): `app/view/rtbm`\n\n## Technicals\n\n🎨 We use {bslib} in order to use Bootstrap 5 elements (https://rstudio.github.io/bslib/). The theme is a custom BioDT theme. The css, favicons, backgrounds etc. are located in `inst/app/www`.\n\n✅ Tests are developed using the {testthat} package. Tests are written as `.R` files in `tests/testthat/`.\n\n🌍 Maps are rendered using {leaflet}: https://rstudio.github.io/leaflet/.\n\n### Loading screens with {waiter}\n\nIf you have computations that take a long time then use the implemented waiter functionality. This will not make the app load faster but make it feel faster as it induces patience in your users and make the app feel slicker. To set this up in your module you can use `waiter_text()` function to prepare text message with custom HTML format.\n\n```r\n    msg \u003c- \n      waiter_text(message = tags$h3(\"Computing Beehave simulation...\",\n        style = \"color: #414f2f;\"\n      ))\n```\n\nThen create a waiter object\n\n```r\nw \u003c- Waiter$new(\n      html = msg[[1]],\n      color = \"rgba(256,256,256,0.9)\"\n    )\n``` \n\nYou can then use the following lines within your shiny code:\n\n * `w$show()` to show a loading screen\n * `w$update()` to update message in the middle of computation\n * `w$hide()` to hide a loading screen\n\nSee https://waiter.john-coene.com/ for more info\n\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/317515","html_url":"https://ost.ecosyste.ms/projects/317515"}