{"id":28710321,"url":"https://github.com/Pocket/pocket-monorepo","last_synced_at":"2025-06-14T21:03:14.113Z","repository":{"id":215482602,"uuid":"712597157","full_name":"Pocket/pocket-monorepo","owner":"Pocket","description":"Monorepo of all Pocket App Typescript Backend Sevices","archived":false,"fork":false,"pushed_at":"2025-05-22T18:15:00.000Z","size":25279,"stargazers_count":123,"open_issues_count":7,"forks_count":16,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-05-24T08:05:44.667Z","etag":null,"topics":["monorepo","typescript"],"latest_commit_sha":null,"homepage":"https://getpocket.com","language":"TypeScript","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/Pocket.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-10-31T19:36:56.000Z","updated_at":"2025-05-24T07:17:14.000Z","dependencies_parsed_at":"2024-03-11T15:43:08.405Z","dependency_job_id":"704db786-5c61-4a01-b3f3-f770d873abb5","html_url":"https://github.com/Pocket/pocket-monorepo","commit_stats":{"total_commits":964,"total_committers":8,"mean_commits":120.5,"dds":0.6058091286307055,"last_synced_commit":"7d882faaef4b49f310b25d227ddbd8c5e71f2363"},"previous_names":["pocket/pocket-monorepo"],"tags_count":353,"template":false,"template_full_name":null,"purl":"pkg:github/Pocket/pocket-monorepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pocket%2Fpocket-monorepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pocket%2Fpocket-monorepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pocket%2Fpocket-monorepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pocket%2Fpocket-monorepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Pocket","download_url":"https://codeload.github.com/Pocket/pocket-monorepo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pocket%2Fpocket-monorepo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259884417,"owners_count":22926440,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["monorepo","typescript"],"created_at":"2025-06-14T21:01:28.820Z","updated_at":"2025-06-14T21:03:14.106Z","avatar_url":"https://github.com/Pocket.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Pocket Monorepo\n\nThis repo contains all the Pocket Typescript systems built as a monorepo but deployed as microservices. For services that power Recomendations or Pocket Curated Content see the [Content Monorepo](https://github.com/pocket/content-monorepo)\n\n## What's inside?\n\nThis Repo includes the following packages/servers:\n\n### Folder structure\n\n- `servers`: all our typescript microservices required for running baseline Pocket.\n- `lambdas`: all our lambda listeners that are made up of SQS Queue processers or API Gateways\n- `infrastructure`: all of the terraform infrastructure that is used to deploy each microservice\n- `packages/eslint-config-custom`: `eslint` configurations\n- `packages/tsconfig`: `tsconfig.json`s used throughout the monorepo\n- `packages/apollo-utils`: holds helpers for all services that boot up graphql. It also includes tracing libraries and hoists apollo in node-modules so that we do not have to keep defining apollo in all services.\n- `packages/ts-logger`: helper library to add json structured logging to all our services.\n- `packages/tracing`: helper library to add tracing to all our services.\n- `packags/terraform-modules`: a set of modules built for Pocket based on the Terraform CDK, used to deploy our infrastructure.\n- `.docker/aws-resources`: all aws resources that are used by the monorepo, if something is used here, but owned by a service not in this repository, it resides in the legacy files, otherwise each service will have its own script or prefixed resources.\n- `.docker/mysql-8-resources`: all mysql resources, prefixed with a number letter system so that docker executes database creation in a specific order. All services share a single docker server, but have their own databases unless they read from our legacy (mono) database.\n- `.docker/postgres-resources`: similar to mysql but for services that use postgres.\n\nEach package/app is 100% [TypeScript](https://www.typescriptlang.org/).\n\n### Utilities\n\nThis Turborepo has some additional tools already setup for you:\n\n- [TypeScript](https://www.typescriptlang.org/) for static type checking\n- [ESLint](https://eslint.org/) for code linting\n- [Prettier](https://prettier.io) for code formatting\n\n## Using the Repo\n\nTo build all apps and packages, run the following command:\n\n```bash\ncd pocket-monorepo\npnpm build\n```\n\n### Develop\n\n#### All\n\nTo develop all apps and packages, run the following commands:\n\n```bash\ncd pocket-monorepo\ncp .env.example .env\ndocker compose up --wait\npnpm install\npnpm dev\n```\n\nThis will bring up the docker shared services (MySQL, Memcached, Redis) and then run all the apps in a dev mode.\n\n#### Specific Server\n\nTo run a specific server, run the following:\n\n```bash\ncd pocket-monorepo\ncp .env.example .env\ndocker compose up --wait\npnpm install\npnpm dev --filter=annotations-api...\n```\n\nWhere annotations-api is the server name from package.json you want to run. `...` prefixed informs turborepo to include all dependent workspace packages.\n\nYou can expand this to run multiple specific servers as well like:\n```pnpm run dev --filter=list-api... --filter=feature-flags...```\n\n### Caching\n\nThis repo relies on Turbo repos caching strategies to speed up development and only execute tasks that are needed when certain files change.\n\nMore information can be found on [Turbo repos site](https://turbo.build/repo/docs/core-concepts/caching).\n\nIf you add new build outputs or inputs, you will need to add them to the necessary area in [turbo.json](./turbo.json).\n\nIf for any reason you need to bypass caching you can add `--force` to any command. It would be run like:\n\n```bash\npnpm run test --force\n```\n\nor\n\n```bash\npnpm run test --filter=annocations-api... --force\n```\n\n### Testing\n\n### Updating Packages\n\nTo update packages this repository uses Renovate on a pr by pr basis and you can initiate that [here](https://github.com/Pocket/pocket-monorepo/issues/7)\n\nIn some cases it may be easier to update packages locally, like updating all development depencies at once.\n\nTo select and update *development* dependencices, interactively you can use the following command ran at the root of the repository.\n\n```bash\npnpm update -iDLr\n```\n\nTo select and update *production* and *optional* dependencices, interactively you can use the following command ran at the root of the repository.\n\n```bash\npnpm update -iPLr\n```\n\n### Integration Testing\n\nWhen doing an integration test, if you need aws based resources, the CI is setup to run a `.sh` script that corresponds to the package name you are testing. So if you need aws resources for a package named `annotations-api` you would create a `annoations-api.sh` in `.docker/aws-resources` that created all the necessary aws resources.\n\n## Useful Links\n\nLearn more about the power of Turborepo:\n\n- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks)\n- [Caching](https://turbo.build/repo/docs/core-concepts/caching)\n- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching)\n- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering)\n- [Configuration Options](https://turbo.build/repo/docs/reference/configuration)\n- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference)\n\n## Service CI Status\n\n[![Account Data Deleter](https://github.com/Pocket/pocket-monorepo/actions/workflows/account-data-deleter.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/account-data-deleter.yml)\n[![Account Delete Monitor](https://github.com/Pocket/pocket-monorepo/actions/workflows/account-delete-monitor.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/account-delete-monitor.yml)\n[![Annotations API](https://github.com/Pocket/pocket-monorepo/actions/workflows/annotations-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/annotations-api.yml)\n[![Braze](https://github.com/Pocket/pocket-monorepo/actions/workflows/braze.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/braze.yml)\n[![Client API](https://github.com/Pocket/pocket-monorepo/actions/workflows/client-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/client-api.yml)\n[![Feature Flags](https://github.com/Pocket/pocket-monorepo/actions/workflows/feature-flags.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/feature-flags.yml)\n[![FxA Webhook Proxy](https://github.com/Pocket/pocket-monorepo/actions/workflows/fxa-webhook-proxy.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/fxa-webhook-proxy.yml)\n[![Image API](https://github.com/Pocket/pocket-monorepo/actions/workflows/image-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/image-api.yml)\n[![Instant Sync Events](https://github.com/Pocket/pocket-monorepo/actions/workflows/instant-sync-events.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/instant-sync-events.yml)\n[![List API](https://github.com/Pocket/pocket-monorepo/actions/workflows/list-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/list-api.yml)\n[![Parser GraphQL Wrapper](https://github.com/Pocket/pocket-monorepo/actions/workflows/parser-graphql-wrapper.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/parser-graphql-wrapper.yml)\n[![Pocket Event Bridge](https://github.com/Pocket/pocket-monorepo/actions/workflows/pocket-event-bridge.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/pocket-event-bridge.yml)\n[![Push Server](https://github.com/Pocket/pocket-monorepo/actions/workflows/push-server.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/push-server.yml)\n[![Sendgrid Data](https://github.com/Pocket/pocket-monorepo/actions/workflows/sendgrid-data.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/sendgrid-data.yml)\n[![Shareable Lists API](https://github.com/Pocket/pocket-monorepo/actions/workflows/shareable-lists-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/shareable-lists-api.yml)\n[![Shared Snowplow Consumer](https://github.com/Pocket/pocket-monorepo/actions/workflows/shared-snowplow-consumer.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/shared-snowplow-consumer.yml)\n[![Shares API](https://github.com/Pocket/pocket-monorepo/actions/workflows/shares-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/shares-api.yml)\n[![Transactional Emails](https://github.com/Pocket/pocket-monorepo/actions/workflows/transactional-emails.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/transactional-emails.yml)\n[![User API](https://github.com/Pocket/pocket-monorepo/actions/workflows/user-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/user-api.yml)\n[![User List Search](https://github.com/Pocket/pocket-monorepo/actions/workflows/user-list-search.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/user-list-search.yml)\n[![V3 Proxy API](https://github.com/Pocket/pocket-monorepo/actions/workflows/v3-proxy-api.yml/badge.svg)](https://github.com/Pocket/pocket-monorepo/actions/workflows/v3-proxy-api.yml)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FPocket%2Fpocket-monorepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FPocket%2Fpocket-monorepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FPocket%2Fpocket-monorepo/lists"}