[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-google-deepmind-agentic-ecology-ui":3,"mdc-is2dcm-key":35,"related-org-google-deepmind-agentic-ecology-ui":1127,"related-repo-google-deepmind-agentic-ecology-ui":1301},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":33,"mdContent":34},"agentic-ecology-ui","visualize and annotate vector database results","Guidelines and templates for creating a generic web UI to visualize, rank, filter, and annotate vector databases. The UI has a hierarchical structure covering database selection, label selection\u002Fdefinition, ranking\u002Ffiltering configuration, and row visualization\u002Fannotation. Meant to be copied and adapted for specific downstream tasks like bioacoustics or camera traps.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"google-deepmind","Google DeepMind","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgoogle-deepmind.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Dashboards","dashboards","tag",{"name":17,"slug":18,"type":15},"Data Visualization","data-visualization",{"name":20,"slug":21,"type":15},"Search","search",{"name":23,"slug":24,"type":15},"UI Components","ui-components",2,"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fagentic_ecology","2026-08-29T09:48:03.400711",null,0,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":28},[],"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fagentic_ecology\u002Ftree\u002FHEAD\u002Fskills\u002Fagentic-ecology-ui","---\nname: agentic-ecology-ui\ndescription: >-\n  Guidelines and templates for creating a generic web UI to visualize, rank,\n  filter, and annotate vector databases. The UI has a hierarchical structure\n  covering database selection, label selection\u002Fdefinition, ranking\u002Ffiltering\n  configuration, and row visualization\u002Fannotation. Meant to be copied and\n  adapted for specific downstream tasks like bioacoustics or camera traps.\n---\n\n# UI Skill: Visualizing, Ranking, Filtering, and Annotating Vector Databases\n\nThis skill provides guidelines and templates for building a lightweight web UI\nto visualize, rank, filter, and annotate vector databases. The databases contain\nvector embeddings computed from raw inputs (e.g., audio segments, camera trap\nimages, or text segments), where each row corresponds to one embedding.\n\n> [!CAUTION] **DATABASE SAFETY AND INTEGRITY**: Do NOT write, modify, or insert\n> test annotations directly into the user's production databases. If you need to\n> test database operations (such as saving annotations or training models), you\n> MUST copy the database to a temporary location (e.g., inside the conversation\n> scratch directory) and test against the copy. Never leave testing data in\n> production databases.\n\nThe skill's output is generic, implementing common features and leaving specific\nimplementation details (like media rendering or custom inference models) to\ndownstream skills (e.g., bioacoustics, camera traps).\n\n## UI Architecture\n\nThe interface follows a hierarchical four-level design:\n\n1.  **Database Selection (Level 1):** Allows the user to select which database\n    to browse from a list of databases present in a specified directory.\n2.  **Label Selection\u002FDefinition (Level 2):** Allows the user to select an\n    annotation label to focus on (with options determined dynamically based on\n    annotations present in the database), or to define a new annotation label.\n3.  **Ranking and Filtering Configuration (Level 3):** Allows the user to\n    determine how to rank and filter rows in the database (e.g., by similarity\n    with a query vector, classifier score, sorting order, paging, or filtering\n    out already labeled items).\n4.  **Row Visualization and Annotation (Level 4):** Allows the user to visualize\n    the selected database's rows, along with their annotations for the active\n    label, ranked and filtered according to the Level 3 configuration.\n\n## Architectural Patterns\n\nWhen creating a web interface for agent results, follow these patterns:\n\n### 1. API-Driven Design (Separation of Concerns)\n\n-   **Static Frontend:** The HTML page (`index.html`) should be **100% static**\n    (no hardcoded results). It should use standard JavaScript (`fetch()`) to\n    request data from the backend and render it dynamically in the DOM.\n-   **API Backend:** The Python server exposes a `\u002Fapi\u002F...` endpoint returning\n    JSON data.\n-   **Benefit:** Cosmetic changes (CSS, layout, pagination) only require editing\n    the HTML\u002FJS file and refreshing the browser.\n\n### 2. In-Memory Caching\n\n-   AI\u002FML model operations (like generating embeddings or running similarity\n    searches) are expensive and slow (often multiple seconds).\n-   **Pattern:** The backend server should cache search\u002Finference on the first\n    request. Subsequent API requests for the data should be served instantly\n    (\u003C5ms) from this cache.\n\n### 3. Dynamic Media Streaming (On-the-Fly Slicing)\n\n-   When displaying segments of large media files (e.g., 5-second windows from\n    20MB audio files), **do not** pre-slice them to disk or embed them as\n    base64.\n-   **Pattern:** Create a streaming endpoint (e.g.,\n    `\u002Fstream?file=...&start=...&end=...`). The server uses efficient libraries\n    (like `soundfile` for audio) to **seek directly** to the start time and read\n    only the requested range in-memory, streaming the bytes back instantly.\n-   **Network Efficiency:** This is crucial when serving from a remote machine\n    to a local browser via SSH port forwarding, as it drastically reduces\n    network transfer.\n\n### 4. Client-Side Dynamic Paging\n\n-   Handle pagination in the browser using JavaScript.\n-   **Pattern:** Load all results via the API, but hide\u002Fshow rows dynamically.\n-   **Smart Player Control:** When navigating pages, ensure any active media\n    players are automatically paused so they don't continue playing in the\n    background.\n\n### 5. Robust Media Layouts (Preventing Squishing)\n\n-   Avoid default compression of media players (like `\u003Caudio>` or `\u003Cvideo>`)\n    inside flexible layouts (like Bootstrap tables or flexbox containers).\n-   **Pattern:** Always define a clear, functional width for media players\n    (e.g., `width: 250px;` or `width: 300px;`) and ensure their container or\n    table column has sufficient space and prevents wrapping (e.g., `white-space:\n    nowrap;`).\n-   **Benefit:** Ensures play controls and progress bars remain fully visible\n    and usable across different screen sizes.\n\n### 6. Thread-Safe Multi-Threaded Backend (SQLite Concurrency)\n\n-   Single-threaded backends block the entire event loop when transferring large\n    files or streaming audio, causing simultaneous API requests to time out.\n-   **Pattern:** Use a multi-threaded server\n    (`socketserver.ThreadingTCPServer`).\n-   **Database Isolation**: SQLite connections are thread-bound. Do not share a\n    single connection across threads (which causes `ProgrammingError`). Instead,\n    initialize and pool database connections in **thread-local storage** (e.g.,\n    `threading.local()`).\n\n### 7. Robust Media Streaming Connection Management\n\n-   When users pause or switch tabs, the browser aborts the stream connection\n    abruptly. This throws a `BrokenPipeError` or `ConnectionResetError` during\n    server `.write()` calls.\n-   **Pattern:** Always wrap audio streaming write calls in a `try-except` block\n    to catch and silence these disconnects gracefully, preventing traceback\n    bloat.\n\n### 8. Zero-Latency Browser-Side Operations (Instant Sorting & Paging)\n\n-   Making API requests for simple paging, sorting, or checkbox filtering (like\n    hiding annotated rows) introduces unnecessary network lag.\n-   **Pattern:** Fetch the complete database results once from the backend.\n    Implement sorting, filtering (like toggling between showing\u002Fhiding labeled\n    data), and paging **entirely in client-side JavaScript** (e.g. using\n    standard `.sort()` and `.filter()` arrays).\n-   **Smart Media Management**: When users change pages, ensure JavaScript loops\n    through all active media players on the page and calls `.pause()` to prevent\n    audio overlaps.\n\n### 9. Thread-Safe Shared State Locking\n\n-   In multi-threaded backends, different worker threads handle `\u002Fapi\u002Ftrain`,\n    `\u002Fapi\u002Fsearch`, and `\u002Fapi\u002Fannotation` in parallel. Modifying shared variables\n    (like in-memory search result caches) without protection leads to race\n    conditions.\n-   **Pattern:** Always protect writes to shared global caches or model states\n    using a mutual exclusion lock (`threading.Lock()`).\n\n### 10. Safe JSON Serialization (Handling NumPy Types, NaN, and Infinity)\n\n-   **NumPy Types**: AI\u002FML libraries (like USearch or NumPy itself) often return\n    values as NumPy-specific types (e.g., `numpy.uint64` for IDs,\n    `numpy.float32` for scores). Python's default `json.dumps()` does not\n    support these and will raise a `TypeError: Object of type ... is not JSON\n    serializable`.\n    *   **Pattern**: Explicitly cast NumPy values (e.g. `int()`, `float()`), or\n        use a custom `JSONEncoder` (like the `SafeEncoder` class defined in the\n        server template) to automatically convert NumPy types to native Python\n        types during serialization.\n-   **NaN and Infinity**: AI\u002FML models often generate score\u002Fdistance metrics\n    containing `NaN` or `Infinity`. Python's default `json.dumps()` allows these\n    values, but they result in invalid JSON that crashes JavaScript parser\n    engines (`JSON.parse`) in the browser.\n    *   **Pattern**: Sanitize all float values using the `sanitize_float` helper\n        function in [server.py](references\u002Fserver.py) before returning them in\n        JSON API responses.\n\n### 11. Material Design 3 (M3) Visual Conformance\n\n-   The UI template follows the **Material Design 3 (M3)** design system\n    ([m3.material.io](https:\u002F\u002Fm3.material.io\u002F)) with a light color scheme.\n-   **Pattern — Token-Driven CSS**: All styling is driven by CSS custom\n    properties (design tokens) defined in `:root`. The tokens cover:\n    -   **Color**: Full M3 light scheme with primary, secondary, tertiary,\n        error, surface, and outline role tokens. The template uses a teal seed\n        color (`#006B5E`) appropriate for ecology, but can be re-seeded by\n        swapping the `:root` color block.\n    -   **Typography**: M3 type scale (Display, Headline, Title, Body, Label ×\n        Large\u002FMedium\u002FSmall) using Roboto.\n    -   **Shape**: M3 shape scale (None → Extra-small → Small → Medium → Large →\n        Extra-large → Full).\n    -   **Elevation**: 6-level shadow system (Level 0–5).\n    -   **Motion**: Duration and easing tokens for transitions.\n    -   **State Layers**: Hover (8%), focus (10%), pressed (10%) opacity\n        overlays.\n-   **Component mapping**: Top App Bar (Small), Navigation Drawer (Standard),\n    Segmented Buttons, Filled\u002FTonal\u002FOutlined Buttons, Outlined Text Fields,\n    Outlined Cards, and M3-styled snackbar notifications.\n-   **No external CSS framework**: The template uses only pure CSS with custom\n    properties — no Tailwind, Bootstrap, or other framework — to ensure\n    authentic M3 token mapping and smaller payload.\n\n### 12. Iframe-Safe Error Handling (No alert\u002Fconfirm\u002Fprompt)\n\n-   When the UI is served inside an iframe (e.g., as an Antigravity sidecar),\n    browsers block `alert()`, `confirm()`, and `prompt()` in cross-origin iframe\n    contexts. The dialog never shows, JavaScript execution suspends permanently,\n    and the calling `async` function's `finally` block never runs — causing the\n    UI to freeze.\n-   **Pattern — Inline Snackbar Notifications**: Replace all `alert()` calls\n    with a dynamically-created snackbar element that appears at the bottom of\n    the viewport and auto-dismisses after 6 seconds. Use M3 inverse-surface\n    colors for info messages and error-container colors for errors.\n-   **Fetch Timeout**: Long-running server operations (like model training) must\n    use an `AbortController` with a timeout to prevent indefinite hangs if the\n    server becomes unresponsive.\n-   **Error Message Extraction**: When the server returns an error response,\n    always attempt to parse the JSON body and extract the `.error` field to\n    display the actual server message instead of a generic failure string.\n\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\n\n## Templates and Examples\n\nThe skill contains generic templates meant to be copied to the project's\nworking directory (e.g., `agent_workspace\u002F`) and adapted:\n\n*   **Static HTML Template**: [index.html](references\u002Findex.html) — M3-compliant\n    hierarchical client-side UI with design tokens, database\u002Flabel selection,\n    paging, annotation, and inline snackbar notifications.\n*   **Custom Python Server**: [server.py](references\u002Fserver.py) — API server\n    exposing endpoints to list databases, retrieve rows, train classifiers, and\n    save annotations.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,49,55,78,83,90,95,140,146,151,158,224,230,248,254,311,317,344,350,415,421,477,483,531,537,595,601,649,655,814,820,961,967,1066,1070,1073,1079,1092],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"ui-skill-visualizing-ranking-filtering-and-annotating-vector-databases",[46],{"type":47,"value":48},"text","UI Skill: Visualizing, Ranking, Filtering, and Annotating Vector Databases",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"This skill provides guidelines and templates for building a lightweight web UI\nto visualize, rank, filter, and annotate vector databases. The databases contain\nvector embeddings computed from raw inputs (e.g., audio segments, camera trap\nimages, or text segments), where each row corresponds to one embedding.",{"type":41,"tag":56,"props":57,"children":58},"blockquote",{},[59],{"type":41,"tag":50,"props":60,"children":61},{},[62,68,70,76],{"type":41,"tag":63,"props":64,"children":65},"span",{},[66],{"type":47,"value":67},"!CAUTION",{"type":47,"value":69}," ",{"type":41,"tag":71,"props":72,"children":73},"strong",{},[74],{"type":47,"value":75},"DATABASE SAFETY AND INTEGRITY",{"type":47,"value":77},": Do NOT write, modify, or insert\ntest annotations directly into the user's production databases. If you need to\ntest database operations (such as saving annotations or training models), you\nMUST copy the database to a temporary location (e.g., inside the conversation\nscratch directory) and test against the copy. Never leave testing data in\nproduction databases.",{"type":41,"tag":50,"props":79,"children":80},{},[81],{"type":47,"value":82},"The skill's output is generic, implementing common features and leaving specific\nimplementation details (like media rendering or custom inference models) to\ndownstream skills (e.g., bioacoustics, camera traps).",{"type":41,"tag":84,"props":85,"children":87},"h2",{"id":86},"ui-architecture",[88],{"type":47,"value":89},"UI Architecture",{"type":41,"tag":50,"props":91,"children":92},{},[93],{"type":47,"value":94},"The interface follows a hierarchical four-level design:",{"type":41,"tag":96,"props":97,"children":98},"ol",{},[99,110,120,130],{"type":41,"tag":100,"props":101,"children":102},"li",{},[103,108],{"type":41,"tag":71,"props":104,"children":105},{},[106],{"type":47,"value":107},"Database Selection (Level 1):",{"type":47,"value":109}," Allows the user to select which database\nto browse from a list of databases present in a specified directory.",{"type":41,"tag":100,"props":111,"children":112},{},[113,118],{"type":41,"tag":71,"props":114,"children":115},{},[116],{"type":47,"value":117},"Label Selection\u002FDefinition (Level 2):",{"type":47,"value":119}," Allows the user to select an\nannotation label to focus on (with options determined dynamically based on\nannotations present in the database), or to define a new annotation label.",{"type":41,"tag":100,"props":121,"children":122},{},[123,128],{"type":41,"tag":71,"props":124,"children":125},{},[126],{"type":47,"value":127},"Ranking and Filtering Configuration (Level 3):",{"type":47,"value":129}," Allows the user to\ndetermine how to rank and filter rows in the database (e.g., by similarity\nwith a query vector, classifier score, sorting order, paging, or filtering\nout already labeled items).",{"type":41,"tag":100,"props":131,"children":132},{},[133,138],{"type":41,"tag":71,"props":134,"children":135},{},[136],{"type":47,"value":137},"Row Visualization and Annotation (Level 4):",{"type":47,"value":139}," Allows the user to visualize\nthe selected database's rows, along with their annotations for the active\nlabel, ranked and filtered according to the Level 3 configuration.",{"type":41,"tag":84,"props":141,"children":143},{"id":142},"architectural-patterns",[144],{"type":47,"value":145},"Architectural Patterns",{"type":41,"tag":50,"props":147,"children":148},{},[149],{"type":47,"value":150},"When creating a web interface for agent results, follow these patterns:",{"type":41,"tag":152,"props":153,"children":155},"h3",{"id":154},"_1-api-driven-design-separation-of-concerns",[156],{"type":47,"value":157},"1. API-Driven Design (Separation of Concerns)",{"type":41,"tag":159,"props":160,"children":161},"ul",{},[162,196,214],{"type":41,"tag":100,"props":163,"children":164},{},[165,170,172,179,181,186,188,194],{"type":41,"tag":71,"props":166,"children":167},{},[168],{"type":47,"value":169},"Static Frontend:",{"type":47,"value":171}," The HTML page (",{"type":41,"tag":173,"props":174,"children":176},"code",{"className":175},[],[177],{"type":47,"value":178},"index.html",{"type":47,"value":180},") should be ",{"type":41,"tag":71,"props":182,"children":183},{},[184],{"type":47,"value":185},"100% static",{"type":47,"value":187},"\n(no hardcoded results). It should use standard JavaScript (",{"type":41,"tag":173,"props":189,"children":191},{"className":190},[],[192],{"type":47,"value":193},"fetch()",{"type":47,"value":195},") to\nrequest data from the backend and render it dynamically in the DOM.",{"type":41,"tag":100,"props":197,"children":198},{},[199,204,206,212],{"type":41,"tag":71,"props":200,"children":201},{},[202],{"type":47,"value":203},"API Backend:",{"type":47,"value":205}," The Python server exposes a ",{"type":41,"tag":173,"props":207,"children":209},{"className":208},[],[210],{"type":47,"value":211},"\u002Fapi\u002F...",{"type":47,"value":213}," endpoint returning\nJSON data.",{"type":41,"tag":100,"props":215,"children":216},{},[217,222],{"type":41,"tag":71,"props":218,"children":219},{},[220],{"type":47,"value":221},"Benefit:",{"type":47,"value":223}," Cosmetic changes (CSS, layout, pagination) only require editing\nthe HTML\u002FJS file and refreshing the browser.",{"type":41,"tag":152,"props":225,"children":227},{"id":226},"_2-in-memory-caching",[228],{"type":47,"value":229},"2. In-Memory Caching",{"type":41,"tag":159,"props":231,"children":232},{},[233,238],{"type":41,"tag":100,"props":234,"children":235},{},[236],{"type":47,"value":237},"AI\u002FML model operations (like generating embeddings or running similarity\nsearches) are expensive and slow (often multiple seconds).",{"type":41,"tag":100,"props":239,"children":240},{},[241,246],{"type":41,"tag":71,"props":242,"children":243},{},[244],{"type":47,"value":245},"Pattern:",{"type":47,"value":247}," The backend server should cache search\u002Finference on the first\nrequest. Subsequent API requests for the data should be served instantly\n(\u003C5ms) from this cache.",{"type":41,"tag":152,"props":249,"children":251},{"id":250},"_3-dynamic-media-streaming-on-the-fly-slicing",[252],{"type":47,"value":253},"3. Dynamic Media Streaming (On-the-Fly Slicing)",{"type":41,"tag":159,"props":255,"children":256},{},[257,269,301],{"type":41,"tag":100,"props":258,"children":259},{},[260,262,267],{"type":47,"value":261},"When displaying segments of large media files (e.g., 5-second windows from\n20MB audio files), ",{"type":41,"tag":71,"props":263,"children":264},{},[265],{"type":47,"value":266},"do not",{"type":47,"value":268}," pre-slice them to disk or embed them as\nbase64.",{"type":41,"tag":100,"props":270,"children":271},{},[272,276,278,284,286,292,294,299],{"type":41,"tag":71,"props":273,"children":274},{},[275],{"type":47,"value":245},{"type":47,"value":277}," Create a streaming endpoint (e.g.,\n",{"type":41,"tag":173,"props":279,"children":281},{"className":280},[],[282],{"type":47,"value":283},"\u002Fstream?file=...&start=...&end=...",{"type":47,"value":285},"). The server uses efficient libraries\n(like ",{"type":41,"tag":173,"props":287,"children":289},{"className":288},[],[290],{"type":47,"value":291},"soundfile",{"type":47,"value":293}," for audio) to ",{"type":41,"tag":71,"props":295,"children":296},{},[297],{"type":47,"value":298},"seek directly",{"type":47,"value":300}," to the start time and read\nonly the requested range in-memory, streaming the bytes back instantly.",{"type":41,"tag":100,"props":302,"children":303},{},[304,309],{"type":41,"tag":71,"props":305,"children":306},{},[307],{"type":47,"value":308},"Network Efficiency:",{"type":47,"value":310}," This is crucial when serving from a remote machine\nto a local browser via SSH port forwarding, as it drastically reduces\nnetwork transfer.",{"type":41,"tag":152,"props":312,"children":314},{"id":313},"_4-client-side-dynamic-paging",[315],{"type":47,"value":316},"4. Client-Side Dynamic Paging",{"type":41,"tag":159,"props":318,"children":319},{},[320,325,334],{"type":41,"tag":100,"props":321,"children":322},{},[323],{"type":47,"value":324},"Handle pagination in the browser using JavaScript.",{"type":41,"tag":100,"props":326,"children":327},{},[328,332],{"type":41,"tag":71,"props":329,"children":330},{},[331],{"type":47,"value":245},{"type":47,"value":333}," Load all results via the API, but hide\u002Fshow rows dynamically.",{"type":41,"tag":100,"props":335,"children":336},{},[337,342],{"type":41,"tag":71,"props":338,"children":339},{},[340],{"type":47,"value":341},"Smart Player Control:",{"type":47,"value":343}," When navigating pages, ensure any active media\nplayers are automatically paused so they don't continue playing in the\nbackground.",{"type":41,"tag":152,"props":345,"children":347},{"id":346},"_5-robust-media-layouts-preventing-squishing",[348],{"type":47,"value":349},"5. Robust Media Layouts (Preventing Squishing)",{"type":41,"tag":159,"props":351,"children":352},{},[353,374,406],{"type":41,"tag":100,"props":354,"children":355},{},[356,358,364,366,372],{"type":47,"value":357},"Avoid default compression of media players (like ",{"type":41,"tag":173,"props":359,"children":361},{"className":360},[],[362],{"type":47,"value":363},"\u003Caudio>",{"type":47,"value":365}," or ",{"type":41,"tag":173,"props":367,"children":369},{"className":368},[],[370],{"type":47,"value":371},"\u003Cvideo>",{"type":47,"value":373},")\ninside flexible layouts (like Bootstrap tables or flexbox containers).",{"type":41,"tag":100,"props":375,"children":376},{},[377,381,383,389,390,396,398,404],{"type":41,"tag":71,"props":378,"children":379},{},[380],{"type":47,"value":245},{"type":47,"value":382}," Always define a clear, functional width for media players\n(e.g., ",{"type":41,"tag":173,"props":384,"children":386},{"className":385},[],[387],{"type":47,"value":388},"width: 250px;",{"type":47,"value":365},{"type":41,"tag":173,"props":391,"children":393},{"className":392},[],[394],{"type":47,"value":395},"width: 300px;",{"type":47,"value":397},") and ensure their container or\ntable column has sufficient space and prevents wrapping (e.g., ",{"type":41,"tag":173,"props":399,"children":401},{"className":400},[],[402],{"type":47,"value":403},"white-space: nowrap;",{"type":47,"value":405},").",{"type":41,"tag":100,"props":407,"children":408},{},[409,413],{"type":41,"tag":71,"props":410,"children":411},{},[412],{"type":47,"value":221},{"type":47,"value":414}," Ensures play controls and progress bars remain fully visible\nand usable across different screen sizes.",{"type":41,"tag":152,"props":416,"children":418},{"id":417},"_6-thread-safe-multi-threaded-backend-sqlite-concurrency",[419],{"type":47,"value":420},"6. Thread-Safe Multi-Threaded Backend (SQLite Concurrency)",{"type":41,"tag":159,"props":422,"children":423},{},[424,429,445],{"type":41,"tag":100,"props":425,"children":426},{},[427],{"type":47,"value":428},"Single-threaded backends block the entire event loop when transferring large\nfiles or streaming audio, causing simultaneous API requests to time out.",{"type":41,"tag":100,"props":430,"children":431},{},[432,436,438,444],{"type":41,"tag":71,"props":433,"children":434},{},[435],{"type":47,"value":245},{"type":47,"value":437}," Use a multi-threaded server\n(",{"type":41,"tag":173,"props":439,"children":441},{"className":440},[],[442],{"type":47,"value":443},"socketserver.ThreadingTCPServer",{"type":47,"value":405},{"type":41,"tag":100,"props":446,"children":447},{},[448,453,455,461,463,468,470,476],{"type":41,"tag":71,"props":449,"children":450},{},[451],{"type":47,"value":452},"Database Isolation",{"type":47,"value":454},": SQLite connections are thread-bound. Do not share a\nsingle connection across threads (which causes ",{"type":41,"tag":173,"props":456,"children":458},{"className":457},[],[459],{"type":47,"value":460},"ProgrammingError",{"type":47,"value":462},"). Instead,\ninitialize and pool database connections in ",{"type":41,"tag":71,"props":464,"children":465},{},[466],{"type":47,"value":467},"thread-local storage",{"type":47,"value":469}," (e.g.,\n",{"type":41,"tag":173,"props":471,"children":473},{"className":472},[],[474],{"type":47,"value":475},"threading.local()",{"type":47,"value":405},{"type":41,"tag":152,"props":478,"children":480},{"id":479},"_7-robust-media-streaming-connection-management",[481],{"type":47,"value":482},"7. Robust Media Streaming Connection Management",{"type":41,"tag":159,"props":484,"children":485},{},[486,514],{"type":41,"tag":100,"props":487,"children":488},{},[489,491,497,498,504,506,512],{"type":47,"value":490},"When users pause or switch tabs, the browser aborts the stream connection\nabruptly. This throws a ",{"type":41,"tag":173,"props":492,"children":494},{"className":493},[],[495],{"type":47,"value":496},"BrokenPipeError",{"type":47,"value":365},{"type":41,"tag":173,"props":499,"children":501},{"className":500},[],[502],{"type":47,"value":503},"ConnectionResetError",{"type":47,"value":505}," during\nserver ",{"type":41,"tag":173,"props":507,"children":509},{"className":508},[],[510],{"type":47,"value":511},".write()",{"type":47,"value":513}," calls.",{"type":41,"tag":100,"props":515,"children":516},{},[517,521,523,529],{"type":41,"tag":71,"props":518,"children":519},{},[520],{"type":47,"value":245},{"type":47,"value":522}," Always wrap audio streaming write calls in a ",{"type":41,"tag":173,"props":524,"children":526},{"className":525},[],[527],{"type":47,"value":528},"try-except",{"type":47,"value":530}," block\nto catch and silence these disconnects gracefully, preventing traceback\nbloat.",{"type":41,"tag":152,"props":532,"children":534},{"id":533},"_8-zero-latency-browser-side-operations-instant-sorting-paging",[535],{"type":47,"value":536},"8. Zero-Latency Browser-Side Operations (Instant Sorting & Paging)",{"type":41,"tag":159,"props":538,"children":539},{},[540,545,577],{"type":41,"tag":100,"props":541,"children":542},{},[543],{"type":47,"value":544},"Making API requests for simple paging, sorting, or checkbox filtering (like\nhiding annotated rows) introduces unnecessary network lag.",{"type":41,"tag":100,"props":546,"children":547},{},[548,552,554,559,561,567,569,575],{"type":41,"tag":71,"props":549,"children":550},{},[551],{"type":47,"value":245},{"type":47,"value":553}," Fetch the complete database results once from the backend.\nImplement sorting, filtering (like toggling between showing\u002Fhiding labeled\ndata), and paging ",{"type":41,"tag":71,"props":555,"children":556},{},[557],{"type":47,"value":558},"entirely in client-side JavaScript",{"type":47,"value":560}," (e.g. using\nstandard ",{"type":41,"tag":173,"props":562,"children":564},{"className":563},[],[565],{"type":47,"value":566},".sort()",{"type":47,"value":568}," and ",{"type":41,"tag":173,"props":570,"children":572},{"className":571},[],[573],{"type":47,"value":574},".filter()",{"type":47,"value":576}," arrays).",{"type":41,"tag":100,"props":578,"children":579},{},[580,585,587,593],{"type":41,"tag":71,"props":581,"children":582},{},[583],{"type":47,"value":584},"Smart Media Management",{"type":47,"value":586},": When users change pages, ensure JavaScript loops\nthrough all active media players on the page and calls ",{"type":41,"tag":173,"props":588,"children":590},{"className":589},[],[591],{"type":47,"value":592},".pause()",{"type":47,"value":594}," to prevent\naudio overlaps.",{"type":41,"tag":152,"props":596,"children":598},{"id":597},"_9-thread-safe-shared-state-locking",[599],{"type":47,"value":600},"9. Thread-Safe Shared State Locking",{"type":41,"tag":159,"props":602,"children":603},{},[604,633],{"type":41,"tag":100,"props":605,"children":606},{},[607,609,615,617,623,625,631],{"type":47,"value":608},"In multi-threaded backends, different worker threads handle ",{"type":41,"tag":173,"props":610,"children":612},{"className":611},[],[613],{"type":47,"value":614},"\u002Fapi\u002Ftrain",{"type":47,"value":616},",\n",{"type":41,"tag":173,"props":618,"children":620},{"className":619},[],[621],{"type":47,"value":622},"\u002Fapi\u002Fsearch",{"type":47,"value":624},", and ",{"type":41,"tag":173,"props":626,"children":628},{"className":627},[],[629],{"type":47,"value":630},"\u002Fapi\u002Fannotation",{"type":47,"value":632}," in parallel. Modifying shared variables\n(like in-memory search result caches) without protection leads to race\nconditions.",{"type":41,"tag":100,"props":634,"children":635},{},[636,640,642,648],{"type":41,"tag":71,"props":637,"children":638},{},[639],{"type":47,"value":245},{"type":47,"value":641}," Always protect writes to shared global caches or model states\nusing a mutual exclusion lock (",{"type":41,"tag":173,"props":643,"children":645},{"className":644},[],[646],{"type":47,"value":647},"threading.Lock()",{"type":47,"value":405},{"type":41,"tag":152,"props":650,"children":652},{"id":651},"_10-safe-json-serialization-handling-numpy-types-nan-and-infinity",[653],{"type":47,"value":654},"10. Safe JSON Serialization (Handling NumPy Types, NaN, and Infinity)",{"type":41,"tag":159,"props":656,"children":657},{},[658,745],{"type":41,"tag":100,"props":659,"children":660},{},[661,666,668,674,676,682,684,690,692,698,700],{"type":41,"tag":71,"props":662,"children":663},{},[664],{"type":47,"value":665},"NumPy Types",{"type":47,"value":667},": AI\u002FML libraries (like USearch or NumPy itself) often return\nvalues as NumPy-specific types (e.g., ",{"type":41,"tag":173,"props":669,"children":671},{"className":670},[],[672],{"type":47,"value":673},"numpy.uint64",{"type":47,"value":675}," for IDs,\n",{"type":41,"tag":173,"props":677,"children":679},{"className":678},[],[680],{"type":47,"value":681},"numpy.float32",{"type":47,"value":683}," for scores). Python's default ",{"type":41,"tag":173,"props":685,"children":687},{"className":686},[],[688],{"type":47,"value":689},"json.dumps()",{"type":47,"value":691}," does not\nsupport these and will raise a ",{"type":41,"tag":173,"props":693,"children":695},{"className":694},[],[696],{"type":47,"value":697},"TypeError: Object of type ... is not JSON serializable",{"type":47,"value":699},".\n",{"type":41,"tag":159,"props":701,"children":702},{},[703],{"type":41,"tag":100,"props":704,"children":705},{},[706,711,713,719,721,727,729,735,737,743],{"type":41,"tag":71,"props":707,"children":708},{},[709],{"type":47,"value":710},"Pattern",{"type":47,"value":712},": Explicitly cast NumPy values (e.g. ",{"type":41,"tag":173,"props":714,"children":716},{"className":715},[],[717],{"type":47,"value":718},"int()",{"type":47,"value":720},", ",{"type":41,"tag":173,"props":722,"children":724},{"className":723},[],[725],{"type":47,"value":726},"float()",{"type":47,"value":728},"), or\nuse a custom ",{"type":41,"tag":173,"props":730,"children":732},{"className":731},[],[733],{"type":47,"value":734},"JSONEncoder",{"type":47,"value":736}," (like the ",{"type":41,"tag":173,"props":738,"children":740},{"className":739},[],[741],{"type":47,"value":742},"SafeEncoder",{"type":47,"value":744}," class defined in the\nserver template) to automatically convert NumPy types to native Python\ntypes during serialization.",{"type":41,"tag":100,"props":746,"children":747},{},[748,753,755,761,762,768,770,775,777,783,785],{"type":41,"tag":71,"props":749,"children":750},{},[751],{"type":47,"value":752},"NaN and Infinity",{"type":47,"value":754},": AI\u002FML models often generate score\u002Fdistance metrics\ncontaining ",{"type":41,"tag":173,"props":756,"children":758},{"className":757},[],[759],{"type":47,"value":760},"NaN",{"type":47,"value":365},{"type":41,"tag":173,"props":763,"children":765},{"className":764},[],[766],{"type":47,"value":767},"Infinity",{"type":47,"value":769},". Python's default ",{"type":41,"tag":173,"props":771,"children":773},{"className":772},[],[774],{"type":47,"value":689},{"type":47,"value":776}," allows these\nvalues, but they result in invalid JSON that crashes JavaScript parser\nengines (",{"type":41,"tag":173,"props":778,"children":780},{"className":779},[],[781],{"type":47,"value":782},"JSON.parse",{"type":47,"value":784},") in the browser.\n",{"type":41,"tag":159,"props":786,"children":787},{},[788],{"type":41,"tag":100,"props":789,"children":790},{},[791,795,797,803,805,812],{"type":41,"tag":71,"props":792,"children":793},{},[794],{"type":47,"value":710},{"type":47,"value":796},": Sanitize all float values using the ",{"type":41,"tag":173,"props":798,"children":800},{"className":799},[],[801],{"type":47,"value":802},"sanitize_float",{"type":47,"value":804}," helper\nfunction in ",{"type":41,"tag":806,"props":807,"children":809},"a",{"href":808},"references\u002Fserver.py",[810],{"type":47,"value":811},"server.py",{"type":47,"value":813}," before returning them in\nJSON API responses.",{"type":41,"tag":152,"props":815,"children":817},{"id":816},"_11-material-design-3-m3-visual-conformance",[818],{"type":47,"value":819},"11. Material Design 3 (M3) Visual Conformance",{"type":41,"tag":159,"props":821,"children":822},{},[823,845,941,951],{"type":41,"tag":100,"props":824,"children":825},{},[826,828,833,835,843],{"type":47,"value":827},"The UI template follows the ",{"type":41,"tag":71,"props":829,"children":830},{},[831],{"type":47,"value":832},"Material Design 3 (M3)",{"type":47,"value":834}," design system\n(",{"type":41,"tag":806,"props":836,"children":840},{"href":837,"rel":838},"https:\u002F\u002Fm3.material.io\u002F",[839],"nofollow",[841],{"type":47,"value":842},"m3.material.io",{"type":47,"value":844},") with a light color scheme.",{"type":41,"tag":100,"props":846,"children":847},{},[848,853,855,861,863],{"type":41,"tag":71,"props":849,"children":850},{},[851],{"type":47,"value":852},"Pattern — Token-Driven CSS",{"type":47,"value":854},": All styling is driven by CSS custom\nproperties (design tokens) defined in ",{"type":41,"tag":173,"props":856,"children":858},{"className":857},[],[859],{"type":47,"value":860},":root",{"type":47,"value":862},". The tokens cover:\n",{"type":41,"tag":159,"props":864,"children":865},{},[866,891,901,911,921,931],{"type":41,"tag":100,"props":867,"children":868},{},[869,874,876,882,884,889],{"type":41,"tag":71,"props":870,"children":871},{},[872],{"type":47,"value":873},"Color",{"type":47,"value":875},": Full M3 light scheme with primary, secondary, tertiary,\nerror, surface, and outline role tokens. The template uses a teal seed\ncolor (",{"type":41,"tag":173,"props":877,"children":879},{"className":878},[],[880],{"type":47,"value":881},"#006B5E",{"type":47,"value":883},") appropriate for ecology, but can be re-seeded by\nswapping the ",{"type":41,"tag":173,"props":885,"children":887},{"className":886},[],[888],{"type":47,"value":860},{"type":47,"value":890}," color block.",{"type":41,"tag":100,"props":892,"children":893},{},[894,899],{"type":41,"tag":71,"props":895,"children":896},{},[897],{"type":47,"value":898},"Typography",{"type":47,"value":900},": M3 type scale (Display, Headline, Title, Body, Label ×\nLarge\u002FMedium\u002FSmall) using Roboto.",{"type":41,"tag":100,"props":902,"children":903},{},[904,909],{"type":41,"tag":71,"props":905,"children":906},{},[907],{"type":47,"value":908},"Shape",{"type":47,"value":910},": M3 shape scale (None → Extra-small → Small → Medium → Large →\nExtra-large → Full).",{"type":41,"tag":100,"props":912,"children":913},{},[914,919],{"type":41,"tag":71,"props":915,"children":916},{},[917],{"type":47,"value":918},"Elevation",{"type":47,"value":920},": 6-level shadow system (Level 0–5).",{"type":41,"tag":100,"props":922,"children":923},{},[924,929],{"type":41,"tag":71,"props":925,"children":926},{},[927],{"type":47,"value":928},"Motion",{"type":47,"value":930},": Duration and easing tokens for transitions.",{"type":41,"tag":100,"props":932,"children":933},{},[934,939],{"type":41,"tag":71,"props":935,"children":936},{},[937],{"type":47,"value":938},"State Layers",{"type":47,"value":940},": Hover (8%), focus (10%), pressed (10%) opacity\noverlays.",{"type":41,"tag":100,"props":942,"children":943},{},[944,949],{"type":41,"tag":71,"props":945,"children":946},{},[947],{"type":47,"value":948},"Component mapping",{"type":47,"value":950},": Top App Bar (Small), Navigation Drawer (Standard),\nSegmented Buttons, Filled\u002FTonal\u002FOutlined Buttons, Outlined Text Fields,\nOutlined Cards, and M3-styled snackbar notifications.",{"type":41,"tag":100,"props":952,"children":953},{},[954,959],{"type":41,"tag":71,"props":955,"children":956},{},[957],{"type":47,"value":958},"No external CSS framework",{"type":47,"value":960},": The template uses only pure CSS with custom\nproperties — no Tailwind, Bootstrap, or other framework — to ensure\nauthentic M3 token mapping and smaller payload.",{"type":41,"tag":152,"props":962,"children":964},{"id":963},"_12-iframe-safe-error-handling-no-alertconfirmprompt",[965],{"type":47,"value":966},"12. Iframe-Safe Error Handling (No alert\u002Fconfirm\u002Fprompt)",{"type":41,"tag":159,"props":968,"children":969},{},[970,1013,1030,1048],{"type":41,"tag":100,"props":971,"children":972},{},[973,975,981,982,988,989,995,997,1003,1005,1011],{"type":47,"value":974},"When the UI is served inside an iframe (e.g., as an Antigravity sidecar),\nbrowsers block ",{"type":41,"tag":173,"props":976,"children":978},{"className":977},[],[979],{"type":47,"value":980},"alert()",{"type":47,"value":720},{"type":41,"tag":173,"props":983,"children":985},{"className":984},[],[986],{"type":47,"value":987},"confirm()",{"type":47,"value":624},{"type":41,"tag":173,"props":990,"children":992},{"className":991},[],[993],{"type":47,"value":994},"prompt()",{"type":47,"value":996}," in cross-origin iframe\ncontexts. The dialog never shows, JavaScript execution suspends permanently,\nand the calling ",{"type":41,"tag":173,"props":998,"children":1000},{"className":999},[],[1001],{"type":47,"value":1002},"async",{"type":47,"value":1004}," function's ",{"type":41,"tag":173,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":47,"value":1010},"finally",{"type":47,"value":1012}," block never runs — causing the\nUI to freeze.",{"type":41,"tag":100,"props":1014,"children":1015},{},[1016,1021,1023,1028],{"type":41,"tag":71,"props":1017,"children":1018},{},[1019],{"type":47,"value":1020},"Pattern — Inline Snackbar Notifications",{"type":47,"value":1022},": Replace all ",{"type":41,"tag":173,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":47,"value":980},{"type":47,"value":1029}," calls\nwith a dynamically-created snackbar element that appears at the bottom of\nthe viewport and auto-dismisses after 6 seconds. Use M3 inverse-surface\ncolors for info messages and error-container colors for errors.",{"type":41,"tag":100,"props":1031,"children":1032},{},[1033,1038,1040,1046],{"type":41,"tag":71,"props":1034,"children":1035},{},[1036],{"type":47,"value":1037},"Fetch Timeout",{"type":47,"value":1039},": Long-running server operations (like model training) must\nuse an ",{"type":41,"tag":173,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":47,"value":1045},"AbortController",{"type":47,"value":1047}," with a timeout to prevent indefinite hangs if the\nserver becomes unresponsive.",{"type":41,"tag":100,"props":1049,"children":1050},{},[1051,1056,1058,1064],{"type":41,"tag":71,"props":1052,"children":1053},{},[1054],{"type":47,"value":1055},"Error Message Extraction",{"type":47,"value":1057},": When the server returns an error response,\nalways attempt to parse the JSON body and extract the ",{"type":41,"tag":173,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":47,"value":1063},".error",{"type":47,"value":1065}," field to\ndisplay the actual server message instead of a generic failure string.",{"type":41,"tag":1067,"props":1068,"children":1069},"hr",{},[],{"type":41,"tag":1067,"props":1071,"children":1072},{},[],{"type":41,"tag":84,"props":1074,"children":1076},{"id":1075},"templates-and-examples",[1077],{"type":47,"value":1078},"Templates and Examples",{"type":41,"tag":50,"props":1080,"children":1081},{},[1082,1084,1090],{"type":47,"value":1083},"The skill contains generic templates meant to be copied to the project's\nworking directory (e.g., ",{"type":41,"tag":173,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":47,"value":1089},"agent_workspace\u002F",{"type":47,"value":1091},") and adapted:",{"type":41,"tag":159,"props":1093,"children":1094},{},[1095,1112],{"type":41,"tag":100,"props":1096,"children":1097},{},[1098,1103,1105,1110],{"type":41,"tag":71,"props":1099,"children":1100},{},[1101],{"type":47,"value":1102},"Static HTML Template",{"type":47,"value":1104},": ",{"type":41,"tag":806,"props":1106,"children":1108},{"href":1107},"references\u002Findex.html",[1109],{"type":47,"value":178},{"type":47,"value":1111}," — M3-compliant\nhierarchical client-side UI with design tokens, database\u002Flabel selection,\npaging, annotation, and inline snackbar notifications.",{"type":41,"tag":100,"props":1113,"children":1114},{},[1115,1120,1121,1125],{"type":41,"tag":71,"props":1116,"children":1117},{},[1118],{"type":47,"value":1119},"Custom Python Server",{"type":47,"value":1104},{"type":41,"tag":806,"props":1122,"children":1123},{"href":808},[1124],{"type":47,"value":811},{"type":47,"value":1126}," — API server\nexposing endpoints to list databases, retrieve rows, train classifiers, and\nsave annotations.",{"items":1128,"total":1300},[1129,1150,1165,1185,1197,1212,1228,1241,1253,1268,1279,1289],{"slug":1130,"name":1130,"fn":1131,"description":1132,"org":1133,"tags":1134,"stars":1147,"repoUrl":1148,"updatedAt":1149},"alphafold-database-fetch-and-analyze","retrieve and analyze AlphaFold protein structures","Retrieve and analyze AlphaFold predicted structures for a protein. Use when the user provides a specific UniProt Accession ID and wants structural confidence metrics (pLDDT), domain boundary analysis, or disorder assessment. Do not use if the user only has a protein name, gene name, or amino acid sequence — ask for a UniProt ID first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1135,1138,1141,1144],{"name":1136,"slug":1137,"type":15},"Bioinformatics","bioinformatics",{"name":1139,"slug":1140,"type":15},"Genomics","genomics",{"name":1142,"slug":1143,"type":15},"Life Sciences","life-sciences",{"name":1145,"slug":1146,"type":15},"Research","research",2690,"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fscience-skills","2026-07-12T07:51:51.827211",{"slug":1151,"name":1151,"fn":1152,"description":1153,"org":1154,"tags":1155,"stars":1147,"repoUrl":1148,"updatedAt":1164},"alphagenome-single-variant-analysis","analyze genetic variant effects with AlphaGenome","Analyzes genetic variant effects on gene expression (RNA-seq), chromatin accessibility (DNASE), histone marks (ChIP), and transcription factors using the AlphaGenome API. Use when the user asks about non-coding variant effects, pathogenicity, clinical significance, disease associations, functional effects, gene expression changes, splicing disruption, or regulatory effects in promoters and enhancers. Also use for resolving biological terms to tissue\u002Fcell-type ontologies (UBERON\u002FCL) or analyzing variants in chr:pos:ref>alt format.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1156,1157,1160,1161],{"name":1136,"slug":1137,"type":15},{"name":1158,"slug":1159,"type":15},"Genetics","genetics",{"name":1145,"slug":1146,"type":15},{"name":1162,"slug":1163,"type":15},"RNA-seq","rna-seq","2026-07-12T07:51:39.494803",{"slug":1166,"name":1166,"fn":1167,"description":1168,"org":1169,"tags":1170,"stars":1147,"repoUrl":1148,"updatedAt":1184},"chembl-database","query ChEMBL database for bioactive molecules","Query the ChEMBL database for bioactive molecules, drug targets, bioactivity data, approved drugs, and chemical structures. Use when the user asks about compounds, targets, IC50\u002FKi values, drug mechanisms, or structure searches.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1171,1174,1177,1180,1183],{"name":1172,"slug":1173,"type":15},"ChEMBL","chembl",{"name":1175,"slug":1176,"type":15},"Chemistry","chemistry",{"name":1178,"slug":1179,"type":15},"Database","database",{"name":1181,"slug":1182,"type":15},"Pharmacology","pharmacology",{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:35.544306",{"slug":1186,"name":1186,"fn":1187,"description":1188,"org":1189,"tags":1190,"stars":1147,"repoUrl":1148,"updatedAt":1196},"clinical-trials-database","query clinical trial data","Query ClinicalTrials.gov via APIv2. Use when you want to search for trials by condition, drug, location, status, or phase; retrieve trial details by NCT ID; check eligibility\u002Finclusion criteria; count trials across conditions or time periods; identify a sponsor's trial portfolio; find recruiting trials for patient matching.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1191,1194,1195],{"name":1192,"slug":1193,"type":15},"Clinical Trials","clinical-trials",{"name":1142,"slug":1143,"type":15},{"name":1145,"slug":1146,"type":15},"2026-07-12T07:52:06.846705",{"slug":1198,"name":1198,"fn":1199,"description":1200,"org":1201,"tags":1202,"stars":1147,"repoUrl":1148,"updatedAt":1211},"clinvar-database","retrieve clinical significance from ClinVar database","Use when needing clinical significance, pathogenicity classifications (e.g., Pathogenic, Benign, VUS), clinical evidence rationales, or finding \"hard positive\" benchmark controls for human genomic variants.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1203,1206,1207,1210],{"name":1204,"slug":1205,"type":15},"ClinVar","clinvar",{"name":1158,"slug":1159,"type":15},{"name":1208,"slug":1209,"type":15},"Healthcare","healthcare",{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:36.86094",{"slug":1213,"name":1213,"fn":1214,"description":1215,"org":1216,"tags":1217,"stars":1147,"repoUrl":1148,"updatedAt":1227},"credentials","manage and verify API credentials safely","Instructions for handling API keys and credentials safely, verifying their presence, and prompting the user to add them if missing using a safe protocol.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1218,1221,1224],{"name":1219,"slug":1220,"type":15},"Compliance","compliance",{"name":1222,"slug":1223,"type":15},"Operations","operations",{"name":1225,"slug":1226,"type":15},"Security","security","2026-07-12T07:52:17.355491",{"slug":1229,"name":1229,"fn":1230,"description":1231,"org":1232,"tags":1233,"stars":1147,"repoUrl":1148,"updatedAt":1240},"dbsnp-database","search genetic variants in dbSNP database","Use when you want to look up, map, and search for short genetic variants (SNPs, indels) in NCBI's dbSNP database. Resolves between rsIDs, genomic coordinates in VCF format, and HGVS strings. For an rsID, returns variant type, gene associations, clinical significance, allele frequencies, and genomic coordinates (GRCh38).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1234,1235,1236,1239],{"name":1136,"slug":1137,"type":15},{"name":1158,"slug":1159,"type":15},{"name":1237,"slug":1238,"type":15},"NCBI","ncbi",{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:33.054229",{"slug":1242,"name":1242,"fn":1243,"description":1244,"org":1245,"tags":1246,"stars":1147,"repoUrl":1148,"updatedAt":1252},"embl-ebi-ols","search biomedical ontologies in EMBL-EBI OLS","Query and search the EMBL-EBI Ontology Lookup Service (OLS) for biomedical ontology terms, definitions, and hierarchies across 250+ ontologies (e.g., GO, DOID, HP). Use when the user asks to search for terms, retrieve details, navigate hierarchies (parents, children, ancestors), look up properties and individuals, get autocomplete suggestions, or access ontology metadata and statistics.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1247,1248,1251],{"name":1136,"slug":1137,"type":15},{"name":1249,"slug":1250,"type":15},"Ontology","ontology",{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:59.368324",{"slug":1254,"name":1254,"fn":1255,"description":1256,"org":1257,"tags":1258,"stars":1147,"repoUrl":1148,"updatedAt":1267},"encode-ccres-database","query ENCODE regulatory and experimental data","Query the ENCODE Registry of cis-Regulatory Elements (cCREs) via the SCREEN GraphQL API, or make custom queries to the ENCODE Portal REST API for experiments and files (ChIP-seq peaks, etc.). Use when you want to query regulatory annotations or raw experimental data across human cell types.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1259,1260,1263,1264],{"name":1136,"slug":1137,"type":15},{"name":1261,"slug":1262,"type":15},"GraphQL","graphql",{"name":1145,"slug":1146,"type":15},{"name":1265,"slug":1266,"type":15},"REST API","rest-api","2026-07-12T07:52:10.597139",{"slug":1269,"name":1269,"fn":1270,"description":1271,"org":1272,"tags":1273,"stars":1147,"repoUrl":1148,"updatedAt":1278},"ensembl-database","query genomic and protein data from Ensembl","Query the Ensembl database to resolve gene, transcript, and protein IDs, fetch genomic or protein sequences, retrieve gene structures (exons), and get variant consequence and effect predictions (VEP). Use this skill as a primary ID translator, genomic sequence database and variant effect prediction tool.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1274,1275,1276,1277],{"name":1136,"slug":1137,"type":15},{"name":1158,"slug":1159,"type":15},{"name":1142,"slug":1143,"type":15},{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:41.645835",{"slug":1280,"name":1280,"fn":1281,"description":1282,"org":1283,"tags":1284,"stars":1147,"repoUrl":1148,"updatedAt":1288},"foldseek-structural-search","perform 3D protein structural searches","Performs 3D structural searches of proteins against various databases (PDB, AlphaFold, CATH, MGnify, etc.) using the Foldseek API. Use ONLY when the user provides a physical 3D coordinate file (.cif, .mmcif, or .pdb) and wants to find structurally similar proteins. Do NOT use if the user only provides a protein sequence, gene name, or UniProt ID.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1285,1286,1287],{"name":1136,"slug":1137,"type":15},{"name":1142,"slug":1143,"type":15},{"name":1145,"slug":1146,"type":15},"2026-07-12T07:52:09.354992",{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1293,"tags":1294,"stars":1147,"repoUrl":1148,"updatedAt":1299},"gnomad-database","query genetic variant data from gnomAD","Query the Genome Aggregation Database (gnomAD). Use when determining the rarity or allele frequency of specific genetic variants, retrieving gene constraint metrics (pLI, LOEUF) to assess loss-of-function intolerance, finding variants in a genomic region or gene, or querying structural variants. Don't use for analyzing individual patient genomes, tracking somatic mutations in cancer (use COSMIC), or requesting raw sequencing reads (use ENA).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1295,1296,1297,1298],{"name":1136,"slug":1137,"type":15},{"name":1158,"slug":1159,"type":15},{"name":1142,"slug":1143,"type":15},{"name":1145,"slug":1146,"type":15},"2026-07-12T07:51:38.213009",43,{"items":1302,"total":1366},[1303,1317,1329,1343,1359],{"slug":1304,"name":1304,"fn":1305,"description":1306,"org":1307,"tags":1308,"stars":25,"repoUrl":26,"updatedAt":1316},"agentic-ecology-bioacoustics","perform bioacoustic analysis for ecological research","Provides bioacoustic analysis capabilities for ecologists and researchers using the perch-hoplite Python package. A typical use case is to use agile modeling to bootstrap the creation and deployment of a bespoke detector for targeted species on an existing collection of passive acoustic monitoring recordings.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1309,1312,1315],{"name":1310,"slug":1311,"type":15},"Data Analysis","data-analysis",{"name":1313,"slug":1314,"type":15},"Python","python",{"name":1145,"slug":1146,"type":15},"2026-08-29T09:48:06.668897",{"slug":1318,"name":1318,"fn":1319,"description":1320,"org":1321,"tags":1322,"stars":25,"repoUrl":26,"updatedAt":1328},"agentic-ecology-camera-traps","classify and search camera trap images","Provides capabilities to run SpeciesNet detector and classifier on camera trap images, extract crop-level feature embeddings, and populate a Hoplite vector database for downstream search and agile modeling.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1323,1326,1327],{"name":1324,"slug":1325,"type":15},"Computer Vision","computer-vision",{"name":1310,"slug":1311,"type":15},{"name":20,"slug":21,"type":15},"2026-08-29T09:48:07.220771",{"slug":1330,"name":1330,"fn":1331,"description":1332,"org":1333,"tags":1334,"stars":25,"repoUrl":26,"updatedAt":1342},"agentic-ecology-init","initialize Python projects for agentic ecology","Initializes a local uv-managed project directory for agentic ecology workloads. Sets up Python dependencies using reference pyproject.toml and uv.lock, configures workspace rules, and ensures Agentic Ecology skills are discoverable.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1335,1338,1341],{"name":1336,"slug":1337,"type":15},"Engineering","engineering",{"name":1339,"slug":1340,"type":15},"Local Development","local-development",{"name":1313,"slug":1314,"type":15},"2026-08-29T09:48:06.14295",{"slug":1344,"name":1344,"fn":1345,"description":1346,"org":1347,"tags":1348,"stars":25,"repoUrl":26,"updatedAt":1358},"agentic-ecology-storage","upload local data to cloud storage","Provides guidelines and reference implementations for uploading local data (such as audio recordings or datasets) to cloud storage systems, focusing on Google Drive via rclone as the primary target.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1349,1352,1355],{"name":1350,"slug":1351,"type":15},"Data Engineering","data-engineering",{"name":1353,"slug":1354,"type":15},"Google Drive","google-drive",{"name":1356,"slug":1357,"type":15},"Storage","storage","2026-08-29T09:48:13.00055",{"slug":4,"name":4,"fn":5,"description":6,"org":1360,"tags":1361,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1362,1363,1364,1365],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},5]