{"id":"67f544c8-b9de-4347-b755-f439b525d462","shortId":"hYDc6Z","kind":"skill","title":"turborepo-caching","tagline":"Configure Turborepo for efficient monorepo builds with local and remote caching. Use when setting up Turborepo, optimizing build pipelines, or implementing distributed caching.","description":"# Turborepo Caching\n\nProduction patterns for Turborepo build optimization.\n\n## Do not use this skill when\n\n- The task is unrelated to turborepo caching\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources/implementation-playbook.md`.\n\n## Use this skill when\n\n- Setting up new Turborepo projects\n- Configuring build pipelines\n- Implementing remote caching\n- Optimizing CI/CD performance\n- Migrating from other monorepo tools\n- Debugging cache misses\n\n## Core Concepts\n\n### 1. Turborepo Architecture\n\n```\nWorkspace Root/\n├── apps/\n│   ├── web/\n│   │   └── package.json\n│   └── docs/\n│       └── package.json\n├── packages/\n│   ├── ui/\n│   │   └── package.json\n│   └── config/\n│       └── package.json\n├── turbo.json\n└── package.json\n```\n\n### 2. Pipeline Concepts\n\n| Concept | Description |\n|---------|-------------|\n| **dependsOn** | Tasks that must complete first |\n| **cache** | Whether to cache outputs |\n| **outputs** | Files to cache |\n| **inputs** | Files that affect cache key |\n| **persistent** | Long-running tasks (dev servers) |\n\n## Templates\n\n### Template 1: turbo.json Configuration\n\n```json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"globalDependencies\": [\n    \".env\",\n    \".env.local\"\n  ],\n  \"globalEnv\": [\n    \"NODE_ENV\",\n    \"VERCEL_URL\"\n  ],\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\n        \"dist/**\",\n        \".next/**\",\n        \"!.next/cache/**\"\n      ],\n      \"env\": [\n        \"API_URL\",\n        \"NEXT_PUBLIC_*\"\n      ]\n    },\n    \"test\": {\n      \"dependsOn\": [\"build\"],\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\n        \"src/**/*.tsx\",\n        \"src/**/*.ts\",\n        \"test/**/*.ts\"\n      ]\n    },\n    \"lint\": {\n      \"outputs\": [],\n      \"cache\": true\n    },\n    \"typecheck\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": []\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"clean\": {\n      \"cache\": false\n    }\n  }\n}\n```\n\n### Template 2: Package-Specific Pipeline\n\n```json\n// apps/web/turbo.json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"extends\": [\"//\"],\n  \"pipeline\": {\n    \"build\": {\n      \"outputs\": [\".next/**\", \"!.next/cache/**\"],\n      \"env\": [\n        \"NEXT_PUBLIC_API_URL\",\n        \"NEXT_PUBLIC_ANALYTICS_ID\"\n      ]\n    },\n    \"test\": {\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\n        \"src/**\",\n        \"tests/**\",\n        \"jest.config.js\"\n      ]\n    }\n  }\n}\n```\n\n### Template 3: Remote Caching with Vercel\n\n```bash\n# Login to Vercel\nnpx turbo login\n\n# Link to Vercel project\nnpx turbo link\n\n# Run with remote cache\nturbo build --remote-only\n\n# CI environment variables\nTURBO_TOKEN=your-token\nTURBO_TEAM=your-team\n```\n\n```yaml\n# .github/workflows/ci.yml\nname: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\nenv:\n  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}\n  TURBO_TEAM: ${{ vars.TURBO_TEAM }}\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: 'npm'\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Build\n        run: npx turbo build --filter='...[origin/main]'\n\n      - name: Test\n        run: npx turbo test --filter='...[origin/main]'\n```\n\n### Template 4: Self-Hosted Remote Cache\n\n```typescript\n// Custom remote cache server (Express)\nimport express from 'express';\nimport { createReadStream, createWriteStream } from 'fs';\nimport { mkdir } from 'fs/promises';\nimport { join } from 'path';\n\nconst app = express();\nconst CACHE_DIR = './cache';\n\n// Get artifact\napp.get('/v8/artifacts/:hash', async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || 'default';\n  const filePath = join(CACHE_DIR, team, hash);\n\n  try {\n    const stream = createReadStream(filePath);\n    stream.pipe(res);\n  } catch {\n    res.status(404).send('Not found');\n  }\n});\n\n// Put artifact\napp.put('/v8/artifacts/:hash', async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || 'default';\n  const dir = join(CACHE_DIR, team);\n  const filePath = join(dir, hash);\n\n  await mkdir(dir, { recursive: true });\n\n  const stream = createWriteStream(filePath);\n  req.pipe(stream);\n\n  stream.on('finish', () => {\n    res.json({ urls: [`${req.protocol}://${req.get('host')}/v8/artifacts/${hash}`] });\n  });\n});\n\n// Check artifact exists\napp.head('/v8/artifacts/:hash', async (req, res) => {\n  const { hash } = req.params;\n  const team = req.query.teamId || 'default';\n  const filePath = join(CACHE_DIR, team, hash);\n\n  try {\n    await fs.access(filePath);\n    res.status(200).end();\n  } catch {\n    res.status(404).end();\n  }\n});\n\napp.listen(3000);\n```\n\n```json\n// turbo.json for self-hosted cache\n{\n  \"remoteCache\": {\n    \"signature\": false\n  }\n}\n```\n\n```bash\n# Use self-hosted cache\nturbo build --api=\"http://localhost:3000\" --token=\"my-token\" --team=\"my-team\"\n```\n\n### Template 5: Filtering and Scoping\n\n```bash\n# Build specific package\nturbo build --filter=@myorg/web\n\n# Build package and its dependencies\nturbo build --filter=@myorg/web...\n\n# Build package and its dependents\nturbo build --filter=...@myorg/ui\n\n# Build changed packages since main\nturbo build --filter='...[origin/main]'\n\n# Build packages in directory\nturbo build --filter='./apps/*'\n\n# Combine filters\nturbo build --filter=@myorg/web --filter=@myorg/docs\n\n# Exclude package\nturbo build --filter='!@myorg/docs'\n\n# Include dependencies of changed\nturbo build --filter='...[HEAD^1]...'\n```\n\n### Template 6: Advanced Pipeline Configuration\n\n```json\n{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\"],\n      \"inputs\": [\n        \"$TURBO_DEFAULT$\",\n        \"!**/*.md\",\n        \"!**/*.test.*\"\n      ]\n    },\n    \"test\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"coverage/**\"],\n      \"inputs\": [\n        \"src/**\",\n        \"tests/**\",\n        \"*.config.*\"\n      ],\n      \"env\": [\"CI\", \"NODE_ENV\"]\n    },\n    \"test:e2e\": {\n      \"dependsOn\": [\"build\"],\n      \"outputs\": [],\n      \"cache\": false\n    },\n    \"deploy\": {\n      \"dependsOn\": [\"build\", \"test\", \"lint\"],\n      \"outputs\": [],\n      \"cache\": false\n    },\n    \"db:generate\": {\n      \"cache\": false\n    },\n    \"db:push\": {\n      \"cache\": false,\n      \"dependsOn\": [\"db:generate\"]\n    },\n    \"@myorg/web#build\": {\n      \"dependsOn\": [\"^build\", \"@myorg/db#db:generate\"],\n      \"outputs\": [\".next/**\"],\n      \"env\": [\"NEXT_PUBLIC_*\"]\n    }\n  }\n}\n```\n\n### Template 7: Root package.json Setup\n\n```json\n{\n  \"name\": \"my-turborepo\",\n  \"private\": true,\n  \"workspaces\": [\n    \"apps/*\",\n    \"packages/*\"\n  ],\n  \"scripts\": {\n    \"build\": \"turbo build\",\n    \"dev\": \"turbo dev\",\n    \"lint\": \"turbo lint\",\n    \"test\": \"turbo test\",\n    \"clean\": \"turbo clean && rm -rf node_modules\",\n    \"format\": \"prettier --write \\\"**/*.{ts,tsx,md}\\\"\",\n    \"changeset\": \"changeset\",\n    \"version-packages\": \"changeset version\",\n    \"release\": \"turbo build --filter=./packages/* && changeset publish\"\n  },\n  \"devDependencies\": {\n    \"turbo\": \"^1.10.0\",\n    \"prettier\": \"^3.0.0\",\n    \"@changesets/cli\": \"^2.26.0\"\n  },\n  \"packageManager\": \"npm@10.0.0\"\n}\n```\n\n## Debugging Cache\n\n```bash\n# Dry run to see what would run\nturbo build --dry-run\n\n# Verbose output with hashes\nturbo build --verbosity=2\n\n# Show task graph\nturbo build --graph\n\n# Force no cache\nturbo build --force\n\n# Show cache status\nturbo build --summarize\n\n# Debug specific task\nTURBO_LOG_VERBOSITY=debug turbo build --filter=@myorg/web\n```\n\n## Best Practices\n\n### Do's\n- **Define explicit inputs** - Avoid cache invalidation\n- **Use workspace protocol** - `\"@myorg/ui\": \"workspace:*\"`\n- **Enable remote caching** - Share across CI and local\n- **Filter in CI** - Build only affected packages\n- **Cache build outputs** - Not source files\n\n### Don'ts\n- **Don't cache dev servers** - Use `persistent: true`\n- **Don't include secrets in env** - Use runtime env vars\n- **Don't ignore dependsOn** - Causes race conditions\n- **Don't over-filter** - May miss dependencies\n\n## Resources\n\n- [Turborepo Documentation](https://turbo.build/repo/docs)\n- [Caching Guide](https://turbo.build/repo/docs/core-concepts/caching)\n- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching)\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["turborepo","caching","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-turborepo-caching","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/turborepo-caching","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34460 github stars · SKILL.md body (8,810 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T06:52:03.441Z","embedding":null,"createdAt":"2026-04-18T21:46:34.481Z","updatedAt":"2026-04-22T06:52:03.441Z","lastSeenAt":"2026-04-22T06:52:03.441Z","tsv":"'/apps':590 '/cache':396 '/packages':738 '/repo/docs)':879 '/repo/docs/core-concepts/caching)':884 '/repo/docs/core-concepts/remote-caching)':889 '/schema.json':171,232,623 '/v8/artifacts':400,435,476,482 '1':112,164,613 '1.10.0':743 '10.0.0':750 '2':129,222,773 '2.26.0':747 '20':335 '200':506 '3':256 '3.0.0':745 '3000':513,534 '4':361 '404':428,510 '5':544 '6':615 '7':687 'across':822 'action':73 'actions/checkout':326 'actions/setup-node':329 'advanc':616 'affect':152,831 'analyt':246 'api':189,242,532 'app':117,391,699 'app.get':399 'app.head':481 'app.listen':512 'app.put':434 'appli':65 'apps/web/turbo.json':228 'architectur':114 'artifact':398,433,479 'ask':923 'async':402,437,484 'avoid':810 'await':458,502 'bash':261,524,548,753 'best':67,803 'boundari':931 'branch':303 'build':9,21,33,94,181,183,195,211,235,280,317,345,349,531,549,553,556,562,565,571,574,580,583,588,594,602,610,625,627,637,651,657,675,677,702,704,736,762,771,778,784,790,800,829,834 'cach':3,14,26,28,47,98,108,140,143,148,153,207,214,219,258,278,336,366,370,394,415,450,497,520,529,653,661,665,669,752,782,787,811,820,833,843,880,886 'catch':426,508 'caus':863 'chang':575,608 'changeset':727,728,732,739 'changesets/cli':746 'check':478 'ci':284,300,343,645,823,828 'ci/cd':100 'clarif':925 'clarifi':59 'clean':218,714,716 'clear':898 'combin':591 'complet':138 'concept':111,131,132 'condit':865 'config':125,643 'configur':4,93,166,618 'const':390,393,405,408,412,420,440,443,447,453,463,487,490,494 'constraint':61 'core':110 'coverag':197,250,639 'createreadstream':378,422 'createwritestream':379,465 'criteria':934 'custom':368 'db':663,667,672,679 'debug':107,751,792,798 'default':411,446,493,632 'defin':807 'depend':340,560,569,606,873 'dependson':134,182,194,210,626,636,650,656,671,676,862 'deploy':655 'describ':902 'descript':133 'detail':78 'dev':160,213,705,707,844 'devdepend':741 'differ':51 'dir':395,416,448,451,456,460,498 'directori':586 'dist':185,629 'distribut':25 'doc':120 'document':876 'domain':52 'dri':754,764 'dry-run':763 'e2e':649 'effici':7 'enabl':818 'end':507,511 'env':173,177,188,239,307,644,647,683,854,857 'env.local':174 'environ':285,914 'environment-specif':913 'exampl':79 'exclud':599 'exist':480 'expert':919 'explicit':808 'express':372,374,376,392 'extend':233 'fals':215,220,523,654,662,666,670 'file':146,150,838 'filepath':413,423,454,466,495,504 'filter':350,358,545,554,563,572,581,589,592,595,597,603,611,737,801,826,870 'finish':470 'first':139 'forc':780,785 'format':721 'found':431 'fs':381 'fs.access':503 'fs/promises':385 'generat':664,673,680 'get':397 'github/workflows/ci.yml':298 'globaldepend':172 'globalenv':175 'goal':60 'graph':776,779 'guid':881 'hash':401,406,418,436,441,457,477,483,488,500,769 'head':612 'host':364,475,519,528 'id':247 'ignor':861 'implement':24,96 'import':373,377,382,386 'includ':605,851 'input':64,149,198,251,630,640,809,928 'instal':339 'instruct':58 'invalid':812 'jest.config.js':254 'job':316 'join':387,414,449,455,496 'json':167,227,514,619,691 'key':154 'latest':323 'limit':890 'link':268,274 'lint':205,659,708,710 'local':11,825 'localhost':533 'log':796 'login':262,267 'long':157 'long-run':156 'main':304,578 'match':899 'may':871 'md':633,726 'migrat':102 'miss':109,872,936 'mkdir':383,459 'modul':720 'monorepo':8,105 'must':137 'my-team':540 'my-token':536 'my-turborepo':693 'myorg/db':678 'myorg/docs':598,604 'myorg/ui':573,816 'myorg/web':555,564,596,674,802 'name':299,338,344,352,692 'need':49 'new':90 'next':186,191,237,240,244,682,684 'next/cache':187,238 'node':176,333,646,719 'node-vers':332 'npm':337,342,749 'npx':265,272,347,355 'open':82 'optim':20,34,99 'origin/main':351,359,582 'outcom':71 'output':144,145,184,196,206,212,236,249,628,638,652,660,681,767,835,908 'outsid':55 'over-filt':868 'packag':122,224,551,557,566,576,584,600,700,731,832 'package-specif':223 'package.json':119,121,124,126,128,689 'packagemanag':748 'path':389 'pattern':30 'perform':101 'permiss':929 'persist':155,216,847 'pipelin':22,95,130,180,226,234,617,624 'practic':68,804 'prettier':722,744 'privat':696 'product':29 'project':92,271 'protocol':815 'provid':72 'public':192,241,245,685 'publish':740 'pull':305 'push':302,668 'put':432 'race':864 'recurs':461 'releas':734 'relev':66 'remot':13,97,257,277,282,365,369,819,885 'remote-on':281 'remotecach':521 'req':403,438,485 'req.get':474 'req.params':407,442,489 'req.pipe':467 'req.protocol':473 'req.query.teamid':410,445,492 'request':306 'requir':63,81,927 'res':404,425,439,486 'res.json':471 'res.status':427,505,509 'resourc':874 'resources/implementation-playbook.md':83 'review':920 'rf':718 'rm':717 'root':116,688 'run':158,275,319,341,346,354,755,760,765 'runs-on':318 'runtim':856 'safeti':930 'schema':168,229,620 'scope':57,547,901 'script':701 'secret':852 'secrets.turbo':310 'see':757 'self':363,518,527 'self-host':362,517,526 'send':429 'server':161,371,845 'set':17,88 'setup':690 'share':821 'show':774,786 'signatur':522 'sinc':577 'skill':39,86,893 'skill-turborepo-caching' 'sourc':837 'source-sickn33' 'specif':225,550,793,915 'src':199,201,252,641 'status':788 'step':74,324 'stop':921 'stream':421,464,468 'stream.on':469 'stream.pipe':424 'substitut':911 'success':933 'summar':791 'task':42,135,159,775,794,897 'team':293,296,313,315,409,417,444,452,491,499,539,542 'templat':162,163,221,255,360,543,614,686 'test':193,203,248,253,353,357,634,635,642,648,658,711,713,917 'token':288,291,309,311,535,538 'tool':54,106 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':906 'tri':419,501 'true':208,217,462,697,848 'ts':202,204,724,840 'tsx':200,725 'turbo':266,273,279,287,292,308,312,348,356,530,552,561,570,579,587,593,601,609,631,703,706,709,712,715,735,742,761,770,777,783,789,795,799 'turbo.build':170,231,622,878,883,888 'turbo.build/repo/docs)':877 'turbo.build/repo/docs/core-concepts/caching)':882 'turbo.build/repo/docs/core-concepts/remote-caching)':887 'turbo.build/schema.json':169,230,621 'turbo.json':127,165,515 'turborepo':2,5,19,27,32,46,91,113,695,875 'turborepo-cach':1 'typecheck':209 'typescript':367 'ubuntu':322 'ubuntu-latest':321 'ui':123 'unrel':44 'url':179,190,243,472 'use':15,37,84,325,328,525,813,846,855,891 'v4':327,330 'valid':70,916 'var':858 'variabl':286 'vars.turbo':314 'verbos':766,772,797 'vercel':178,260,264,270 'verif':76 'version':334,730,733 'version-packag':729 'web':118 'whether':141 'workspac':115,698,814,817 'would':759 'write':723 'yaml':297 'your-team':294 'your-token':289","prices":[{"id":"acb0a56c-0c4c-4a27-af79-078fd87a3022","listingId":"67f544c8-b9de-4347-b755-f439b525d462","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:46:34.481Z"}],"sources":[{"listingId":"67f544c8-b9de-4347-b755-f439b525d462","source":"github","sourceId":"sickn33/antigravity-awesome-skills/turborepo-caching","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/turborepo-caching","isPrimary":false,"firstSeenAt":"2026-04-18T21:46:34.481Z","lastSeenAt":"2026-04-22T06:52:03.441Z"}],"details":{"listingId":"67f544c8-b9de-4347-b755-f439b525d462","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"turborepo-caching","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34460,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"ad10056ecafe498d4d967bd68eb866b02799a2be","skill_md_path":"skills/turborepo-caching/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/turborepo-caching"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"turborepo-caching","description":"Configure Turborepo for efficient monorepo builds with local and remote caching. Use when setting up Turborepo, optimizing build pipelines, or implementing distributed caching."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/turborepo-caching"},"updatedAt":"2026-04-22T06:52:03.441Z"}}