@vodailoc/kilo-kit-mcp 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp/kilo-kit.codex-windows.toml +5 -0
- package/LICENSE +190 -190
- package/QUICKSTART.md +265 -255
- package/README.md +290 -266
- package/mcp/README.md +29 -5
- package/mcp/dist/server.js +1 -1
- package/mcp/package.json +1 -2
- package/package.json +3 -2
- package/skills/README.md +647 -647
- package/skills/SKILLS_INDEX.md +139 -139
- package/skills/ai-media/ai-multimodal/.env.example +97 -97
- package/skills/ai-media/ai-multimodal/SKILL.md +357 -357
- package/skills/ai-media/ai-multimodal/references/audio-processing.md +373 -373
- package/skills/ai-media/ai-multimodal/references/image-generation.md +558 -558
- package/skills/ai-media/ai-multimodal/references/video-analysis.md +502 -502
- package/skills/ai-media/ai-multimodal/references/vision-understanding.md +483 -483
- package/skills/ai-media/ai-multimodal/scripts/document_converter.py +395 -395
- package/skills/ai-media/ai-multimodal/scripts/gemini_batch_process.py +480 -480
- package/skills/ai-media/ai-multimodal/scripts/media_optimizer.py +506 -506
- package/skills/ai-media/ai-multimodal/scripts/requirements.txt +26 -26
- package/skills/ai-media/ai-multimodal/scripts/tests/requirements.txt +20 -20
- package/skills/ai-media/ai-multimodal/scripts/tests/test_document_converter.py +299 -299
- package/skills/ai-media/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -362
- package/skills/ai-media/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -373
- package/skills/ai-media/media-processing/SKILL.md +358 -358
- package/skills/ai-media/media-processing/references/ffmpeg-encoding.md +358 -358
- package/skills/ai-media/media-processing/references/ffmpeg-filters.md +503 -503
- package/skills/ai-media/media-processing/references/ffmpeg-streaming.md +403 -403
- package/skills/ai-media/media-processing/references/format-compatibility.md +375 -375
- package/skills/ai-media/media-processing/references/imagemagick-batch.md +612 -612
- package/skills/ai-media/media-processing/references/imagemagick-editing.md +623 -623
- package/skills/ai-media/media-processing/scripts/batch_resize.py +342 -342
- package/skills/ai-media/media-processing/scripts/media_convert.py +311 -311
- package/skills/ai-media/media-processing/scripts/requirements.txt +24 -24
- package/skills/ai-media/media-processing/scripts/tests/requirements.txt +2 -2
- package/skills/ai-media/media-processing/scripts/tests/test_batch_resize.py +372 -372
- package/skills/ai-media/media-processing/scripts/tests/test_media_convert.py +259 -259
- package/skills/ai-media/media-processing/scripts/tests/test_video_optimize.py +397 -397
- package/skills/ai-media/media-processing/scripts/video_optimize.py +414 -414
- package/skills/ai-media/screenshot/LICENSE.txt +201 -201
- package/skills/ai-media/screenshot/SKILL.md +267 -267
- package/skills/ai-media/screenshot/agents/openai.yaml +6 -6
- package/skills/ai-media/screenshot/assets/screenshot-small.svg +5 -5
- package/skills/ai-media/screenshot/scripts/ensure_macos_permissions.sh +54 -54
- package/skills/ai-media/screenshot/scripts/macos_display_info.swift +22 -22
- package/skills/ai-media/screenshot/scripts/macos_permissions.swift +40 -40
- package/skills/ai-media/screenshot/scripts/macos_window_info.swift +126 -126
- package/skills/ai-media/screenshot/scripts/take_screenshot.ps1 +163 -163
- package/skills/ai-media/screenshot/scripts/take_screenshot.py +585 -585
- package/skills/ai-media/sora/LICENSE.txt +201 -201
- package/skills/ai-media/sora/SKILL.md +153 -153
- package/skills/ai-media/sora/agents/openai.yaml +6 -6
- package/skills/ai-media/sora/assets/sora-small.svg +4 -4
- package/skills/ai-media/sora/references/cinematic-shots.md +53 -53
- package/skills/ai-media/sora/references/cli.md +248 -248
- package/skills/ai-media/sora/references/codex-network.md +28 -28
- package/skills/ai-media/sora/references/prompting.md +137 -137
- package/skills/ai-media/sora/references/sample-prompts.md +95 -95
- package/skills/ai-media/sora/references/social-ads.md +42 -42
- package/skills/ai-media/sora/references/troubleshooting.md +58 -58
- package/skills/ai-media/sora/references/video-api.md +45 -45
- package/skills/ai-media/sora/scripts/sora.py +970 -970
- package/skills/design/aesthetic/SKILL.md +121 -121
- package/skills/design/aesthetic/assets/design-guideline-template.md +163 -163
- package/skills/design/aesthetic/assets/design-story-template.md +135 -135
- package/skills/design/aesthetic/references/design-principles.md +62 -62
- package/skills/design/aesthetic/references/design-resources.md +75 -75
- package/skills/design/aesthetic/references/micro-interactions.md +53 -53
- package/skills/design/aesthetic/references/storytelling-design.md +50 -50
- package/skills/design/figma/LICENSE.txt +202 -202
- package/skills/design/figma/SKILL.md +42 -42
- package/skills/design/figma/agents/openai.yaml +14 -14
- package/skills/design/figma/assets/figma-small.svg +3 -3
- package/skills/design/figma/assets/icon.svg +28 -28
- package/skills/design/figma/references/figma-mcp-config.md +35 -35
- package/skills/design/figma/references/figma-tools-and-prompts.md +34 -34
- package/skills/design/figma-implement-design/LICENSE.txt +202 -202
- package/skills/design/figma-implement-design/SKILL.md +264 -264
- package/skills/design/figma-implement-design/agents/openai.yaml +14 -14
- package/skills/design/figma-implement-design/assets/figma-small.svg +3 -3
- package/skills/design/figma-implement-design/assets/icon.svg +28 -28
- package/skills/design/frontend-design/SKILL.md +41 -41
- package/skills/design/frontend-design/references/animejs.md +395 -395
- package/skills/design/ui-styling/LICENSE.txt +201 -201
- package/skills/design/ui-styling/SKILL.md +321 -321
- package/skills/design/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -94
- package/skills/design/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Jura-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Lora-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -93
- package/skills/design/ui-styling/references/canvas-design-system.md +320 -320
- package/skills/design/ui-styling/references/shadcn-accessibility.md +471 -471
- package/skills/design/ui-styling/references/shadcn-components.md +424 -424
- package/skills/design/ui-styling/references/shadcn-theming.md +373 -373
- package/skills/design/ui-styling/references/tailwind-customization.md +483 -483
- package/skills/design/ui-styling/references/tailwind-responsive.md +382 -382
- package/skills/design/ui-styling/references/tailwind-utilities.md +455 -455
- package/skills/design/ui-styling/scripts/requirements.txt +17 -17
- package/skills/design/ui-styling/scripts/shadcn_add.py +292 -292
- package/skills/design/ui-styling/scripts/tailwind_config_gen.py +456 -456
- package/skills/design/ui-styling/scripts/tests/requirements.txt +3 -3
- package/skills/design/ui-styling/scripts/tests/test_shadcn_add.py +266 -266
- package/skills/design/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -336
- package/skills/engineering/aspnet-core/LICENSE.txt +201 -201
- package/skills/engineering/aspnet-core/SKILL.md +61 -61
- package/skills/engineering/aspnet-core/agents/openai.yaml +5 -5
- package/skills/engineering/aspnet-core/references/_sections.md +40 -40
- package/skills/engineering/aspnet-core/references/apis-minimal-and-controllers.md +81 -81
- package/skills/engineering/aspnet-core/references/data-state-and-services.md +69 -69
- package/skills/engineering/aspnet-core/references/program-and-pipeline.md +103 -103
- package/skills/engineering/aspnet-core/references/realtime-grpc-and-background-work.md +58 -58
- package/skills/engineering/aspnet-core/references/security-and-identity.md +75 -75
- package/skills/engineering/aspnet-core/references/source-map.md +43 -43
- package/skills/engineering/aspnet-core/references/stack-selection.md +63 -63
- package/skills/engineering/aspnet-core/references/testing-performance-and-operations.md +92 -92
- package/skills/engineering/aspnet-core/references/ui-blazor.md +53 -53
- package/skills/engineering/aspnet-core/references/ui-mvc.md +56 -56
- package/skills/engineering/aspnet-core/references/ui-razor-pages.md +55 -55
- package/skills/engineering/aspnet-core/references/versioning-and-upgrades.md +51 -51
- package/skills/engineering/backend-development/SKILL.md +95 -95
- package/skills/engineering/backend-development/references/backend-api-design.md +495 -495
- package/skills/engineering/backend-development/references/backend-architecture.md +454 -454
- package/skills/engineering/backend-development/references/backend-authentication.md +338 -338
- package/skills/engineering/backend-development/references/backend-code-quality.md +659 -659
- package/skills/engineering/backend-development/references/backend-debugging.md +904 -904
- package/skills/engineering/backend-development/references/backend-devops.md +494 -494
- package/skills/engineering/backend-development/references/backend-mindset.md +387 -387
- package/skills/engineering/backend-development/references/backend-performance.md +397 -397
- package/skills/engineering/backend-development/references/backend-security.md +290 -290
- package/skills/engineering/backend-development/references/backend-technologies.md +256 -256
- package/skills/engineering/backend-development/references/backend-testing.md +429 -429
- package/skills/engineering/better-auth/SKILL.md +204 -204
- package/skills/engineering/better-auth/references/advanced-features.md +553 -553
- package/skills/engineering/better-auth/references/database-integration.md +577 -577
- package/skills/engineering/better-auth/references/email-password-auth.md +416 -416
- package/skills/engineering/better-auth/references/oauth-providers.md +430 -430
- package/skills/engineering/better-auth/scripts/better_auth_init.py +521 -521
- package/skills/engineering/better-auth/scripts/requirements.txt +15 -15
- package/skills/engineering/better-auth/scripts/tests/test_better_auth_init.py +421 -421
- package/skills/engineering/code-review/SKILL.md +140 -140
- package/skills/engineering/code-review/references/code-review-reception.md +208 -208
- package/skills/engineering/code-review/references/requesting-code-review.md +104 -104
- package/skills/engineering/code-review/references/verification-before-completion.md +138 -138
- package/skills/engineering/context-engineering/SKILL.md +86 -86
- package/skills/engineering/context-engineering/references/context-compression.md +84 -84
- package/skills/engineering/context-engineering/references/context-degradation.md +93 -93
- package/skills/engineering/context-engineering/references/context-fundamentals.md +75 -75
- package/skills/engineering/context-engineering/references/context-optimization.md +82 -82
- package/skills/engineering/context-engineering/references/evaluation.md +89 -89
- package/skills/engineering/context-engineering/references/memory-systems.md +88 -88
- package/skills/engineering/context-engineering/references/multi-agent-patterns.md +90 -90
- package/skills/engineering/context-engineering/references/project-development.md +97 -97
- package/skills/engineering/context-engineering/references/tool-design.md +86 -86
- package/skills/engineering/context-engineering/scripts/compression_evaluator.py +329 -329
- package/skills/engineering/context-engineering/scripts/context_analyzer.py +294 -294
- package/skills/engineering/databases/SKILL.md +232 -232
- package/skills/engineering/databases/references/mongodb-aggregation.md +447 -447
- package/skills/engineering/databases/references/mongodb-atlas.md +465 -465
- package/skills/engineering/databases/references/mongodb-crud.md +408 -408
- package/skills/engineering/databases/references/mongodb-indexing.md +442 -442
- package/skills/engineering/databases/references/postgresql-administration.md +594 -594
- package/skills/engineering/databases/references/postgresql-performance.md +527 -527
- package/skills/engineering/databases/references/postgresql-psql-cli.md +467 -467
- package/skills/engineering/databases/references/postgresql-queries.md +475 -475
- package/skills/engineering/databases/scripts/db_backup.py +502 -502
- package/skills/engineering/databases/scripts/db_migrate.py +414 -414
- package/skills/engineering/databases/scripts/db_performance_check.py +444 -444
- package/skills/engineering/databases/scripts/requirements.txt +20 -20
- package/skills/engineering/databases/scripts/tests/requirements.txt +4 -4
- package/skills/engineering/databases/scripts/tests/test_db_backup.py +340 -340
- package/skills/engineering/databases/scripts/tests/test_db_migrate.py +277 -277
- package/skills/engineering/databases/scripts/tests/test_db_performance_check.py +370 -370
- package/skills/engineering/diagnose/SKILL.md +117 -117
- package/skills/engineering/diagnose/scripts/hitl-loop.template.sh +41 -41
- package/skills/engineering/docs-seeker/SKILL.md +207 -207
- package/skills/engineering/docs-seeker/WORKFLOWS.md +505 -505
- package/skills/engineering/docs-seeker/references/best-practices.md +632 -632
- package/skills/engineering/docs-seeker/references/documentation-sources.md +461 -461
- package/skills/engineering/docs-seeker/references/error-handling.md +621 -621
- package/skills/engineering/docs-seeker/references/limitations.md +821 -821
- package/skills/engineering/docs-seeker/references/performance.md +574 -574
- package/skills/engineering/docs-seeker/references/tool-selection.md +262 -262
- package/skills/engineering/frontend-development/SKILL.md +398 -398
- package/skills/engineering/frontend-development/resources/common-patterns.md +330 -330
- package/skills/engineering/frontend-development/resources/complete-examples.md +871 -871
- package/skills/engineering/frontend-development/resources/component-patterns.md +501 -501
- package/skills/engineering/frontend-development/resources/data-fetching.md +766 -766
- package/skills/engineering/frontend-development/resources/file-organization.md +501 -501
- package/skills/engineering/frontend-development/resources/loading-and-error-states.md +500 -500
- package/skills/engineering/frontend-development/resources/performance.md +405 -405
- package/skills/engineering/frontend-development/resources/routing-guide.md +363 -363
- package/skills/engineering/frontend-development/resources/styling-guide.md +427 -427
- package/skills/engineering/frontend-development/resources/typescript-standards.md +417 -417
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +37 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +53 -53
- package/skills/engineering/improve-codebase-architecture/SKILL.md +71 -71
- package/skills/engineering/openai-docs/LICENSE.txt +201 -201
- package/skills/engineering/openai-docs/SKILL.md +69 -69
- package/skills/engineering/openai-docs/agents/openai.yaml +14 -14
- package/skills/engineering/openai-docs/assets/openai-small.svg +3 -3
- package/skills/engineering/openai-docs/references/gpt-5p4-prompting-guide.md +433 -433
- package/skills/engineering/openai-docs/references/latest-model.md +35 -35
- package/skills/engineering/openai-docs/references/upgrading-to-gpt-5p4.md +164 -164
- package/skills/engineering/playwright/LICENSE.txt +201 -201
- package/skills/engineering/playwright/NOTICE.txt +14 -14
- package/skills/engineering/playwright/SKILL.md +147 -147
- package/skills/engineering/playwright/agents/openai.yaml +6 -6
- package/skills/engineering/playwright/assets/playwright-small.svg +3 -3
- package/skills/engineering/playwright/references/cli.md +116 -116
- package/skills/engineering/playwright/references/workflows.md +95 -95
- package/skills/engineering/playwright/scripts/playwright_cli.sh +25 -25
- package/skills/engineering/playwright-interactive/LICENSE.txt +201 -201
- package/skills/engineering/playwright-interactive/NOTICE.txt +13 -13
- package/skills/engineering/playwright-interactive/SKILL.md +689 -689
- package/skills/engineering/playwright-interactive/agents/openai.yaml +6 -6
- package/skills/engineering/playwright-interactive/assets/playwright-small.svg +3 -3
- package/skills/engineering/render-deploy/LICENSE.txt +201 -201
- package/skills/engineering/render-deploy/SKILL.md +479 -479
- package/skills/engineering/render-deploy/agents/openai.yaml +14 -14
- package/skills/engineering/render-deploy/assets/docker.yaml +62 -62
- package/skills/engineering/render-deploy/assets/go-api.yaml +35 -35
- package/skills/engineering/render-deploy/assets/nextjs-postgres.yaml +35 -35
- package/skills/engineering/render-deploy/assets/node-express.yaml +25 -25
- package/skills/engineering/render-deploy/assets/python-django.yaml +89 -89
- package/skills/engineering/render-deploy/assets/render-small.svg +3 -3
- package/skills/engineering/render-deploy/assets/static-site.yaml +54 -54
- package/skills/engineering/render-deploy/references/blueprint-spec.md +718 -718
- package/skills/engineering/render-deploy/references/codebase-analysis.md +49 -49
- package/skills/engineering/render-deploy/references/configuration-guide.md +603 -603
- package/skills/engineering/render-deploy/references/deployment-details.md +224 -224
- package/skills/engineering/render-deploy/references/direct-creation.md +113 -113
- package/skills/engineering/render-deploy/references/error-patterns.md +13 -13
- package/skills/engineering/render-deploy/references/post-deploy-checks.md +36 -36
- package/skills/engineering/render-deploy/references/runtimes.md +473 -473
- package/skills/engineering/render-deploy/references/service-types.md +450 -450
- package/skills/engineering/render-deploy/references/troubleshooting-basics.md +36 -36
- package/skills/engineering/repomix/SKILL.md +215 -215
- package/skills/engineering/repomix/references/configuration.md +211 -211
- package/skills/engineering/repomix/references/usage-patterns.md +232 -232
- package/skills/engineering/repomix/scripts/README.md +179 -179
- package/skills/engineering/repomix/scripts/repomix_batch.py +455 -455
- package/skills/engineering/repomix/scripts/repos.example.json +15 -15
- package/skills/engineering/repomix/scripts/requirements.txt +15 -15
- package/skills/engineering/repomix/scripts/tests/test_repomix_batch.py +531 -531
- package/skills/engineering/setup-matt-pocock-skills/SKILL.md +121 -121
- package/skills/engineering/setup-matt-pocock-skills/domain.md +51 -51
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +22 -22
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +23 -23
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +19 -19
- package/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -15
- package/skills/engineering/shopify/README.md +66 -66
- package/skills/engineering/shopify/SKILL.md +319 -319
- package/skills/engineering/shopify/references/app-development.md +470 -470
- package/skills/engineering/shopify/references/extensions.md +493 -493
- package/skills/engineering/shopify/references/themes.md +498 -498
- package/skills/engineering/shopify/scripts/requirements.txt +19 -19
- package/skills/engineering/shopify/scripts/shopify_init.py +423 -423
- package/skills/engineering/shopify/scripts/tests/test_shopify_init.py +385 -385
- package/skills/engineering/tdd/SKILL.md +109 -109
- package/skills/engineering/tdd/deep-modules.md +33 -33
- package/skills/engineering/tdd/interface-design.md +31 -31
- package/skills/engineering/tdd/mocking.md +59 -59
- package/skills/engineering/tdd/refactoring.md +10 -10
- package/skills/engineering/tdd/tests.md +61 -61
- package/skills/engineering/to-issues/SKILL.md +81 -81
- package/skills/engineering/to-prd/SKILL.md +74 -74
- package/skills/engineering/triage/AGENT-BRIEF.md +168 -168
- package/skills/engineering/triage/OUT-OF-SCOPE.md +101 -101
- package/skills/engineering/triage/SKILL.md +103 -103
- package/skills/engineering/web-frameworks/SKILL.md +324 -324
- package/skills/engineering/web-frameworks/references/nextjs-app-router.md +465 -465
- package/skills/engineering/web-frameworks/references/nextjs-data-fetching.md +459 -459
- package/skills/engineering/web-frameworks/references/nextjs-optimization.md +511 -511
- package/skills/engineering/web-frameworks/references/nextjs-server-components.md +495 -495
- package/skills/engineering/web-frameworks/references/remix-icon-integration.md +603 -603
- package/skills/engineering/web-frameworks/references/turborepo-caching.md +551 -551
- package/skills/engineering/web-frameworks/references/turborepo-pipelines.md +517 -517
- package/skills/engineering/web-frameworks/references/turborepo-setup.md +542 -542
- package/skills/engineering/web-frameworks/scripts/nextjs_init.py +547 -547
- package/skills/engineering/web-frameworks/scripts/requirements.txt +16 -16
- package/skills/engineering/web-frameworks/scripts/tests/requirements.txt +3 -3
- package/skills/engineering/web-frameworks/scripts/tests/test_nextjs_init.py +319 -319
- package/skills/engineering/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -374
- package/skills/engineering/web-frameworks/scripts/turborepo_migrate.py +394 -394
- package/skills/engineering/write-a-skill/SKILL.md +117 -117
- package/skills/kilo-kit/SKILL.md +346 -346
- package/skills/kilo-kit/_template/SKILL.md +185 -185
- package/skills/kilo-kit/debugging/root-cause/SKILL.md +360 -360
- package/skills/kilo-kit/debugging/systematic/SKILL.md +339 -339
- package/skills/kilo-kit/debugging/verification/SKILL.md +424 -424
- package/skills/kilo-kit/development/backend/SKILL.md +540 -540
- package/skills/kilo-kit/development/security/SKILL.md +529 -529
- package/skills/kilo-kit/quality/code-review/SKILL.md +297 -297
- package/skills/kilo-kit/quality/testing/SKILL.md +540 -540
- package/skills/kilo-kit/references/output-formats.md +204 -204
- package/skills/kilo-kit/references/patterns.md +156 -156
- package/skills/kilo-kit/references/performance-benchmarks.md +90 -90
- package/skills/operations/chrome-devtools/SKILL.md +392 -392
- package/skills/operations/chrome-devtools/references/cdp-domains.md +694 -694
- package/skills/operations/chrome-devtools/references/performance-guide.md +940 -940
- package/skills/operations/chrome-devtools/references/puppeteer-reference.md +953 -953
- package/skills/operations/chrome-devtools/scripts/PERSISTENT-BROWSER.md +107 -107
- package/skills/operations/chrome-devtools/scripts/README.md +213 -213
- package/skills/operations/chrome-devtools/scripts/__tests__/selector.test.js +210 -210
- package/skills/operations/chrome-devtools/scripts/click.js +79 -79
- package/skills/operations/chrome-devtools/scripts/close-persistent.js +36 -36
- package/skills/operations/chrome-devtools/scripts/console.js +75 -75
- package/skills/operations/chrome-devtools/scripts/evaluate.js +49 -49
- package/skills/operations/chrome-devtools/scripts/fill.js +72 -72
- package/skills/operations/chrome-devtools/scripts/install-deps.sh +181 -181
- package/skills/operations/chrome-devtools/scripts/install.sh +83 -83
- package/skills/operations/chrome-devtools/scripts/launch-persistent.js +71 -71
- package/skills/operations/chrome-devtools/scripts/lib/browser.js +144 -144
- package/skills/operations/chrome-devtools/scripts/lib/selector.js +178 -178
- package/skills/operations/chrome-devtools/scripts/navigate.js +46 -46
- package/skills/operations/chrome-devtools/scripts/network.js +102 -102
- package/skills/operations/chrome-devtools/scripts/package-lock.json +1206 -1206
- package/skills/operations/chrome-devtools/scripts/package.json +15 -15
- package/skills/operations/chrome-devtools/scripts/performance.js +145 -145
- package/skills/operations/chrome-devtools/scripts/screenshot.js +180 -180
- package/skills/operations/chrome-devtools/scripts/snapshot.js +131 -131
- package/skills/operations/devops/.env.example +76 -76
- package/skills/operations/devops/SKILL.md +285 -285
- package/skills/operations/devops/references/browser-rendering.md +305 -305
- package/skills/operations/devops/references/cloudflare-d1-kv.md +123 -123
- package/skills/operations/devops/references/cloudflare-platform.md +271 -271
- package/skills/operations/devops/references/cloudflare-r2-storage.md +280 -280
- package/skills/operations/devops/references/cloudflare-workers-advanced.md +312 -312
- package/skills/operations/devops/references/cloudflare-workers-apis.md +309 -309
- package/skills/operations/devops/references/cloudflare-workers-basics.md +418 -418
- package/skills/operations/devops/references/docker-basics.md +297 -297
- package/skills/operations/devops/references/docker-compose.md +292 -292
- package/skills/operations/devops/references/gcloud-platform.md +297 -297
- package/skills/operations/devops/references/gcloud-services.md +304 -304
- package/skills/operations/devops/scripts/cloudflare_deploy.py +269 -269
- package/skills/operations/devops/scripts/docker_optimize.py +320 -320
- package/skills/operations/devops/scripts/requirements.txt +20 -20
- package/skills/operations/devops/scripts/tests/requirements.txt +3 -3
- package/skills/operations/devops/scripts/tests/test_cloudflare_deploy.py +285 -285
- package/skills/operations/devops/scripts/tests/test_docker_optimize.py +436 -436
- package/skills/operations/mcp-builder/LICENSE.txt +201 -201
- package/skills/operations/mcp-builder/SKILL.md +328 -328
- package/skills/operations/mcp-builder/reference/evaluation.md +601 -601
- package/skills/operations/mcp-builder/reference/mcp_best_practices.md +915 -915
- package/skills/operations/mcp-builder/reference/node_mcp_server.md +915 -915
- package/skills/operations/mcp-builder/reference/python_mcp_server.md +751 -751
- package/skills/operations/mcp-builder/scripts/connections.py +151 -151
- package/skills/operations/mcp-builder/scripts/evaluation.py +373 -373
- package/skills/operations/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/skills/operations/mcp-builder/scripts/requirements.txt +2 -2
- package/skills/operations/mcp-management/README.md +219 -219
- package/skills/operations/mcp-management/SKILL.md +175 -175
- package/skills/operations/mcp-management/assets/tools.json +3043 -3043
- package/skills/operations/mcp-management/references/configuration.md +114 -114
- package/skills/operations/mcp-management/references/gemini-cli-integration.md +201 -201
- package/skills/operations/mcp-management/references/mcp-protocol.md +116 -116
- package/skills/operations/mcp-management/scripts/.env.example +10 -10
- package/skills/operations/mcp-management/scripts/cli.ts +155 -155
- package/skills/operations/mcp-management/scripts/dist/analyze-tools.js +70 -70
- package/skills/operations/mcp-management/scripts/dist/cli.js +131 -131
- package/skills/operations/mcp-management/scripts/dist/mcp-client.js +115 -115
- package/skills/operations/mcp-management/scripts/mcp-client.ts +163 -163
- package/skills/operations/mcp-management/scripts/package.json +18 -18
- package/skills/operations/mcp-management/scripts/tsconfig.json +15 -15
- package/skills/problem-solving/collision-zone-thinking/SKILL.md +62 -62
- package/skills/problem-solving/defense-in-depth/SKILL.md +130 -130
- package/skills/problem-solving/inversion-exercise/SKILL.md +58 -58
- package/skills/problem-solving/meta-pattern-recognition/SKILL.md +54 -54
- package/skills/problem-solving/root-cause-tracing/SKILL.md +177 -177
- package/skills/problem-solving/root-cause-tracing/find-polluter.sh +63 -63
- package/skills/problem-solving/scale-game/SKILL.md +63 -63
- package/skills/problem-solving/sequential-thinking/README.md +118 -118
- package/skills/problem-solving/sequential-thinking/SKILL.md +93 -93
- package/skills/problem-solving/sequential-thinking/references/advanced.md +122 -122
- package/skills/problem-solving/sequential-thinking/references/examples.md +274 -274
- package/skills/problem-solving/simplification-cascades/SKILL.md +76 -76
- package/skills/problem-solving/when-stuck/SKILL.md +88 -88
- package/skills/productivity/caveman/SKILL.md +49 -49
- package/skills/productivity/grill-me/SKILL.md +10 -10
- package/skills/productivity/grill-with-docs/ADR-FORMAT.md +47 -47
- package/skills/productivity/grill-with-docs/CONTEXT-FORMAT.md +77 -77
- package/skills/productivity/grill-with-docs/SKILL.md +88 -88
- package/skills/productivity/writing-skills/graphviz-conventions.dot +171 -171
- package/skills/productivity/zoom-out/SKILL.md +7 -7
- package/skills/writing-docs/doc/LICENSE.txt +201 -201
- package/skills/writing-docs/doc/SKILL.md +80 -80
- package/skills/writing-docs/doc/agents/openai.yaml +6 -6
- package/skills/writing-docs/doc/assets/doc-small.svg +3 -3
- package/skills/writing-docs/doc/scripts/render_docx.py +296 -296
- package/skills/writing-docs/docx/LICENSE.txt +30 -30
- package/skills/writing-docs/docx/SKILL.md +196 -196
- package/skills/writing-docs/docx/docx-js.md +349 -349
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
- package/skills/writing-docs/docx/ooxml/schemas/mce/mc.xsd +75 -75
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
- package/skills/writing-docs/docx/ooxml/scripts/pack.py +159 -159
- package/skills/writing-docs/docx/ooxml/scripts/unpack.py +29 -29
- package/skills/writing-docs/docx/ooxml/scripts/validate.py +69 -69
- package/skills/writing-docs/docx/ooxml/scripts/validation/__init__.py +15 -15
- package/skills/writing-docs/docx/ooxml/scripts/validation/base.py +951 -951
- package/skills/writing-docs/docx/ooxml/scripts/validation/docx.py +274 -274
- package/skills/writing-docs/docx/ooxml/scripts/validation/pptx.py +315 -315
- package/skills/writing-docs/docx/ooxml/scripts/validation/redlining.py +279 -279
- package/skills/writing-docs/docx/ooxml.md +609 -609
- package/skills/writing-docs/docx/scripts/__init__.py +1 -1
- package/skills/writing-docs/docx/scripts/document.py +1276 -1276
- package/skills/writing-docs/docx/scripts/templates/comments.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsExtended.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsExtensible.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsIds.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/people.xml +2 -2
- package/skills/writing-docs/docx/scripts/utilities.py +374 -374
- package/skills/writing-docs/mermaidjs-v11/SKILL.md +115 -115
- package/skills/writing-docs/mermaidjs-v11/references/cli-usage.md +228 -228
- package/skills/writing-docs/mermaidjs-v11/references/configuration.md +232 -232
- package/skills/writing-docs/mermaidjs-v11/references/diagram-types.md +315 -315
- package/skills/writing-docs/mermaidjs-v11/references/examples.md +344 -344
- package/skills/writing-docs/mermaidjs-v11/references/integration.md +310 -310
- package/skills/writing-docs/pdf/LICENSE.txt +30 -30
- package/skills/writing-docs/pdf/SKILL.md +294 -294
- package/skills/writing-docs/pdf/forms.md +205 -205
- package/skills/writing-docs/pdf/reference.md +611 -611
- package/skills/writing-docs/pdf/scripts/check_bounding_boxes.py +70 -70
- package/skills/writing-docs/pdf/scripts/check_bounding_boxes_test.py +226 -226
- package/skills/writing-docs/pdf/scripts/check_fillable_fields.py +12 -12
- package/skills/writing-docs/pdf/scripts/convert_pdf_to_images.py +35 -35
- package/skills/writing-docs/pdf/scripts/create_validation_image.py +41 -41
- package/skills/writing-docs/pdf/scripts/extract_form_field_info.py +152 -152
- package/skills/writing-docs/pdf/scripts/fill_fillable_fields.py +114 -114
- package/skills/writing-docs/pdf/scripts/fill_pdf_form_with_annotations.py +107 -107
- package/skills/writing-docs/pptx/LICENSE.txt +30 -30
- package/skills/writing-docs/pptx/SKILL.md +483 -483
- package/skills/writing-docs/pptx/html2pptx.md +624 -624
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
- package/skills/writing-docs/pptx/ooxml/schemas/mce/mc.xsd +75 -75
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
- package/skills/writing-docs/pptx/ooxml/scripts/pack.py +159 -159
- package/skills/writing-docs/pptx/ooxml/scripts/unpack.py +29 -29
- package/skills/writing-docs/pptx/ooxml/scripts/validate.py +69 -69
- package/skills/writing-docs/pptx/ooxml/scripts/validation/__init__.py +15 -15
- package/skills/writing-docs/pptx/ooxml/scripts/validation/base.py +951 -951
- package/skills/writing-docs/pptx/ooxml/scripts/validation/docx.py +274 -274
- package/skills/writing-docs/pptx/ooxml/scripts/validation/pptx.py +315 -315
- package/skills/writing-docs/pptx/ooxml/scripts/validation/redlining.py +279 -279
- package/skills/writing-docs/pptx/ooxml.md +426 -426
- package/skills/writing-docs/pptx/scripts/html2pptx.js +978 -978
- package/skills/writing-docs/pptx/scripts/inventory.py +1020 -1020
- package/skills/writing-docs/pptx/scripts/rearrange.py +231 -231
- package/skills/writing-docs/pptx/scripts/replace.py +385 -385
- package/skills/writing-docs/pptx/scripts/thumbnail.py +450 -450
- package/skills/writing-docs/slides/LICENSE.txt +201 -201
- package/skills/writing-docs/slides/SKILL.md +71 -71
- package/skills/writing-docs/slides/agents/openai.yaml +6 -6
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/code.js +104 -104
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/image.js +333 -333
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/index.js +33 -33
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/latex.js +51 -51
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout.js +643 -643
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout_builders.js +358 -358
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/svg.js +36 -36
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/text.js +789 -789
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/util.js +24 -24
- package/skills/writing-docs/slides/assets/slides-small.svg +3 -3
- package/skills/writing-docs/slides/references/pptxgenjs-helpers.md +61 -61
- package/skills/writing-docs/slides/scripts/create_montage.py +300 -300
- package/skills/writing-docs/slides/scripts/detect_font.py +873 -873
- package/skills/writing-docs/slides/scripts/ensure_raster_image.py +202 -202
- package/skills/writing-docs/slides/scripts/render_slides.py +273 -273
- package/skills/writing-docs/slides/scripts/slides_test.py +201 -201
- package/skills/writing-docs/template-skill/SKILL.md +26 -26
- package/skills/writing-docs/xlsx/LICENSE.txt +30 -30
- package/skills/writing-docs/xlsx/SKILL.md +288 -288
- package/skills/writing-docs/xlsx/recalc.py +177 -177
- package/src/core/KILO_MASTER.md +448 -448
- package/src/tools/validate-skill.js +421 -421
|
@@ -1,603 +1,603 @@
|
|
|
1
|
-
# Render Configuration Guide
|
|
2
|
-
|
|
3
|
-
Common configuration patterns, best practices, and troubleshooting for Render deployments.
|
|
4
|
-
|
|
5
|
-
## Environment Variables
|
|
6
|
-
|
|
7
|
-
### Required vs Optional Variables
|
|
8
|
-
|
|
9
|
-
**Always declare ALL environment variables in render.yaml**, even if values are provided by user later.
|
|
10
|
-
|
|
11
|
-
**Three categories:**
|
|
12
|
-
|
|
13
|
-
1. **Configuration values** (hardcoded):
|
|
14
|
-
```yaml
|
|
15
|
-
envVars:
|
|
16
|
-
- key: NODE_ENV
|
|
17
|
-
value: production
|
|
18
|
-
- key: LOG_LEVEL
|
|
19
|
-
value: info
|
|
20
|
-
- key: API_URL
|
|
21
|
-
value: https://api.example.com
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
2. **Secrets** (user provides):
|
|
25
|
-
```yaml
|
|
26
|
-
envVars:
|
|
27
|
-
- key: JWT_SECRET
|
|
28
|
-
sync: false
|
|
29
|
-
- key: STRIPE_SECRET_KEY
|
|
30
|
-
sync: false
|
|
31
|
-
- key: API_KEY
|
|
32
|
-
sync: false
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
3. **Auto-generated** (Render provides):
|
|
36
|
-
```yaml
|
|
37
|
-
envVars:
|
|
38
|
-
- key: SESSION_SECRET
|
|
39
|
-
generateValue: true
|
|
40
|
-
- key: ENCRYPTION_KEY
|
|
41
|
-
generateValue: true
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Database Connection Patterns
|
|
45
|
-
|
|
46
|
-
**PostgreSQL:**
|
|
47
|
-
```yaml
|
|
48
|
-
envVars:
|
|
49
|
-
- key: DATABASE_URL
|
|
50
|
-
fromDatabase:
|
|
51
|
-
name: postgres
|
|
52
|
-
property: connectionString
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Redis:**
|
|
56
|
-
```yaml
|
|
57
|
-
envVars:
|
|
58
|
-
- key: REDIS_URL
|
|
59
|
-
fromDatabase:
|
|
60
|
-
name: redis
|
|
61
|
-
property: connectionString
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Multiple databases:**
|
|
65
|
-
```yaml
|
|
66
|
-
envVars:
|
|
67
|
-
- key: PRIMARY_DB_URL
|
|
68
|
-
fromDatabase:
|
|
69
|
-
name: postgres-primary
|
|
70
|
-
property: connectionString
|
|
71
|
-
- key: ANALYTICS_DB_URL
|
|
72
|
-
fromDatabase:
|
|
73
|
-
name: postgres-analytics
|
|
74
|
-
property: connectionString
|
|
75
|
-
- key: CACHE_URL
|
|
76
|
-
fromDatabase:
|
|
77
|
-
name: redis
|
|
78
|
-
property: connectionString
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Cross-Service References
|
|
82
|
-
|
|
83
|
-
Reference other services in your account:
|
|
84
|
-
|
|
85
|
-
```yaml
|
|
86
|
-
services:
|
|
87
|
-
- type: web
|
|
88
|
-
name: frontend
|
|
89
|
-
runtime: node
|
|
90
|
-
envVars:
|
|
91
|
-
- key: API_URL
|
|
92
|
-
fromService:
|
|
93
|
-
name: backend-api
|
|
94
|
-
type: web
|
|
95
|
-
property: host # or hostport, port
|
|
96
|
-
|
|
97
|
-
- type: web
|
|
98
|
-
name: backend-api
|
|
99
|
-
runtime: node
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Available properties:**
|
|
103
|
-
- `host`: Service hostname
|
|
104
|
-
- `port`: Service port
|
|
105
|
-
- `hostport`: Combined `host:port`
|
|
106
|
-
|
|
107
|
-
### Environment Variable Groups
|
|
108
|
-
|
|
109
|
-
Share common configuration across services:
|
|
110
|
-
|
|
111
|
-
```yaml
|
|
112
|
-
envVarGroups:
|
|
113
|
-
- name: common-config
|
|
114
|
-
envVars:
|
|
115
|
-
- key: NODE_ENV
|
|
116
|
-
value: production
|
|
117
|
-
- key: LOG_LEVEL
|
|
118
|
-
value: info
|
|
119
|
-
- key: TZ
|
|
120
|
-
value: UTC
|
|
121
|
-
|
|
122
|
-
services:
|
|
123
|
-
- type: web
|
|
124
|
-
name: web-app
|
|
125
|
-
runtime: node
|
|
126
|
-
envVars:
|
|
127
|
-
- fromGroup: common-config
|
|
128
|
-
- key: PORT
|
|
129
|
-
value: 10000
|
|
130
|
-
|
|
131
|
-
- type: worker
|
|
132
|
-
name: worker
|
|
133
|
-
runtime: node
|
|
134
|
-
envVars:
|
|
135
|
-
- fromGroup: common-config
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Port Binding
|
|
141
|
-
|
|
142
|
-
### The Port Binding Requirement
|
|
143
|
-
|
|
144
|
-
**CRITICAL:** Web services must bind to `0.0.0.0:$PORT`
|
|
145
|
-
|
|
146
|
-
**Why this matters:**
|
|
147
|
-
- Render sets `PORT` environment variable (default: 10000)
|
|
148
|
-
- Services must bind to `0.0.0.0` (not `localhost` or `127.0.0.1`)
|
|
149
|
-
- Health checks fail if port binding is incorrect
|
|
150
|
-
- Deployment will fail or service won't receive traffic
|
|
151
|
-
|
|
152
|
-
### Code Examples by Language
|
|
153
|
-
|
|
154
|
-
**Node.js / Express:**
|
|
155
|
-
```javascript
|
|
156
|
-
const express = require('express');
|
|
157
|
-
const app = express();
|
|
158
|
-
|
|
159
|
-
const PORT = process.env.PORT || 3000;
|
|
160
|
-
|
|
161
|
-
app.listen(PORT, '0.0.0.0', () => {
|
|
162
|
-
console.log(`Server running on port ${PORT}`);
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
**Python / Flask:**
|
|
167
|
-
```python
|
|
168
|
-
import os
|
|
169
|
-
from flask import Flask
|
|
170
|
-
|
|
171
|
-
app = Flask(__name__)
|
|
172
|
-
|
|
173
|
-
if __name__ == '__main__':
|
|
174
|
-
port = int(os.environ.get('PORT', 5000))
|
|
175
|
-
app.run(host='0.0.0.0', port=port)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
**Python / Django:**
|
|
179
|
-
|
|
180
|
-
In `settings.py`:
|
|
181
|
-
```python
|
|
182
|
-
# Django runs on port specified by environment
|
|
183
|
-
ALLOWED_HOSTS = ['*']
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Start command in render.yaml:
|
|
187
|
-
```yaml
|
|
188
|
-
startCommand: gunicorn config.wsgi:application --bind 0.0.0.0:$PORT
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
**Python / FastAPI:**
|
|
192
|
-
```python
|
|
193
|
-
import os
|
|
194
|
-
import uvicorn
|
|
195
|
-
from fastapi import FastAPI
|
|
196
|
-
|
|
197
|
-
app = FastAPI()
|
|
198
|
-
|
|
199
|
-
if __name__ == "__main__":
|
|
200
|
-
port = int(os.environ.get("PORT", 8000))
|
|
201
|
-
uvicorn.run(app, host="0.0.0.0", port=port)
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
Start command:
|
|
205
|
-
```yaml
|
|
206
|
-
startCommand: uvicorn main:app --host 0.0.0.0 --port $PORT
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**Go:**
|
|
210
|
-
```go
|
|
211
|
-
package main
|
|
212
|
-
|
|
213
|
-
import (
|
|
214
|
-
"fmt"
|
|
215
|
-
"net/http"
|
|
216
|
-
"os"
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
func main() {
|
|
220
|
-
port := os.Getenv("PORT")
|
|
221
|
-
if port == "" {
|
|
222
|
-
port = "3000"
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
http.HandleFunc("/", handler)
|
|
226
|
-
fmt.Printf("Server starting on port %s\n", port)
|
|
227
|
-
http.ListenAndServe(":"+port, nil)
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**Ruby / Rails:**
|
|
232
|
-
|
|
233
|
-
In `config/puma.rb`:
|
|
234
|
-
```ruby
|
|
235
|
-
port ENV.fetch("PORT") { 3000 }
|
|
236
|
-
bind "tcp://0.0.0.0:#{ENV.fetch('PORT', 3000)}"
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
**Rust / Actix:**
|
|
240
|
-
```rust
|
|
241
|
-
use actix_web::{App, HttpServer};
|
|
242
|
-
use std::env;
|
|
243
|
-
|
|
244
|
-
#[actix_web::main]
|
|
245
|
-
async fn main() -> std::io::Result<()> {
|
|
246
|
-
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
|
247
|
-
let addr = format!("0.0.0.0:{}", port);
|
|
248
|
-
|
|
249
|
-
HttpServer::new(|| App::new())
|
|
250
|
-
.bind(&addr)?
|
|
251
|
-
.run()
|
|
252
|
-
.await
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Build Commands
|
|
259
|
-
|
|
260
|
-
### Non-Interactive Flags
|
|
261
|
-
|
|
262
|
-
**Always use non-interactive flags** to prevent builds from hanging waiting for input.
|
|
263
|
-
|
|
264
|
-
**npm (Node.js):**
|
|
265
|
-
```yaml
|
|
266
|
-
buildCommand: npm ci
|
|
267
|
-
# NOT: npm install
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**pip (Python):**
|
|
271
|
-
```yaml
|
|
272
|
-
buildCommand: pip install -r requirements.txt
|
|
273
|
-
# Already non-interactive
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
**apt (System packages):**
|
|
277
|
-
```yaml
|
|
278
|
-
buildCommand: apt-get update && apt-get install -y libpq-dev
|
|
279
|
-
# Use -y flag to auto-confirm
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**bundler (Ruby):**
|
|
283
|
-
```yaml
|
|
284
|
-
buildCommand: bundle install --jobs=4 --retry=3
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### Build with Additional Steps
|
|
288
|
-
|
|
289
|
-
**Node.js with build step:**
|
|
290
|
-
```yaml
|
|
291
|
-
buildCommand: npm ci && npm run build
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
**Python Django with static files:**
|
|
295
|
-
```yaml
|
|
296
|
-
buildCommand: pip install -r requirements.txt && python manage.py collectstatic --no-input
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
**Ruby Rails with assets:**
|
|
300
|
-
```yaml
|
|
301
|
-
buildCommand: bundle install && bundle exec rails assets:precompile
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
### Build Timeouts
|
|
305
|
-
|
|
306
|
-
**Free tier:** 15 minutes
|
|
307
|
-
**Paid tiers:** Configurable
|
|
308
|
-
|
|
309
|
-
**If builds timeout:**
|
|
310
|
-
1. Optimize dependencies (remove unused packages)
|
|
311
|
-
2. Use build caching
|
|
312
|
-
3. Consider pre-building in CI/CD
|
|
313
|
-
4. Upgrade to paid tier for longer timeouts
|
|
314
|
-
|
|
315
|
-
---
|
|
316
|
-
|
|
317
|
-
## Database Connections
|
|
318
|
-
|
|
319
|
-
### Internal vs External URLs
|
|
320
|
-
|
|
321
|
-
**Use internal URLs for better performance:**
|
|
322
|
-
|
|
323
|
-
When using `fromDatabase`, Render automatically provides internal `.render-internal.com` URLs:
|
|
324
|
-
|
|
325
|
-
```yaml
|
|
326
|
-
envVars:
|
|
327
|
-
- key: DATABASE_URL
|
|
328
|
-
fromDatabase:
|
|
329
|
-
name: postgres
|
|
330
|
-
property: connectionString
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
This provides: `postgresql://user:pass@postgres.render-internal.com:5432/db`
|
|
334
|
-
|
|
335
|
-
**Benefits:**
|
|
336
|
-
- Lower latency (same data center)
|
|
337
|
-
- No external bandwidth charges
|
|
338
|
-
- Automatic internal DNS
|
|
339
|
-
|
|
340
|
-
### Connection Pooling
|
|
341
|
-
|
|
342
|
-
**Node.js / PostgreSQL:**
|
|
343
|
-
```javascript
|
|
344
|
-
const { Pool } = require('pg');
|
|
345
|
-
|
|
346
|
-
const pool = new Pool({
|
|
347
|
-
connectionString: process.env.DATABASE_URL,
|
|
348
|
-
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false,
|
|
349
|
-
max: 20, // Maximum pool size
|
|
350
|
-
idleTimeoutMillis: 30000,
|
|
351
|
-
connectionTimeoutMillis: 2000,
|
|
352
|
-
});
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
**Python / PostgreSQL:**
|
|
356
|
-
```python
|
|
357
|
-
import psycopg2.pool
|
|
358
|
-
|
|
359
|
-
pool = psycopg2.pool.SimpleConnectionPool(
|
|
360
|
-
minconn=1,
|
|
361
|
-
maxconn=20,
|
|
362
|
-
dsn=os.environ['DATABASE_URL']
|
|
363
|
-
)
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
**Django Settings:**
|
|
367
|
-
```python
|
|
368
|
-
DATABASES = {
|
|
369
|
-
'default': {
|
|
370
|
-
'ENGINE': 'django.db.backends.postgresql',
|
|
371
|
-
'URL': os.environ['DATABASE_URL'],
|
|
372
|
-
'CONN_MAX_AGE': 600, # Connection pooling
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
### Database Migrations
|
|
378
|
-
|
|
379
|
-
**Run migrations during build:**
|
|
380
|
-
|
|
381
|
-
**Django:**
|
|
382
|
-
```yaml
|
|
383
|
-
buildCommand: pip install -r requirements.txt && python manage.py migrate
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
**Rails:**
|
|
387
|
-
```yaml
|
|
388
|
-
buildCommand: bundle install && bundle exec rails db:migrate
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
**Node.js / Prisma:**
|
|
392
|
-
```yaml
|
|
393
|
-
buildCommand: npm ci && npx prisma migrate deploy
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
---
|
|
397
|
-
|
|
398
|
-
## Free Tier Limitations
|
|
399
|
-
|
|
400
|
-
### What's Included
|
|
401
|
-
|
|
402
|
-
**Free tier provides:**
|
|
403
|
-
- 1 web service
|
|
404
|
-
- 1 PostgreSQL database (1 GB storage, 97 MB RAM)
|
|
405
|
-
- 750 hours/month compute
|
|
406
|
-
- 512 MB RAM per service
|
|
407
|
-
- 0.5 CPU per service
|
|
408
|
-
- 100 GB bandwidth/month
|
|
409
|
-
|
|
410
|
-
### Resource Limits
|
|
411
|
-
|
|
412
|
-
**Memory (512 MB):**
|
|
413
|
-
- Monitor memory usage in logs
|
|
414
|
-
- Optimize for memory-constrained environments
|
|
415
|
-
- Use lightweight dependencies
|
|
416
|
-
|
|
417
|
-
**CPU (0.5 cores):**
|
|
418
|
-
- Suitable for low-traffic applications
|
|
419
|
-
- Consider upgrading for higher traffic
|
|
420
|
-
|
|
421
|
-
**Spin Down (Free services):**
|
|
422
|
-
- Services spin down after 15 minutes of inactivity
|
|
423
|
-
- First request after spin down takes ~30 seconds (cold start)
|
|
424
|
-
- Upgrade to paid tier for always-on services
|
|
425
|
-
|
|
426
|
-
### When to Upgrade
|
|
427
|
-
|
|
428
|
-
**Upgrade to paid plan when:**
|
|
429
|
-
- Need more than 1 web service
|
|
430
|
-
- Need always-on services (no spin down)
|
|
431
|
-
- Traffic exceeds free tier limits
|
|
432
|
-
- Need more memory/CPU
|
|
433
|
-
- Need faster build times
|
|
434
|
-
- Need preview environments
|
|
435
|
-
|
|
436
|
-
---
|
|
437
|
-
|
|
438
|
-
## Health Checks
|
|
439
|
-
|
|
440
|
-
### Adding Health Check Endpoints
|
|
441
|
-
|
|
442
|
-
**Node.js / Express:**
|
|
443
|
-
```javascript
|
|
444
|
-
app.get('/health', (req, res) => {
|
|
445
|
-
res.status(200).json({
|
|
446
|
-
status: 'ok',
|
|
447
|
-
timestamp: new Date().toISOString()
|
|
448
|
-
});
|
|
449
|
-
});
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
**Python / Flask:**
|
|
453
|
-
```python
|
|
454
|
-
@app.route('/health')
|
|
455
|
-
def health():
|
|
456
|
-
return {'status': 'ok'}, 200
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
**Python / FastAPI:**
|
|
460
|
-
```python
|
|
461
|
-
@app.get("/health")
|
|
462
|
-
async def health():
|
|
463
|
-
return {"status": "ok"}
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
**Go:**
|
|
467
|
-
```go
|
|
468
|
-
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
|
|
469
|
-
w.WriteHeader(http.StatusOK)
|
|
470
|
-
w.Write([]byte(`{"status":"ok"}`))
|
|
471
|
-
})
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
### Configure in render.yaml
|
|
475
|
-
|
|
476
|
-
```yaml
|
|
477
|
-
services:
|
|
478
|
-
- type: web
|
|
479
|
-
name: my-app
|
|
480
|
-
runtime: node
|
|
481
|
-
healthCheckPath: /health
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
**Benefits:**
|
|
485
|
-
- Faster deployment detection
|
|
486
|
-
- Better monitoring
|
|
487
|
-
- Automatic restart on health check failures
|
|
488
|
-
|
|
489
|
-
---
|
|
490
|
-
|
|
491
|
-
## Common Deployment Issues
|
|
492
|
-
|
|
493
|
-
### Issue 1: Missing Environment Variables
|
|
494
|
-
|
|
495
|
-
**Symptom:** Service crashes with "undefined variable" errors
|
|
496
|
-
|
|
497
|
-
**Solution:** Add all required env vars to render.yaml:
|
|
498
|
-
```yaml
|
|
499
|
-
envVars:
|
|
500
|
-
- key: DATABASE_URL
|
|
501
|
-
fromDatabase:
|
|
502
|
-
name: postgres
|
|
503
|
-
property: connectionString
|
|
504
|
-
- key: JWT_SECRET
|
|
505
|
-
sync: false # User fills in Dashboard
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
### Issue 2: Port Binding Errors
|
|
509
|
-
|
|
510
|
-
**Symptom:** `EADDRINUSE` or health check timeout errors
|
|
511
|
-
|
|
512
|
-
**Solution:** Ensure app binds to `0.0.0.0:$PORT`:
|
|
513
|
-
```javascript
|
|
514
|
-
const PORT = process.env.PORT || 3000;
|
|
515
|
-
app.listen(PORT, '0.0.0.0');
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
### Issue 3: Build Hangs
|
|
519
|
-
|
|
520
|
-
**Symptom:** Build times out after 15 minutes
|
|
521
|
-
|
|
522
|
-
**Solution:** Use non-interactive build commands:
|
|
523
|
-
```yaml
|
|
524
|
-
buildCommand: npm ci # NOT npm install
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### Issue 4: Database Connection Fails
|
|
528
|
-
|
|
529
|
-
**Symptom:** `ECONNREFUSED` on port 5432
|
|
530
|
-
|
|
531
|
-
**Solutions:**
|
|
532
|
-
1. Use `fromDatabase` for automatic internal URLs
|
|
533
|
-
2. Enable SSL for external connections
|
|
534
|
-
3. Check `ipAllowList` settings
|
|
535
|
-
|
|
536
|
-
### Issue 5: Static Site 404s
|
|
537
|
-
|
|
538
|
-
**Symptom:** Client-side routes return 404
|
|
539
|
-
|
|
540
|
-
**Solution:** Add SPA rewrite rules:
|
|
541
|
-
```yaml
|
|
542
|
-
routes:
|
|
543
|
-
- type: rewrite
|
|
544
|
-
source: /*
|
|
545
|
-
destination: /index.html
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
### Issue 6: Out of Memory (OOM)
|
|
549
|
-
|
|
550
|
-
**Symptom:** Service crashes with `JavaScript heap out of memory`
|
|
551
|
-
|
|
552
|
-
**Solutions:**
|
|
553
|
-
1. Optimize application memory usage
|
|
554
|
-
2. Reduce dependency size
|
|
555
|
-
3. Upgrade to higher plan with more RAM
|
|
556
|
-
|
|
557
|
-
---
|
|
558
|
-
|
|
559
|
-
## Best Practices Checklist
|
|
560
|
-
|
|
561
|
-
**Environment Variables:**
|
|
562
|
-
- [ ] All env vars declared in render.yaml
|
|
563
|
-
- [ ] Secrets marked with `sync: false`
|
|
564
|
-
- [ ] Database URLs use `fromDatabase` references
|
|
565
|
-
|
|
566
|
-
**Port Binding:**
|
|
567
|
-
- [ ] App binds to `process.env.PORT`
|
|
568
|
-
- [ ] Bind to `0.0.0.0` (not `localhost`)
|
|
569
|
-
|
|
570
|
-
**Build Commands:**
|
|
571
|
-
- [ ] Use non-interactive flags (`npm ci`, `-y`, etc.)
|
|
572
|
-
- [ ] Build completes under 15 minutes (free tier)
|
|
573
|
-
|
|
574
|
-
**Start Commands:**
|
|
575
|
-
- [ ] Command starts HTTP server correctly
|
|
576
|
-
- [ ] Server binds to correct port
|
|
577
|
-
|
|
578
|
-
**Health Checks:**
|
|
579
|
-
- [ ] `/health` endpoint implemented
|
|
580
|
-
- [ ] Returns 200 status code
|
|
581
|
-
|
|
582
|
-
**Database:**
|
|
583
|
-
- [ ] Connection pooling configured
|
|
584
|
-
- [ ] Using internal URLs (`.render-internal.com`)
|
|
585
|
-
- [ ] SSL enabled if needed
|
|
586
|
-
|
|
587
|
-
**Plans:**
|
|
588
|
-
- [ ] Using `plan: free` by default
|
|
589
|
-
- [ ] Documented upgrade path for users
|
|
590
|
-
|
|
591
|
-
**Git Repository:**
|
|
592
|
-
- [ ] render.yaml committed to repository
|
|
593
|
-
- [ ] Pushed to git remote (GitHub/GitLab/Bitbucket)
|
|
594
|
-
- [ ] Branch specified in render.yaml (if not main)
|
|
595
|
-
|
|
596
|
-
---
|
|
597
|
-
|
|
598
|
-
## Additional Resources
|
|
599
|
-
|
|
600
|
-
- Blueprint Specification: [blueprint-spec.md](blueprint-spec.md)
|
|
601
|
-
- Service Types: [service-types.md](service-types.md)
|
|
602
|
-
- Runtimes: [runtimes.md](runtimes.md)
|
|
603
|
-
- Official Render Docs: https://render.com/docs
|
|
1
|
+
# Render Configuration Guide
|
|
2
|
+
|
|
3
|
+
Common configuration patterns, best practices, and troubleshooting for Render deployments.
|
|
4
|
+
|
|
5
|
+
## Environment Variables
|
|
6
|
+
|
|
7
|
+
### Required vs Optional Variables
|
|
8
|
+
|
|
9
|
+
**Always declare ALL environment variables in render.yaml**, even if values are provided by user later.
|
|
10
|
+
|
|
11
|
+
**Three categories:**
|
|
12
|
+
|
|
13
|
+
1. **Configuration values** (hardcoded):
|
|
14
|
+
```yaml
|
|
15
|
+
envVars:
|
|
16
|
+
- key: NODE_ENV
|
|
17
|
+
value: production
|
|
18
|
+
- key: LOG_LEVEL
|
|
19
|
+
value: info
|
|
20
|
+
- key: API_URL
|
|
21
|
+
value: https://api.example.com
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
2. **Secrets** (user provides):
|
|
25
|
+
```yaml
|
|
26
|
+
envVars:
|
|
27
|
+
- key: JWT_SECRET
|
|
28
|
+
sync: false
|
|
29
|
+
- key: STRIPE_SECRET_KEY
|
|
30
|
+
sync: false
|
|
31
|
+
- key: API_KEY
|
|
32
|
+
sync: false
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. **Auto-generated** (Render provides):
|
|
36
|
+
```yaml
|
|
37
|
+
envVars:
|
|
38
|
+
- key: SESSION_SECRET
|
|
39
|
+
generateValue: true
|
|
40
|
+
- key: ENCRYPTION_KEY
|
|
41
|
+
generateValue: true
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Database Connection Patterns
|
|
45
|
+
|
|
46
|
+
**PostgreSQL:**
|
|
47
|
+
```yaml
|
|
48
|
+
envVars:
|
|
49
|
+
- key: DATABASE_URL
|
|
50
|
+
fromDatabase:
|
|
51
|
+
name: postgres
|
|
52
|
+
property: connectionString
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Redis:**
|
|
56
|
+
```yaml
|
|
57
|
+
envVars:
|
|
58
|
+
- key: REDIS_URL
|
|
59
|
+
fromDatabase:
|
|
60
|
+
name: redis
|
|
61
|
+
property: connectionString
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Multiple databases:**
|
|
65
|
+
```yaml
|
|
66
|
+
envVars:
|
|
67
|
+
- key: PRIMARY_DB_URL
|
|
68
|
+
fromDatabase:
|
|
69
|
+
name: postgres-primary
|
|
70
|
+
property: connectionString
|
|
71
|
+
- key: ANALYTICS_DB_URL
|
|
72
|
+
fromDatabase:
|
|
73
|
+
name: postgres-analytics
|
|
74
|
+
property: connectionString
|
|
75
|
+
- key: CACHE_URL
|
|
76
|
+
fromDatabase:
|
|
77
|
+
name: redis
|
|
78
|
+
property: connectionString
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Cross-Service References
|
|
82
|
+
|
|
83
|
+
Reference other services in your account:
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
services:
|
|
87
|
+
- type: web
|
|
88
|
+
name: frontend
|
|
89
|
+
runtime: node
|
|
90
|
+
envVars:
|
|
91
|
+
- key: API_URL
|
|
92
|
+
fromService:
|
|
93
|
+
name: backend-api
|
|
94
|
+
type: web
|
|
95
|
+
property: host # or hostport, port
|
|
96
|
+
|
|
97
|
+
- type: web
|
|
98
|
+
name: backend-api
|
|
99
|
+
runtime: node
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Available properties:**
|
|
103
|
+
- `host`: Service hostname
|
|
104
|
+
- `port`: Service port
|
|
105
|
+
- `hostport`: Combined `host:port`
|
|
106
|
+
|
|
107
|
+
### Environment Variable Groups
|
|
108
|
+
|
|
109
|
+
Share common configuration across services:
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
envVarGroups:
|
|
113
|
+
- name: common-config
|
|
114
|
+
envVars:
|
|
115
|
+
- key: NODE_ENV
|
|
116
|
+
value: production
|
|
117
|
+
- key: LOG_LEVEL
|
|
118
|
+
value: info
|
|
119
|
+
- key: TZ
|
|
120
|
+
value: UTC
|
|
121
|
+
|
|
122
|
+
services:
|
|
123
|
+
- type: web
|
|
124
|
+
name: web-app
|
|
125
|
+
runtime: node
|
|
126
|
+
envVars:
|
|
127
|
+
- fromGroup: common-config
|
|
128
|
+
- key: PORT
|
|
129
|
+
value: 10000
|
|
130
|
+
|
|
131
|
+
- type: worker
|
|
132
|
+
name: worker
|
|
133
|
+
runtime: node
|
|
134
|
+
envVars:
|
|
135
|
+
- fromGroup: common-config
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Port Binding
|
|
141
|
+
|
|
142
|
+
### The Port Binding Requirement
|
|
143
|
+
|
|
144
|
+
**CRITICAL:** Web services must bind to `0.0.0.0:$PORT`
|
|
145
|
+
|
|
146
|
+
**Why this matters:**
|
|
147
|
+
- Render sets `PORT` environment variable (default: 10000)
|
|
148
|
+
- Services must bind to `0.0.0.0` (not `localhost` or `127.0.0.1`)
|
|
149
|
+
- Health checks fail if port binding is incorrect
|
|
150
|
+
- Deployment will fail or service won't receive traffic
|
|
151
|
+
|
|
152
|
+
### Code Examples by Language
|
|
153
|
+
|
|
154
|
+
**Node.js / Express:**
|
|
155
|
+
```javascript
|
|
156
|
+
const express = require('express');
|
|
157
|
+
const app = express();
|
|
158
|
+
|
|
159
|
+
const PORT = process.env.PORT || 3000;
|
|
160
|
+
|
|
161
|
+
app.listen(PORT, '0.0.0.0', () => {
|
|
162
|
+
console.log(`Server running on port ${PORT}`);
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Python / Flask:**
|
|
167
|
+
```python
|
|
168
|
+
import os
|
|
169
|
+
from flask import Flask
|
|
170
|
+
|
|
171
|
+
app = Flask(__name__)
|
|
172
|
+
|
|
173
|
+
if __name__ == '__main__':
|
|
174
|
+
port = int(os.environ.get('PORT', 5000))
|
|
175
|
+
app.run(host='0.0.0.0', port=port)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Python / Django:**
|
|
179
|
+
|
|
180
|
+
In `settings.py`:
|
|
181
|
+
```python
|
|
182
|
+
# Django runs on port specified by environment
|
|
183
|
+
ALLOWED_HOSTS = ['*']
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Start command in render.yaml:
|
|
187
|
+
```yaml
|
|
188
|
+
startCommand: gunicorn config.wsgi:application --bind 0.0.0.0:$PORT
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Python / FastAPI:**
|
|
192
|
+
```python
|
|
193
|
+
import os
|
|
194
|
+
import uvicorn
|
|
195
|
+
from fastapi import FastAPI
|
|
196
|
+
|
|
197
|
+
app = FastAPI()
|
|
198
|
+
|
|
199
|
+
if __name__ == "__main__":
|
|
200
|
+
port = int(os.environ.get("PORT", 8000))
|
|
201
|
+
uvicorn.run(app, host="0.0.0.0", port=port)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Start command:
|
|
205
|
+
```yaml
|
|
206
|
+
startCommand: uvicorn main:app --host 0.0.0.0 --port $PORT
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Go:**
|
|
210
|
+
```go
|
|
211
|
+
package main
|
|
212
|
+
|
|
213
|
+
import (
|
|
214
|
+
"fmt"
|
|
215
|
+
"net/http"
|
|
216
|
+
"os"
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
func main() {
|
|
220
|
+
port := os.Getenv("PORT")
|
|
221
|
+
if port == "" {
|
|
222
|
+
port = "3000"
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
http.HandleFunc("/", handler)
|
|
226
|
+
fmt.Printf("Server starting on port %s\n", port)
|
|
227
|
+
http.ListenAndServe(":"+port, nil)
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Ruby / Rails:**
|
|
232
|
+
|
|
233
|
+
In `config/puma.rb`:
|
|
234
|
+
```ruby
|
|
235
|
+
port ENV.fetch("PORT") { 3000 }
|
|
236
|
+
bind "tcp://0.0.0.0:#{ENV.fetch('PORT', 3000)}"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Rust / Actix:**
|
|
240
|
+
```rust
|
|
241
|
+
use actix_web::{App, HttpServer};
|
|
242
|
+
use std::env;
|
|
243
|
+
|
|
244
|
+
#[actix_web::main]
|
|
245
|
+
async fn main() -> std::io::Result<()> {
|
|
246
|
+
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
|
247
|
+
let addr = format!("0.0.0.0:{}", port);
|
|
248
|
+
|
|
249
|
+
HttpServer::new(|| App::new())
|
|
250
|
+
.bind(&addr)?
|
|
251
|
+
.run()
|
|
252
|
+
.await
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Build Commands
|
|
259
|
+
|
|
260
|
+
### Non-Interactive Flags
|
|
261
|
+
|
|
262
|
+
**Always use non-interactive flags** to prevent builds from hanging waiting for input.
|
|
263
|
+
|
|
264
|
+
**npm (Node.js):**
|
|
265
|
+
```yaml
|
|
266
|
+
buildCommand: npm ci
|
|
267
|
+
# NOT: npm install
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**pip (Python):**
|
|
271
|
+
```yaml
|
|
272
|
+
buildCommand: pip install -r requirements.txt
|
|
273
|
+
# Already non-interactive
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**apt (System packages):**
|
|
277
|
+
```yaml
|
|
278
|
+
buildCommand: apt-get update && apt-get install -y libpq-dev
|
|
279
|
+
# Use -y flag to auto-confirm
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**bundler (Ruby):**
|
|
283
|
+
```yaml
|
|
284
|
+
buildCommand: bundle install --jobs=4 --retry=3
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Build with Additional Steps
|
|
288
|
+
|
|
289
|
+
**Node.js with build step:**
|
|
290
|
+
```yaml
|
|
291
|
+
buildCommand: npm ci && npm run build
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Python Django with static files:**
|
|
295
|
+
```yaml
|
|
296
|
+
buildCommand: pip install -r requirements.txt && python manage.py collectstatic --no-input
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Ruby Rails with assets:**
|
|
300
|
+
```yaml
|
|
301
|
+
buildCommand: bundle install && bundle exec rails assets:precompile
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Build Timeouts
|
|
305
|
+
|
|
306
|
+
**Free tier:** 15 minutes
|
|
307
|
+
**Paid tiers:** Configurable
|
|
308
|
+
|
|
309
|
+
**If builds timeout:**
|
|
310
|
+
1. Optimize dependencies (remove unused packages)
|
|
311
|
+
2. Use build caching
|
|
312
|
+
3. Consider pre-building in CI/CD
|
|
313
|
+
4. Upgrade to paid tier for longer timeouts
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Database Connections
|
|
318
|
+
|
|
319
|
+
### Internal vs External URLs
|
|
320
|
+
|
|
321
|
+
**Use internal URLs for better performance:**
|
|
322
|
+
|
|
323
|
+
When using `fromDatabase`, Render automatically provides internal `.render-internal.com` URLs:
|
|
324
|
+
|
|
325
|
+
```yaml
|
|
326
|
+
envVars:
|
|
327
|
+
- key: DATABASE_URL
|
|
328
|
+
fromDatabase:
|
|
329
|
+
name: postgres
|
|
330
|
+
property: connectionString
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
This provides: `postgresql://user:pass@postgres.render-internal.com:5432/db`
|
|
334
|
+
|
|
335
|
+
**Benefits:**
|
|
336
|
+
- Lower latency (same data center)
|
|
337
|
+
- No external bandwidth charges
|
|
338
|
+
- Automatic internal DNS
|
|
339
|
+
|
|
340
|
+
### Connection Pooling
|
|
341
|
+
|
|
342
|
+
**Node.js / PostgreSQL:**
|
|
343
|
+
```javascript
|
|
344
|
+
const { Pool } = require('pg');
|
|
345
|
+
|
|
346
|
+
const pool = new Pool({
|
|
347
|
+
connectionString: process.env.DATABASE_URL,
|
|
348
|
+
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false,
|
|
349
|
+
max: 20, // Maximum pool size
|
|
350
|
+
idleTimeoutMillis: 30000,
|
|
351
|
+
connectionTimeoutMillis: 2000,
|
|
352
|
+
});
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Python / PostgreSQL:**
|
|
356
|
+
```python
|
|
357
|
+
import psycopg2.pool
|
|
358
|
+
|
|
359
|
+
pool = psycopg2.pool.SimpleConnectionPool(
|
|
360
|
+
minconn=1,
|
|
361
|
+
maxconn=20,
|
|
362
|
+
dsn=os.environ['DATABASE_URL']
|
|
363
|
+
)
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Django Settings:**
|
|
367
|
+
```python
|
|
368
|
+
DATABASES = {
|
|
369
|
+
'default': {
|
|
370
|
+
'ENGINE': 'django.db.backends.postgresql',
|
|
371
|
+
'URL': os.environ['DATABASE_URL'],
|
|
372
|
+
'CONN_MAX_AGE': 600, # Connection pooling
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Database Migrations
|
|
378
|
+
|
|
379
|
+
**Run migrations during build:**
|
|
380
|
+
|
|
381
|
+
**Django:**
|
|
382
|
+
```yaml
|
|
383
|
+
buildCommand: pip install -r requirements.txt && python manage.py migrate
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
**Rails:**
|
|
387
|
+
```yaml
|
|
388
|
+
buildCommand: bundle install && bundle exec rails db:migrate
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**Node.js / Prisma:**
|
|
392
|
+
```yaml
|
|
393
|
+
buildCommand: npm ci && npx prisma migrate deploy
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Free Tier Limitations
|
|
399
|
+
|
|
400
|
+
### What's Included
|
|
401
|
+
|
|
402
|
+
**Free tier provides:**
|
|
403
|
+
- 1 web service
|
|
404
|
+
- 1 PostgreSQL database (1 GB storage, 97 MB RAM)
|
|
405
|
+
- 750 hours/month compute
|
|
406
|
+
- 512 MB RAM per service
|
|
407
|
+
- 0.5 CPU per service
|
|
408
|
+
- 100 GB bandwidth/month
|
|
409
|
+
|
|
410
|
+
### Resource Limits
|
|
411
|
+
|
|
412
|
+
**Memory (512 MB):**
|
|
413
|
+
- Monitor memory usage in logs
|
|
414
|
+
- Optimize for memory-constrained environments
|
|
415
|
+
- Use lightweight dependencies
|
|
416
|
+
|
|
417
|
+
**CPU (0.5 cores):**
|
|
418
|
+
- Suitable for low-traffic applications
|
|
419
|
+
- Consider upgrading for higher traffic
|
|
420
|
+
|
|
421
|
+
**Spin Down (Free services):**
|
|
422
|
+
- Services spin down after 15 minutes of inactivity
|
|
423
|
+
- First request after spin down takes ~30 seconds (cold start)
|
|
424
|
+
- Upgrade to paid tier for always-on services
|
|
425
|
+
|
|
426
|
+
### When to Upgrade
|
|
427
|
+
|
|
428
|
+
**Upgrade to paid plan when:**
|
|
429
|
+
- Need more than 1 web service
|
|
430
|
+
- Need always-on services (no spin down)
|
|
431
|
+
- Traffic exceeds free tier limits
|
|
432
|
+
- Need more memory/CPU
|
|
433
|
+
- Need faster build times
|
|
434
|
+
- Need preview environments
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Health Checks
|
|
439
|
+
|
|
440
|
+
### Adding Health Check Endpoints
|
|
441
|
+
|
|
442
|
+
**Node.js / Express:**
|
|
443
|
+
```javascript
|
|
444
|
+
app.get('/health', (req, res) => {
|
|
445
|
+
res.status(200).json({
|
|
446
|
+
status: 'ok',
|
|
447
|
+
timestamp: new Date().toISOString()
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
**Python / Flask:**
|
|
453
|
+
```python
|
|
454
|
+
@app.route('/health')
|
|
455
|
+
def health():
|
|
456
|
+
return {'status': 'ok'}, 200
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**Python / FastAPI:**
|
|
460
|
+
```python
|
|
461
|
+
@app.get("/health")
|
|
462
|
+
async def health():
|
|
463
|
+
return {"status": "ok"}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**Go:**
|
|
467
|
+
```go
|
|
468
|
+
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
|
|
469
|
+
w.WriteHeader(http.StatusOK)
|
|
470
|
+
w.Write([]byte(`{"status":"ok"}`))
|
|
471
|
+
})
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Configure in render.yaml
|
|
475
|
+
|
|
476
|
+
```yaml
|
|
477
|
+
services:
|
|
478
|
+
- type: web
|
|
479
|
+
name: my-app
|
|
480
|
+
runtime: node
|
|
481
|
+
healthCheckPath: /health
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Benefits:**
|
|
485
|
+
- Faster deployment detection
|
|
486
|
+
- Better monitoring
|
|
487
|
+
- Automatic restart on health check failures
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Common Deployment Issues
|
|
492
|
+
|
|
493
|
+
### Issue 1: Missing Environment Variables
|
|
494
|
+
|
|
495
|
+
**Symptom:** Service crashes with "undefined variable" errors
|
|
496
|
+
|
|
497
|
+
**Solution:** Add all required env vars to render.yaml:
|
|
498
|
+
```yaml
|
|
499
|
+
envVars:
|
|
500
|
+
- key: DATABASE_URL
|
|
501
|
+
fromDatabase:
|
|
502
|
+
name: postgres
|
|
503
|
+
property: connectionString
|
|
504
|
+
- key: JWT_SECRET
|
|
505
|
+
sync: false # User fills in Dashboard
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Issue 2: Port Binding Errors
|
|
509
|
+
|
|
510
|
+
**Symptom:** `EADDRINUSE` or health check timeout errors
|
|
511
|
+
|
|
512
|
+
**Solution:** Ensure app binds to `0.0.0.0:$PORT`:
|
|
513
|
+
```javascript
|
|
514
|
+
const PORT = process.env.PORT || 3000;
|
|
515
|
+
app.listen(PORT, '0.0.0.0');
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Issue 3: Build Hangs
|
|
519
|
+
|
|
520
|
+
**Symptom:** Build times out after 15 minutes
|
|
521
|
+
|
|
522
|
+
**Solution:** Use non-interactive build commands:
|
|
523
|
+
```yaml
|
|
524
|
+
buildCommand: npm ci # NOT npm install
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### Issue 4: Database Connection Fails
|
|
528
|
+
|
|
529
|
+
**Symptom:** `ECONNREFUSED` on port 5432
|
|
530
|
+
|
|
531
|
+
**Solutions:**
|
|
532
|
+
1. Use `fromDatabase` for automatic internal URLs
|
|
533
|
+
2. Enable SSL for external connections
|
|
534
|
+
3. Check `ipAllowList` settings
|
|
535
|
+
|
|
536
|
+
### Issue 5: Static Site 404s
|
|
537
|
+
|
|
538
|
+
**Symptom:** Client-side routes return 404
|
|
539
|
+
|
|
540
|
+
**Solution:** Add SPA rewrite rules:
|
|
541
|
+
```yaml
|
|
542
|
+
routes:
|
|
543
|
+
- type: rewrite
|
|
544
|
+
source: /*
|
|
545
|
+
destination: /index.html
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### Issue 6: Out of Memory (OOM)
|
|
549
|
+
|
|
550
|
+
**Symptom:** Service crashes with `JavaScript heap out of memory`
|
|
551
|
+
|
|
552
|
+
**Solutions:**
|
|
553
|
+
1. Optimize application memory usage
|
|
554
|
+
2. Reduce dependency size
|
|
555
|
+
3. Upgrade to higher plan with more RAM
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## Best Practices Checklist
|
|
560
|
+
|
|
561
|
+
**Environment Variables:**
|
|
562
|
+
- [ ] All env vars declared in render.yaml
|
|
563
|
+
- [ ] Secrets marked with `sync: false`
|
|
564
|
+
- [ ] Database URLs use `fromDatabase` references
|
|
565
|
+
|
|
566
|
+
**Port Binding:**
|
|
567
|
+
- [ ] App binds to `process.env.PORT`
|
|
568
|
+
- [ ] Bind to `0.0.0.0` (not `localhost`)
|
|
569
|
+
|
|
570
|
+
**Build Commands:**
|
|
571
|
+
- [ ] Use non-interactive flags (`npm ci`, `-y`, etc.)
|
|
572
|
+
- [ ] Build completes under 15 minutes (free tier)
|
|
573
|
+
|
|
574
|
+
**Start Commands:**
|
|
575
|
+
- [ ] Command starts HTTP server correctly
|
|
576
|
+
- [ ] Server binds to correct port
|
|
577
|
+
|
|
578
|
+
**Health Checks:**
|
|
579
|
+
- [ ] `/health` endpoint implemented
|
|
580
|
+
- [ ] Returns 200 status code
|
|
581
|
+
|
|
582
|
+
**Database:**
|
|
583
|
+
- [ ] Connection pooling configured
|
|
584
|
+
- [ ] Using internal URLs (`.render-internal.com`)
|
|
585
|
+
- [ ] SSL enabled if needed
|
|
586
|
+
|
|
587
|
+
**Plans:**
|
|
588
|
+
- [ ] Using `plan: free` by default
|
|
589
|
+
- [ ] Documented upgrade path for users
|
|
590
|
+
|
|
591
|
+
**Git Repository:**
|
|
592
|
+
- [ ] render.yaml committed to repository
|
|
593
|
+
- [ ] Pushed to git remote (GitHub/GitLab/Bitbucket)
|
|
594
|
+
- [ ] Branch specified in render.yaml (if not main)
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## Additional Resources
|
|
599
|
+
|
|
600
|
+
- Blueprint Specification: [blueprint-spec.md](blueprint-spec.md)
|
|
601
|
+
- Service Types: [service-types.md](service-types.md)
|
|
602
|
+
- Runtimes: [runtimes.md](runtimes.md)
|
|
603
|
+
- Official Render Docs: https://render.com/docs
|