{
  "manifest_version": "1.0.0",
  "template": {
    "id": "2f54119b-ae7b-461e-90be-350a6c769223",
    "slug": "karakeep-bookmarks",
    "name": "Karakeep",
    "description": "Bookmark app that saves a readable copy of every page you keep",
    "url": "https://railway.com/deploy/karakeep-bookmarks",
    "upstream": {
      "repo_url": "https://github.com/gridalpha/karakeep-railway"
    }
  },
  "services": [
    {
      "name": "chrome",
      "source": {
        "repo": "https://github.com/gridalpha/karakeep-railway"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "meilisearch",
      "source": {
        "image": "getmeili/meilisearch:v1"
      },
      "needs_volume": true,
      "volume_mount_path": "/meili_data",
      "http": false
    },
    {
      "name": "karakeep",
      "source": {
        "repo": "https://github.com/gridalpha/karakeep-railway"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "HOME",
      "service": "chrome",
      "description": "Writable home for the fontconfig cache",
      "secret": false,
      "strategy": "default",
      "default": "/tmp"
    },
    {
      "key": "RAILWAY_DOCKERFILE_PATH",
      "service": "chrome",
      "description": "Dockerfile that builds this service",
      "secret": false,
      "strategy": "default",
      "default": "chrome/Dockerfile"
    },
    {
      "key": "PORT",
      "service": "meilisearch",
      "description": "Port Railway health-checks",
      "secret": false,
      "strategy": "default",
      "default": "7700"
    },
    {
      "key": "TMPDIR",
      "service": "meilisearch",
      "description": "Indexing scratch space on the volume",
      "secret": false,
      "strategy": "default",
      "default": "/meili_data/tmp"
    },
    {
      "key": "MEILI_ENV",
      "service": "meilisearch",
      "description": "Requires the master key on every request",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "MEILI_DB_PATH",
      "service": "meilisearch",
      "description": "Index location on the volume",
      "secret": false,
      "strategy": "default",
      "default": "/meili_data/data.ms"
    },
    {
      "key": "MEILI_DUMP_DIR",
      "service": "meilisearch",
      "description": "Dump location on the volume",
      "secret": false,
      "strategy": "default",
      "default": "/meili_data/dumps"
    },
    {
      "key": "MEILI_HTTP_ADDR",
      "service": "meilisearch",
      "description": "Dual-stack bind so peers can reach it",
      "secret": false,
      "strategy": "default",
      "default": "[::]:7700"
    },
    {
      "key": "MEILI_MASTER_KEY",
      "service": "meilisearch",
      "description": "Search engine root credential",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MEILI_UPGRADE_DB",
      "service": "meilisearch",
      "description": "Migrate the index in place on upgrade",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MEILI_NO_ANALYTICS",
      "service": "meilisearch",
      "description": "Disable telemetry",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MEILI_SNAPSHOT_DIR",
      "service": "meilisearch",
      "description": "Snapshot location on the volume",
      "secret": false,
      "strategy": "default",
      "default": "/meili_data/snapshots"
    },
    {
      "key": "MEILI_SCHEDULE_SNAPSHOT",
      "service": "meilisearch",
      "description": "One snapshot every 24 hours",
      "secret": false,
      "strategy": "default",
      "default": "86400"
    },
    {
      "key": "MEILI_MAX_INDEXING_MEMORY",
      "service": "meilisearch",
      "description": "Cap indexing memory to the RAM quota",
      "secret": false,
      "strategy": "default",
      "default": "1024 MiB"
    },
    {
      "key": "MEILI_MAX_INDEXING_THREADS",
      "service": "meilisearch",
      "description": "Cap indexing threads to the CPU quota",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "PORT",
      "service": "karakeep",
      "description": "HTTP port the web app listens on",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "DATA_DIR",
      "service": "karakeep",
      "description": "Volume path for the SQLite database",
      "secret": false,
      "strategy": "default",
      "default": "/data"
    },
    {
      "key": "LOG_LEVEL",
      "service": "karakeep",
      "description": "Application log verbosity",
      "secret": false,
      "strategy": "default",
      "default": "info"
    },
    {
      "key": "MEILI_ADDR",
      "service": "karakeep",
      "description": "Search engine private address",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_WAL_MODE",
      "service": "karakeep",
      "description": "SQLite write-ahead logging",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "NEXTAUTH_URL",
      "service": "karakeep",
      "description": "Public-facing app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BROWSER_WEB_URL",
      "service": "karakeep",
      "description": "Headless Chrome DevTools address",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DISABLE_SIGNUPS",
      "service": "karakeep",
      "description": "Set true after creating your account",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "NEXTAUTH_SECRET",
      "service": "karakeep",
      "description": "Session token signing key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MEILI_MASTER_KEY",
      "service": "karakeep",
      "description": "Search engine root key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ASSET_STORE_S3_BUCKET",
      "service": "karakeep",
      "description": "Bucket holding archived assets",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ASSET_STORE_S3_REGION",
      "service": "karakeep",
      "description": "Object storage region",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RATE_LIMITING_ENABLED",
      "service": "karakeep",
      "description": "Throttle API and login requests",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ASSET_STORE_S3_ENDPOINT",
      "service": "karakeep",
      "description": "Object storage endpoint",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DOCKERFILE_PATH",
      "service": "karakeep",
      "description": "Dockerfile that builds this service",
      "secret": false,
      "strategy": "default",
      "default": "app/Dockerfile"
    },
    {
      "key": "ASSET_STORE_S3_ACCESS_KEY_ID",
      "service": "karakeep",
      "description": "Object storage access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ASSET_STORE_S3_FORCE_PATH_STYLE",
      "service": "karakeep",
      "description": "Path-style bucket addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ASSET_STORE_S3_SECRET_ACCESS_KEY",
      "service": "karakeep",
      "description": "Object storage secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "karakeep",
      "description": "Graceful shutdown window",
      "secret": false,
      "strategy": "default",
      "default": "20"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "karakeep-bookmarks"
      }
    },
    "cli": "railway deploy --template karakeep-bookmarks",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "2f54119b-ae7b-461e-90be-350a6c769223",
            "serializedConfig": {
              "buckets": {
                "1c841d44-8b04-46b5-af19-3f2d580b6a95": {
                  "name": "karakeep-assets"
                }
              },
              "services": {
                "82119f16-9264-4585-a5b9-1e13b3bb0091": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/chromium.svg",
                  "name": "chrome",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/gridalpha/karakeep-railway",
                    "rootDirectory": null
                  },
                  "variables": {
                    "HOME": {
                      "isOptional": false,
                      "description": "Writable home for the fontconfig cache",
                      "defaultValue": "/tmp"
                    },
                    "RAILWAY_DOCKERFILE_PATH": {
                      "isOptional": false,
                      "description": "Dockerfile that builds this service",
                      "defaultValue": "chrome/Dockerfile"
                    }
                  }
                },
                "a21ef51f-2e96-4990-b16f-93de9a5f8541": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/meilisearch.svg",
                  "name": "meilisearch",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'mkdir -p /meili_data/tmp /meili_data/snapshots /meili_data/dumps; exec tini -s -- /bin/meilisearch'",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "getmeili/meilisearch:v1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port Railway health-checks",
                      "defaultValue": "7700"
                    },
                    "TMPDIR": {
                      "isOptional": false,
                      "description": "Indexing scratch space on the volume",
                      "defaultValue": "/meili_data/tmp"
                    },
                    "MEILI_ENV": {
                      "isOptional": false,
                      "description": "Requires the master key on every request",
                      "defaultValue": "production"
                    },
                    "MEILI_DB_PATH": {
                      "isOptional": false,
                      "description": "Index location on the volume",
                      "defaultValue": "/meili_data/data.ms"
                    },
                    "MEILI_DUMP_DIR": {
                      "isOptional": false,
                      "description": "Dump location on the volume",
                      "defaultValue": "/meili_data/dumps"
                    },
                    "MEILI_HTTP_ADDR": {
                      "isOptional": false,
                      "description": "Dual-stack bind so peers can reach it",
                      "defaultValue": "[::]:7700"
                    },
                    "MEILI_MASTER_KEY": {
                      "isOptional": false,
                      "description": "Search engine root credential",
                      "defaultValue": "{{MEILI_MASTER_KEY}}"
                    },
                    "MEILI_UPGRADE_DB": {
                      "isOptional": false,
                      "description": "Migrate the index in place on upgrade",
                      "defaultValue": "true"
                    },
                    "MEILI_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disable telemetry",
                      "defaultValue": "true"
                    },
                    "MEILI_SNAPSHOT_DIR": {
                      "isOptional": false,
                      "description": "Snapshot location on the volume",
                      "defaultValue": "/meili_data/snapshots"
                    },
                    "MEILI_SCHEDULE_SNAPSHOT": {
                      "isOptional": false,
                      "description": "One snapshot every 24 hours",
                      "defaultValue": "86400"
                    },
                    "MEILI_MAX_INDEXING_MEMORY": {
                      "isOptional": false,
                      "description": "Cap indexing memory to the RAM quota",
                      "defaultValue": "1024 MiB"
                    },
                    "MEILI_MAX_INDEXING_THREADS": {
                      "isOptional": false,
                      "description": "Cap indexing threads to the CPU quota",
                      "defaultValue": "2"
                    }
                  },
                  "volumeMounts": {
                    "a21ef51f-2e96-4990-b16f-93de9a5f8541": {
                      "mountPath": "/meili_data"
                    }
                  }
                },
                "a3fca28c-ae93-407d-b564-0475be70c14d": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/karakeep.svg",
                  "name": "karakeep",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/gridalpha/karakeep-railway",
                    "rootDirectory": null
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP port the web app listens on",
                      "defaultValue": "3000"
                    },
                    "DATA_DIR": {
                      "isOptional": false,
                      "description": "Volume path for the SQLite database",
                      "defaultValue": "/data"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Application log verbosity",
                      "defaultValue": "info"
                    },
                    "MEILI_ADDR": {
                      "isOptional": false,
                      "description": "Search engine private address",
                      "defaultValue": "http://${{meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "DB_WAL_MODE": {
                      "isOptional": false,
                      "description": "SQLite write-ahead logging",
                      "defaultValue": "true"
                    },
                    "NEXTAUTH_URL": {
                      "isOptional": false,
                      "description": "Public-facing app URL",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "BROWSER_WEB_URL": {
                      "isOptional": false,
                      "description": "Headless Chrome DevTools address",
                      "defaultValue": "http://${{chrome.RAILWAY_PRIVATE_DOMAIN}}:9222"
                    },
                    "DISABLE_SIGNUPS": {
                      "isOptional": false,
                      "description": "Set true after creating your account",
                      "defaultValue": "false"
                    },
                    "NEXTAUTH_SECRET": {
                      "isOptional": false,
                      "description": "Session token signing key",
                      "defaultValue": "{{NEXTAUTH_SECRET}}"
                    },
                    "MEILI_MASTER_KEY": {
                      "isOptional": false,
                      "description": "Search engine root key",
                      "defaultValue": "${{meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "ASSET_STORE_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Bucket holding archived assets",
                      "defaultValue": "${{karakeep-assets.BUCKET}}"
                    },
                    "ASSET_STORE_S3_REGION": {
                      "isOptional": false,
                      "description": "Object storage region",
                      "defaultValue": "${{karakeep-assets.REGION}}"
                    },
                    "RATE_LIMITING_ENABLED": {
                      "isOptional": false,
                      "description": "Throttle API and login requests",
                      "defaultValue": "true"
                    },
                    "ASSET_STORE_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "Object storage endpoint",
                      "defaultValue": "${{karakeep-assets.ENDPOINT}}"
                    },
                    "RAILWAY_DOCKERFILE_PATH": {
                      "isOptional": false,
                      "description": "Dockerfile that builds this service",
                      "defaultValue": "app/Dockerfile"
                    },
                    "ASSET_STORE_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "Object storage access key",
                      "defaultValue": "${{karakeep-assets.ACCESS_KEY_ID}}"
                    },
                    "ASSET_STORE_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style bucket addressing",
                      "defaultValue": "true"
                    },
                    "ASSET_STORE_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Object storage secret key",
                      "defaultValue": "${{karakeep-assets.SECRET_ACCESS_KEY}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Graceful shutdown window",
                      "defaultValue": "20"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {
                        "port": 3000
                      }
                    }
                  },
                  "volumeMounts": {
                    "a3fca28c-ae93-407d-b564-0475be70c14d": {
                      "mountPath": "/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "karakeep",
      "method": "GET",
      "path": "/api/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 3,
    "needs_volume": true
  },
  "generated_at": "2026-09-20T10:14:37.339Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-19T12:44:24.517Z",
  "success_rate_30d": 0.1667,
  "validation": {
    "last_run_id": "run_db607f6483394b5c97e0",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": false,
        "detail": "Your workspace has been restricted. Please contact support to resolve this."
      }
    ],
    "typical_ready_seconds": 88
  }
}
