{"id":43916826,"url":"https://github.com/zooniverse/front-end-monorepo","last_synced_at":"2026-02-06T21:34:48.009Z","repository":{"id":37251509,"uuid":"129710921","full_name":"zooniverse/front-end-monorepo","owner":"zooniverse","description":"A rebuild of the front-end for zooniverse.org","archived":false,"fork":false,"pushed_at":"2026-01-30T23:19:05.000Z","size":57402,"stargazers_count":109,"open_issues_count":256,"forks_count":28,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-01-31T11:37:41.067Z","etag":null,"topics":["hacktoberfest","zooniverse"],"latest_commit_sha":null,"homepage":"https://www.zooniverse.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zooniverse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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":"2018-04-16T08:34:38.000Z","updated_at":"2026-01-30T23:19:09.000Z","dependencies_parsed_at":"2023-10-13T12:12:26.316Z","dependency_job_id":"2d8d9a3e-8adf-4dcd-9e7f-90169990e2e3","html_url":"https://github.com/zooniverse/front-end-monorepo","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/zooniverse/front-end-monorepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Ffront-end-monorepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Ffront-end-monorepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Ffront-end-monorepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Ffront-end-monorepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zooniverse","download_url":"https://codeload.github.com/zooniverse/front-end-monorepo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Ffront-end-monorepo/sbom","scorecard":{"id":44520,"data":{"date":"2025-07-07","repo":{"name":"github.com/zooniverse/front-end-monorepo","commit":"8eaeac2ecf9406e257b8037226dc42b926f1678d"},"scorecard":{"version":"v5.2.1-18-gbb9c347d","commit":"bb9c347dff6349d986baab6578a46d68a5524c62"},"score":5.7,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#maintained"}},{"name":"Code-Review","score":9,"reason":"Found 29/30 approved changesets -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:27","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Warn: no topLevel permission defined: .github/workflows/ci-build.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/coverage.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy_branch.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy_production.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy_staging.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy_storybook.yml:1","Warn: no topLevel permission defined: .github/workflows/label_approved.yml:1","Warn: no topLevel permission defined: .github/workflows/sentry-production-releases.yml:1","Warn: no topLevel permission defined: .github/workflows/sentry-staging-releases.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#binary-artifacts"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-build.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/ci-build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/coverage.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/coverage.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/coverage.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/coverage.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/coverage.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_branch.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_branch.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_production.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_production.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_staging.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_staging.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_storybook.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_storybook.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_storybook.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/deploy_storybook.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/label_approved.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/label_approved.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sentry-production-releases.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/sentry-production-releases.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sentry-production-releases.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/sentry-production-releases.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sentry-staging-releases.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/sentry-staging-releases.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sentry-staging-releases.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/front-end-monorepo/sentry-staging-releases.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:58","Info:   0 out of  19 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  24 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#fuzzing"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/deploy_branch.yml:16"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#packaging"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-36jr-mh4h-2g58","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-j9fq-vwqv-2fm2","Warn: Project is vulnerable to: GHSA-pqw5-jmp5-px4v","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-14T22:24:03.960Z","repository_id":37251509,"created_at":"2025-08-14T22:24:03.961Z","updated_at":"2025-08-14T22:24:03.961Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29177554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T20:14:21.878Z","status":"ssl_error","status_checked_at":"2026-02-06T20:14:21.443Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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"}},"keywords":["hacktoberfest","zooniverse"],"created_at":"2026-02-06T21:34:47.954Z","updated_at":"2026-02-06T21:34:48.003Z","avatar_url":"https://github.com/zooniverse.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Zooniverse Front-End Monorepo\n\n[![Licensed under Apache 2.0](https://img.shields.io/github/license/zooniverse/front-end-monorepo.svg)](https://github.com/zooniverse/front-end-monorepo/blob/main/LICENSE.md)\n![Contributors](https://img.shields.io/github/contributors/zooniverse/front-end-monorepo.svg)\n\n---\n\n**Table of Contents**\n\n- [Requirements](#requirements)\n- [Monowhat?](#monowhat)\n- [Getting started](#getting-started)\n- [Helpful Guides](#helpful-guides)\n- [Packages](#packages)\n- [Helpers](#helpers)\n- [Conventions](#conventions)\n - [NPM](#npm)\n - [Packages directory](#packages-directory)\n- [Deployment](#deployment)\n- [License](#license)\n\n## Requirements\n\n- [Browser support](docs/arch/adr-4.md)\n- Node 22\n- Git\n- pnpm\n\nNode, git, and pnpm can be installed through [homebrew](https://brew.sh/) on MacOS. If you need to support more than one version of node at the same time, you can consider installing it though [nvm](https://github.com/nvm-sh/nvm) instead of homebrew\n\n## Monowhat?\n\nThis monorepo is managed with pnpm Workspaces\n\nWorkspaces allow us to maintain package modularity for javascript projects that have interdependency. Organizationally, they allows us to track issues, pull requests, and progress for all related packages in one place.\n\n## Getting started\n\n### Debugging the production release\n\nMake sure you have pulled the latest production version.\n\n```sh\ngit pull --tags -f\n```\n\nCheck out the latest production release.\n\n```sh\ngit checkout production-release\n```\n\nRun the bootstrap script to build all the libraries and apps. You can use `bootstrap:es6` here for a faster build if you don't want to run the tests.\n\n```sh\npnpm bootstrap\n```\n\n### Docker\n\nYou can run the code locally in Docker, which avoids needing to install Node or pnpm.\n\n```sh\ngit clone git@github.com:zooniverse/front-end-monorepo.git\ncd front-end-monorepo\n# build first\ndocker compose build\n# run all services in the background (no authentication available)\n# app-project at http://localhost:3002/projects/[owner]/[project-name]\n# app-root at http://localhost:3003\ndocker compose up -d\n# shut down the running containers when you're finished\ndocker compose down\n```\n\nYou can supply a service name (from `docker-compose.yml`) to `docker compose` if you only want to run a single service eg.\n```sh\n# only build the project app\ndocker compose build fe-project\n# only run the project app\ndocker compose up -d fe-project\n```\n\nDevelopment environments for individual packages can be run from the package directories. See the READMEs in individual packages for detailed instructions. For example:\n\n```sh\ncd packages/app-project\ndocker compose build\ndocker compose up -d\ndocker compose down\n```\n\nTip: If you're an occasional Docker Desktop user, remember to `docker image prune` or `docker system prune`.\n\n### With Node and pnpm\n\nAlternatively, you can install Node and pnpm and build the monorepo packages.\n\n```sh\ngit clone git@github.com:zooniverse/front-end-monorepo.git\ncd front-end-monorepo\npnpm bootstrap\n```\n\nThe `bootstrap` script will install the dependencies and build any local packages used as dependencies.\n\n## Packages\n\nSee each package's folder for more specific documentation.\n\n| package name | folder | description |\n|---|---|---|\n| **@zooniverse/async-states** | `packages/lib-async-states` | Frozen object of async states to use in data stores |\n| **@zooniverse/classifier** | `packages/lib-classifier` | Classifier view components and state which can be exported modularly or altogether as a working classifier |\n| **@zooniverse/fe-project** | `packages/app-project` | Server-side rendered application for a project (anything at `/projects/owner/display_name`) |\n| **@zooniverse/grommet-theme** | `packages/lib-grommet-theme` | The style definitions for a Zooniverse theme to use with Grommet |\n| **@zooniverse/panoptes-js** | `packages/lib-panoptes-js` | Panoptes API javascript client. Functional HTTP request helpers built on top of superagent |\n| **@zooniverse/react-components** | `packages/lib-react-components` | A set of Zooniverse-specific React components, built using Grommet |\n\n## Conventions\n\n### NPM\n\nAll packages built from this monorepo should be _scoped_ to `zooniverse`, e.g. `grommet-theme` becomes `@zooniverse/grommet-theme`.\n\n### `packages` directory\n\nLibraries for publishing to NPM should have their directory names prefixed with `lib-`, e.g. `/grommet-theme` becomes `/lib-grommet-theme`.\n\nApps should have their directory names prefixed with `app-`, e.g. `/project` becomes `/app-project`.\n\n## Deployment\n\nDeploys to production and staging are handled by [Jenkins](https://jenkins.zooniverse.org/job/Zooniverse%20GitHub/job/front-end-monorepo/) using [Docker images](#docker-images).\n\nDeployments to a staging Kubernetes instance that uses Panoptes production are triggered by merges to `main`. This is used for manual end-to-end behavior testing for new code and design reviews. `https://frontend.preview.zooniverse.org/projects/:project-owner/:project-name/` proxy redirects to the new NextJS app while the rest of sub-domain redirects to PFE. Staging projects can be loaded by adding this query param to the URL: `?env=staging`.\n\nDeployments to a production Kubernetes instance are triggered by committing a `production-release` git tag on `main`. This can either be done using the git CLI or using the lita deploy command on slack. `https://www.zooniverse.org/projects/:project-owner/:project-name/classify` proxy redirects to the new NextJS app while the rest of the domain redirects to PFE. Currently the only project that is configured to do this is Planet Hunters TESS. Eventually more projects will migrate when they migrate to the new classifier.\n\nMore information is available in [ADR 12](docs/arch/adr-12.md) and [ADR 17](docs/arch/adr-17.md)\n\n### Deploying Storybook\n\nFEM's storybook can be viewed at [https://zooniverse.github.io/front-end-monorepo/](https://zooniverse.github.io/front-end-monorepo/).\n\nTo deploy the latest version FEM's storybook, make sure you have pulled the latest production version and run `pnpm bootstrap` then `pnpm deploy-storybook`.\n\n### Environment variables\n\n- `PANOPTES_ENV`: sets which Panoptes API endpoint to use.\n  - `production` will use `https://www.zooniverse.org/api`\n  - `staging` will use `https://panoptes-staging.zooniverse.org/api`.\n\nThe pnpm build scripts default to production for libraries if `PANOPTES_ENV` is not specified. The apps are always built to the production API.\n- `NODE_ENV`: the [webpack build mode](https://webpack.js.org/configuration/mode/) for libraries and the NextJS apps (production, development or undefined.)\n- `APP_ENV`: the deployment environment, logged as the [Sentry environment](https://docs.sentry.io/product/sentry-basics/environments/) with errors:\n  - `development`: local development on `localhost` or `local.zooniverse.org`.\n  - `branch`: PR branch deploys on `fe-project-branch.preview.zooniverse.org`.\n  - `staging`: staging on `frontend.preview.zooniverse.org`.\n  - `production`: the Zooniverse web site, `www.zooniverse.org`.\n- `CONTENTFUL_ACCESS_TOKEN`: access token for the Contentful API. Should be kept secret.\n- `CONTENTFUL_SPACE_ID`: space ID for Zooniverse About pages in Contentful. Should be kept secret.\n- `NEWRELIC_LICENSE_KEY`:  License key for New Relic logging. Should be kept secret.\n- `COMMIT_ID`: the latest git commit hash. Used for versioning Sentry releases and recorded in classification metadata.\n\n### Docker images\n\n- `zooniverse/front-end-monorepo-staging`: Built from the Dockerfile in the root directory. It runs `pnpm install` and builds all the libraries and apps from the latest main branch commit.\n- `zooniverse/front-end-monorepo-production`: Built from the Dockerfile in the root directory. It runs `pnpm install` and builds all the libraries and apps from the `production_release` tag.\n\n### Publishing\nWhen publishing an individual package to [npm](https://www.npmjs.com/), first cd into the repo you would like to deploy (within the packages folder), then:\n1. Update changelog and commit\n1. `pnpm version --major|--minor|--patch --no-git-tag-version` (use the desired semvar here)\n1. Update other packages to reference the newly updated package version\n    - Ex: If updating lib-react-components to 1.0.0 from 0.7.2\n    - lib-classifier should point to the new 1.0.0 version of lib-react-components\n1. `git push origin name-of-branch`\n1. Merge branch\n1. Checkout `main`, pull for latest\n1. Build the package with `pnpm build` from the package dir, where available\n1. Publish using `npm`:\n    - Sanity check: if you're using `nvm` (Node Version Manager), make sure you've switched to the latest version of node/npm\n    - Check that you're publishing the correct version by running `npm publish --dry-run` from the package dir\n    - When you're happy, run `npm publish` from the package dir\n    - You can optionally login to npm prior to this using `npm login` and store an auth token in a `.npmrc` file\n\n---\n\n## License\n\nCopyright 2018 Zooniverse\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzooniverse%2Ffront-end-monorepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzooniverse%2Ffront-end-monorepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzooniverse%2Ffront-end-monorepo/lists"}