{"record":{"id":"4bcca5f1294e5e63","repo":"basecamp/kamal","slug":"could-not-find-field-field-in-item-item-in-b","errorCode":null,"errorMessage":"Could not find field #{field} in item #{item} in Bitwarden","messagePattern":"Could not find field #(.+?) in item #(.+?) in Bitwarden","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"lib/kamal/secrets/adapters/bitwarden.rb","lineNumber":47,"sourceCode":"          item_json = JSON.parse(item_json)\n          if fields.any?\n            results.merge! fetch_secrets_from_fields(fields, item, item_json)\n          elsif item_json.dig(\"login\", \"password\")\n            results[item] = item_json.dig(\"login\", \"password\")\n          elsif item_json[\"fields\"]&.any?\n            fields = item_json[\"fields\"].pluck(\"name\")\n            results.merge! fetch_secrets_from_fields(fields, item, item_json)\n          else\n            raise RuntimeError, \"Item #{item} is not a login type item and no fields were specified\"\n          end\n        end\n      end\n    end\n\n    def fetch_secrets_from_fields(fields, item, item_json)\n      fields.to_h do |field|\n        item_field = item_json[\"fields\"].find { |f| f[\"name\"] == field }\n        raise RuntimeError, \"Could not find field #{field} in item #{item} in Bitwarden\" unless item_field\n        value = item_field[\"value\"]\n        [ \"#{item}/#{field}\", value ]\n      end\n    end\n\n    def items_fields(secrets)\n      {}.tap do |items|\n        secrets.each do |secret|\n          item, field = secret.split(\"/\")\n          items[item] ||= []\n          items[item] << field\n        end\n      end\n    end\n\n    def signedin?(account)\n      run_command(\"status\")[\"status\"] != \"unauthenticated\"\n    end","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/basecamp/kamal/blob/eee0083b38661c3707c6b6052cc89e85038a096c/lib/kamal/secrets/adapters/bitwarden.rb#L29-L65","documentation":"When a secret is requested as item/field, fetch_secrets_from_fields looks up field in the item's fields array by exact name (f[\"name\"] == field, case-sensitive). If no custom field with that exact name exists, Kamal raises RuntimeError \"Could not find field ... in Bitwarden\".","triggerScenarios":"Requesting myitem/Username when the field is named username or login; requesting a field defined on a different item; field renamed or deleted in the web vault; requesting a standard login attribute (password/username) as if it were a custom field when it is not in fields.","commonSituations":"Case mismatches between deploy scripts and Bitwarden field names; fields created as hidden vs text type confusion in naming; renaming fields without updating kamal config.","solutions":["Inspect the item's actual field names: bw get item <name> (or the web vault) and copy the exact, case-sensitive field name","Correct the request to item/ExactFieldName","If the field is missing, add it as a custom field on the item in Bitwarden and bw sync"],"exampleFix":"# before\nkamal secrets fetch -a bitwarden --account me@example.com myitem/Username\n# => RuntimeError: Could not find field Username in item myitem in Bitwarden\n\n# fix: field is actually lowercase in the vault\nkamal secrets fetch -a bitwarden --account me@example.com myitem/username","handlingStrategy":"validation","validationCode":"item, field = \"myitem\", \"Username\"\nfields = JSON.parse(`bw get item #{item.shellescape}`)[\"fields\"].to_a.map { |f| f[\"name\"] }\nabort \"field `#{field}` missing on #{item}; available: #{fields.join(\", \")}\" unless fields.include?(field)","typeGuard":"def bitwarden_field_exists?(item, field)\n  JSON.parse(`bw get item #{item.shellescape}`)[\"fields\"].to_a.any? { |f| f[\"name\"] == field }\nend","tryCatchPattern":"begin\n  adapter.fetch([\"#{item}/#{field}\"], account: account)\nrescue RuntimeError => e\n  if e.message.include?(\"Could not find field\")\n    warn \"available fields: #{JSON.parse(`bw get item #{item.shellescape}`)[\"fields\"].to_a.map { |f| f[\"name\"] }.join(\", \")}\"\n  end\n  raise\nend","preventionTips":["Field matching is case-sensitive — always copy names from `bw get item` output","When renaming fields in the web vault, grep deploy scripts for item/oldField references the same day"],"tags":["kamal","secrets","bitwarden","vault","field-not-found"],"backgroundTag":"vault-item-not-found","analyzedSha":"eee0083b38661c3707c6b6052cc89e85038a096c","analyzedAt":"2026-08-21T15:17:22.045Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}