{"record":{"id":"5a5ff055350caec4","repo":"benbjohnson/litestream","slug":"pattern-is-required-for-directory-replication","errorCode":null,"errorMessage":"pattern is required for directory replication","messagePattern":"pattern is required for directory replication","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/litestream/main.go","lineNumber":821,"sourceCode":"\t}\n\n\tr, err := NewReplicaFromConfig(rc, db)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdb.Replica = r\n\n\treturn db, nil\n}\n\n// NewDBsFromDirectoryConfig scans a directory and creates DB instances for all SQLite databases found.\nfunc NewDBsFromDirectoryConfig(dbc *DBConfig) ([]*litestream.DB, error) {\n\tif dbc.Dir == \"\" {\n\t\treturn nil, fmt.Errorf(\"directory path is required for directory replication\")\n\t}\n\n\tif dbc.Pattern == \"\" {\n\t\treturn nil, fmt.Errorf(\"pattern is required for directory replication\")\n\t}\n\tif dbc.MetaPath != nil && dbc.MetaDir != nil {\n\t\treturn nil, fmt.Errorf(\"cannot specify both 'meta-path' and 'meta-dir'\")\n\t}\n\n\tdirPath, err := expand(dbc.Dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Find all SQLite databases in the directory\n\tdbPaths, err := FindSQLiteDatabases(dirPath, dbc.Pattern, dbc.Recursive)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to scan directory %s: %w\", dirPath, err)\n\t}\n\n\tif len(dbPaths) == 0 && !dbc.Watch {\n\t\treturn nil, fmt.Errorf(\"no SQLite databases found in directory %s with pattern %s\", dirPath, dbc.Pattern)","sourceCodeStart":803,"sourceCodeEnd":839,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/cmd/litestream/main.go#L803-L839","documentation":"Directory replication in Litestream watches a directory of SQLite databases matched by a glob pattern. When a DB config sets 'dir' (directory replication) but the 'pattern' field is empty, NewDBsFromDirectoryConfig cannot know which files are databases and returns this error instead of starting replication.","triggerScenarios":"Calling NewDBsFromDirectoryConfig (directly or via Run/startDirectoryMonitor) with a DBConfig whose Dir is non-empty but Pattern is \"\".","commonSituations":"User writes a config with `dir: /var/lib/db` but forgets the `pattern:` key; a config-generation tool omits pattern; a YAML typo like `patten:` silently leaves Pattern empty.","solutions":["Add a `pattern` to the database config, e.g. `pattern: \"*.db\"` or `pattern: \"**/*.sqlite*\"`.","If you meant to replicate a single database, remove `dir` and set `path:` to the database file instead.","Verify the YAML key is spelled `pattern` and is nested under the correct db entry."],"exampleFix":"# before\ndbs:\n  - dir: /var/lib/myapp\n    replicas:\n      - url: s3://bucket/db\n\n# after\ndbs:\n  - dir: /var/lib/myapp\n    pattern: \"*.db\"\n    replicas:\n      - url: s3://bucket/db","handlingStrategy":"validation","validationCode":"if dbc.Dir != \"\" && dbc.Pattern == \"\" {\n    return fmt.Errorf(\"directory replication requires `pattern` (e.g. \\\"*.db\\\")\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair `dir:` with `pattern:` in litestream configs.","Use a config linter or JSON/YAML schema to require pattern when dir is present.","Prefer `path:` for single databases so directory validation never applies."],"tags":["config","litestream","directory-replication","validation"],"backgroundTag":"missing-required-config-field","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}