The veloiq search command registers models and fields for VeloIQ’s header search bar — writes config/search.json read by the backend.
veloiq search manages which models and fields appear in VeloIQ’s built-in header search bar. Each subcommand reads and writes config/search.json at your project root. The backend serves this file at GET /config/search, and the React frontend reads it on startup to build the search index. You do not need to edit search.json by hand — use veloiq search to keep it consistent.
If you do not pass --fields and no global fields are configured yet, the backend searches all string fields of the model by default until you add specific fields.
models — the list of SQLModel class names to include in search results.
fields — the list of field names searched across every model in models. Fields are deduplicated automatically; adding the same field twice has no effect.
A field in fields matches a model attribute if the attribute name exactly equals the field name, or if the attribute name ends with_<fieldname>. For example, a field entry of name matches both name and full_name on any registered model. This lets you configure one generic field key to match common naming variations across different models.
The backend reads config/search.json at startup and exposes it at:
GET /config/search
The React frontend fetches this endpoint when the application loads and uses the returned model and field lists to build the header search bar queries. Any changes you make with veloiq search take effect on the next server restart.
veloiq search auto-detects the project root by walking up from your current directory looking for backend/app/modules/. Run it from anywhere inside your project.
Start with veloiq search add-model <Name> --fields field1,field2 to register a model and its fields in one step, then use veloiq search list to verify the result before restarting the server.
{"docsConfig":{"theme":"palm","$schema":"https://mintlify.com/docs.json","name":"Veloiq","colors":{"primary":"#7b7b7b","light":"#484848"},"favicon":"https://media.brand.dev/bfb51142-8981-4acd-b861-b53a3f75617f.png","navbar":{"primary":{"type":"github","href":"https://github.com/cesarlugos1s/VeloIQ"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"juicemantics","hasAudioNarration":false,"actualSubdomain":"juicemantics","customDomains":["docs.veloiq.dev"],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-juicemantics-d52e6177","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae9581b90e885ae1a8ee795:success","clientVersion":"0.0.4117","searchFilterCounts":[{"language":"default","tag":"Documentation","count":11},{"language":"default","tag":"Reference","count":11},{"language":"default","tag":"CLI","count":5},{"language":"default","tag":"Guides","count":4},{"language":"default","tag":"Core Concepts","count":3},{"language":"default","tag":"Get Started","count":3},{"language":"default","tag":"Python API","count":3},{"language":"default","tag":"React UI Library","count":3},{"language":"default","tag":"Changelog","count":1},{"language":"default","tag":"2026","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"reference/cli-search","slug":"/reference/cli-search","pageMetadata":{"title":"veloiq search: Register Models for Global Search","description":"The veloiq search command registers models and fields for VeloIQ's header search bar — writes config/search.json read by the backend.","sidebarTitle":"veloiq search","href":"/reference/cli-search"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"The veloiq search command registers models and fields for VeloIQ’s header search bar — writes config/search.json read by the backend.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`veloiq search`}),` manages which models and fields appear in VeloIQ’s built-in header search bar. Each subcommand reads and writes `,_jsx(_components.code,{children:`config/search.json`}),` at your project root. The backend serves this file at `,_jsx(_components.code,{children:`GET /config/search`}),`, and the React frontend reads it on startup to build the search index. You do not need to edit `,_jsx(_components.code,{children:`search.json`}),` by hand — use `,_jsx(_components.code,{children:`veloiq search`}),` to keep it consistent.`]}),`\n`,_jsx(Heading,{level:`2`,id:`subcommands`,children:`Subcommands`}),`\n`,_jsx(Heading,{level:`3`,id:`veloiq-search-add-model`,children:_jsx(_components.code,{children:`veloiq search add-model`})}),`\n`,_jsxs(_components.p,{children:[`Registers a model in the search index. Optionally adds specific fields in the same command with `,_jsx(_components.code,{children:`--fields`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ModelNam`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [--fields `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`field1,field2,...]`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Task`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Task`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --fields`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` title,description`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` TeamMember`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --fields`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` name,email`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If you do not pass `,_jsx(_components.code,{children:`--fields`}),` and no global fields are configured yet, the backend searches all string fields of the model by default until you add specific fields.`]}),`\n`,_jsx(Heading,{level:`3`,id:`veloiq-search-add-field`,children:_jsx(_components.code,{children:`veloiq search add-field`})}),`\n`,_jsxs(_components.p,{children:[`Adds a field to the global list of searchable attributes. The field name is searched across `,_jsx(_components.strong,{children:`all`}),` registered models, not just one.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-field`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fieldnam`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Examples:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-field`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` title`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-field`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` description`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-field`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` name`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`veloiq-search-remove-model`,children:_jsx(_components.code,{children:`veloiq search remove-model`})}),`\n`,_jsx(_components.p,{children:`Deregisters a model from the search index. The model’s data will no longer appear in search results.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` remove-model`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ModelNam`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` remove-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Task`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`veloiq-search-remove-field`,children:_jsx(_components.code,{children:`veloiq search remove-field`})}),`\n`,_jsx(_components.p,{children:`Removes a field from the global searchable attributes list.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` remove-field`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fieldnam`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`veloiq-search-list`,children:_jsx(_components.code,{children:`veloiq search list`})}),`\n`,_jsxs(_components.p,{children:[`Prints the current search configuration — registered models, configured fields, and the path to `,_jsx(_components.code,{children:`search.json`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`})]}),`\n`]})})}),`\n`,_jsxs(Heading,{level:`2`,id:`the-config/search-json-structure`,children:[`The `,_jsx(_components.code,{children:`config/search.json`}),` structure`]}),`\n`,_jsxs(_components.p,{children:[`After running a sequence of `,_jsx(_components.code,{children:`add-model`}),` and `,_jsx(_components.code,{children:`add-field`}),` commands:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Task`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --fields`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` title,description`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`veloiq`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` search`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add-model`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Project`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --fields`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` name,description`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The resulting `,_jsx(_components.code,{children:`config/search.json`}),` looks like this:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"models\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Task\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Project\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"fields\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"title\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`models`})}),` — the list of SQLModel class names to include in search results.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`fields`})}),` — the list of field names searched across every model in `,_jsx(_components.code,{children:`models`}),`. Fields are deduplicated automatically; adding the same field twice has no effect.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`field-matching-rules`,children:`Field matching rules`}),`\n`,_jsxs(_components.p,{children:[`A field in `,_jsx(_components.code,{children:`fields`}),` matches a model attribute if the attribute name `,_jsx(_components.strong,{children:`exactly equals`}),` the field name, or if the attribute name `,_jsx(_components.strong,{children:`ends with`}),` `,_jsx(_components.code,{children:`_\u003cfieldname>`}),`. For example, a field entry of `,_jsx(_components.code,{children:`name`}),` matches both `,_jsx(_components.code,{children:`name`}),` and `,_jsx(_components.code,{children:`full_name`}),` on any registered model. This lets you configure one generic field key to match common naming variations across different models.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-the-backend-and-frontend-use-this-file`,children:`How the backend and frontend use this file`}),`\n`,_jsxs(_components.p,{children:[`The backend reads `,_jsx(_components.code,{children:`config/search.json`}),` at startup and exposes it at:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET /config/search`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The React frontend fetches this endpoint when the application loads and uses the returned model and field lists to build the header search bar queries. Any changes you make with `,_jsx(_components.code,{children:`veloiq search`}),` take effect on the next server restart.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`veloiq search`}),` auto-detects the project root by walking up from your current directory looking for `,_jsx(_components.code,{children:`backend/app/modules/`}),`. Run it from anywhere inside your project.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Start with `,_jsx(_components.code,{children:`veloiq search add-model \u003cName> --fields field1,field2`}),` to register a model and its fields in one step, then use `,_jsx(_components.code,{children:`veloiq search list`}),` to verify the result before restarting the server.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"veloiq search: Register Models for Global Search","description":"The veloiq search command registers models and fields for VeloIQ's header search bar — writes config/search.json read by the backend.","sidebarTitle":"veloiq search","href":"/reference/cli-search"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Subcommands","slug":"subcommands","depth":2,"children":[{"title":"veloiq search add-model","slug":"veloiq-search-add-model","depth":3,"children":[]},{"title":"veloiq search add-field","slug":"veloiq-search-add-field","depth":3,"children":[]},{"title":"veloiq search remove-model","slug":"veloiq-search-remove-model","depth":3,"children":[]},{"title":"veloiq search remove-field","slug":"veloiq-search-remove-field","depth":3,"children":[]},{"title":"veloiq search list","slug":"veloiq-search-list","depth":3,"children":[]}]},{"title":"The config/search.json structure","slug":"the-config/search-json-structure","depth":2,"children":[]},{"title":"Field matching rules","slug":"field-matching-rules","depth":2,"children":[]},{"title":"How the backend and frontend use this file","slug":"how-the-backend-and-frontend-use-this-file","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"juicemantics","siteName":"Veloiq","title":"veloiq search: Register Models for Global Search - Veloiq","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-20T02:36:14.242Z","originalFileLocation":"reference/cli-search.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The veloiq search command registers models and fields for VeloIQ\u0026#x27;s header search bar — writes config/search.json read by the backend.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Veloiq\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://media.brand.dev/bfb51142-8981-4acd-b861-b53a3f75617f.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://media.brand.dev/bfb51142-8981-4acd-b861-b53a3f75617f.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://media.brand.dev/bfb51142-8981-4acd-b861-b53a3f75617f.png\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://media.brand.dev/bfb51142-8981-4acd-b861-b53a3f75617f.png\">\u003cmeta data-mint-head property=\"og:title\" content=\"veloiq search: Register Models for Global Search - Veloiq\">\u003cmeta data-mint-head property=\"og:description\" content=\"The veloiq search command registers models and fields for VeloIQ\u0026#x27;s header search bar — writes config/search.json read by the backend.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Veloiq\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.veloiq.dev/reference/cli-search\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://juicemantics.mintlify.site/_mintlify/api/og/v2?division=CLI\u0026amp;title=veloiq+search%3A+Register+Models+for+Global+Search\u0026amp;description=The+veloiq+search+command+registers+models+and+fields+for+VeloIQ%27s+header+search+bar+%E2%80%94+writes+config%2Fsearch.json+read+by+the+backend.\u0026amp;theme=5c552ad5265e4a10484999bf\u0026amp;signature=242429b9c7f8dc1200ec5a128a56278778efeb531ca0ec18c0cc80bfb8773554\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"veloiq search: Register Models for Global Search - Veloiq\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The veloiq search command registers models and fields for VeloIQ\u0026#x27;s header search bar — writes config/search.json read by the backend.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://juicemantics.mintlify.site/_mintlify/api/og/v2?division=CLI\u0026amp;title=veloiq+search%3A+Register+Models+for+Global+Search\u0026amp;description=The+veloiq+search+command+registers+models+and+fields+for+VeloIQ%27s+header+search+bar+%E2%80%94+writes+config%2Fsearch.json+read+by+the+backend.\u0026amp;theme=5c552ad5265e4a10484999bf\u0026amp;signature=242429b9c7f8dc1200ec5a128a56278778efeb531ca0ec18c0cc80bfb8773554\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/juicemantics/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Veloiq\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7b7b7b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.veloiq.dev/reference/cli-search\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/reference/cli-search.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.veloiq.dev/#organization\",\"name\":\"Veloiq\",\"url\":\"https://docs.veloiq.dev\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.veloiq.dev#website\",\"name\":\"Veloiq\",\"url\":\"https://docs.veloiq.dev\",\"publisher\":{\"@id\":\"https://docs.veloiq.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.veloiq.dev/reference/cli-search#webpage\",\"url\":\"https://docs.veloiq.dev/reference/cli-search\",\"name\":\"veloiq search: Register Models for Global Search\",\"description\":\"The veloiq search command registers models and fields for VeloIQ's header search bar — writes config/search.json read by the backend.\",\"dateModified\":\"2026-05-20T02:36:14.242Z\",\"isPartOf\":{\"@id\":\"https://docs.veloiq.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.veloiq.dev/reference/cli-search#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.veloiq.dev/reference/cli-search#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"CLI\",\"item\":\"https://docs.veloiq.dev/reference/cli-overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"veloiq search: Register Models for Global Search\",\"item\":\"https://docs.veloiq.dev/reference/cli-search\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.veloiq.dev/reference/cli-search#article\",\"headline\":\"veloiq search: Register Models for Global Search\",\"name\":\"veloiq search: Register Models for Global Search\",\"description\":\"The veloiq search command registers models and fields for VeloIQ's header search bar — writes config/search.json read by the backend.\",\"url\":\"https://docs.veloiq.dev/reference/cli-search\",\"mainEntityOfPage\":{\"@id\":\"https://docs.veloiq.dev/reference/cli-search#webpage\"},\"dateModified\":\"2026-05-20T02:36:14.242Z\",\"publisher\":{\"@id\":\"https://docs.veloiq.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.veloiq.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Veloiq\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Veloiq\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/reference/cli-search.md","siteName":"Veloiq","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"Reference","groups":[{"group":"CLI","pages":[{"title":"VeloIQ CLI Reference: All Commands at a Glance","sidebarTitle":"CLI Overview","href":"/reference/cli-overview"},{"title":"veloiq new: Scaffold a Full-Stack VeloIQ Project","sidebarTitle":"veloiq new","href":"/reference/cli-new"},{"title":"veloiq generate: Generate API and Frontend Schemas","sidebarTitle":"veloiq generate","href":"/reference/cli-generate"},{"title":"veloiq db: Alembic Database Migration Commands","description":"The veloiq db command wraps Alembic to create revisions, apply upgrades, and inspect migration history for your VeloIQ application.","sidebarTitle":"veloiq db","href":"/reference/cli-db"},{"title":"veloiq search: Register Models for Global Search","sidebarTitle":"veloiq search","href":"/reference/cli-search"}]},{"group":"Python API","pages":[{"title":"VeloIQ Python API: All Public Framework Exports","description":"Complete reference for veloiq_framework public exports — app factory, base models, relationships, access control decorators, and utilities.","sidebarTitle":"Python API","href":"/reference/python-api"},{"title":"VeloIQConfig: Complete Framework Configuration Reference","sidebarTitle":"Configuration","href":"/reference/configuration"},{"title":"VeloIQ Auto-Generated CRUD REST API Reference","sidebarTitle":"CRUD Router","href":"/reference/crud-router"}]},{"group":"React UI Library","pages":[{"title":"@veloiq/ui: React Component Library for VeloIQ","sidebarTitle":"UI Overview","href":"/reference/ui-overview"},{"title":"DynamicResource: Schema-Driven React CRUD Pages","sidebarTitle":"DynamicResource","href":"/reference/ui-dynamic-resource"},{"title":"VeloIQ React Auth and Data Providers Reference","sidebarTitle":"Auth Providers","href":"/reference/ui-providers"}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/2026-05-29"}]}]},"basePath":"","title":"veloiq search: Register Models for Global Search - Veloiq","buildId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","deploymentId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","dynamics":[],"chunks":[]}