AI-powered adeno-associated virus (AAV) vector design for gene therapy including capsid engineering, promoter selection, and tropism optimization.
日本語の概要は準備中です。原文の説明を表示しています。
Store and retrieve unstructured objects, file uploads, and cache-like state on Netlify using the @netlify/blobs key/value API from Functions, Edge Functions, and Build Plugins. Use when a task involves saving user file or image uploads, persisting form or contact-form submissions, storing generated output from Background Functions (sitemaps/processed media/bulk-email results), building read-only asset stores, adding client-side blob expiration, or wiring file-based blob uploads at deploy time. Not for per-user, transactional, or relational data (counters/balances/sessions) — reach for Netlify DB there instead.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Modern import — reach for this:
import { getStore, getDeployStore, listStores } from "@netlify/blobs";
Install: npm install @netlify/blobs. Fetch API is required (built into Node 18+); otherwise pass a custom fetch.
Two ways to open a store — use the options-object form when you need consistency or a custom fetch (the string form cannot pass them):
const store = getStore("file-uploads"); // string form
const store = getStore({ name: "animals", consistency: "strong" }); // options form
siteID, token, deployID, and region are set automatically inside Functions, Edge Functions, and Build Plugins — do not pass them manually there.
getStore(name) — site-scoped. Persists across deploys and is shared across ALL deploy contexts. Code on a Deploy Preview reads, overwrites, and deletes production data. Never seed throwaway data or run destructive tests from a preview.getDeployStore(name) — scoped to one deploy; isolated from production. Use this for throwaway/per-deploy data, or use a context-specific store name for isolation.Blobs have no built-in access control — the serving function is the gate. Default to private: gate reads behind an authenticated function rather than exposing blobs publicly. Never accept an arbitrary caller-supplied key against a store holding sensitive data.
set)import { getStore } from "@netlify/blobs";
import type { Context } from "@netlify/functions";
import { v4 as uuid } from "uuid";
export default async (req: Request, context: Context) => {
const form = await req.formData();
const file = form.get("file") as File;
const key = uuid();
const uploads = getStore("file-uploads");
await uploads.set(key, file, {
metadata: { country: context.geo.country.name }
});
return new Response("Submission saved");
};
Edge Function form is identical but imports Context from @netlify/edge-functions.
setJSON)const uploads = getStore("json-uploads");
await uploads.setJSON(key, data, { metadata: { country: context.geo.country.name } });
get) — always null-checkconst uploads = getStore("file-uploads");
const entry = await uploads.get(key); // string by default
if (entry === null) {
return new Response(`Could not find ${key}`, { status: 404 });
}
return new Response(entry);
Pass type for other formats: get(key, { type: "json" | "arrayBuffer" | "blob" | "stream" | "text" }).
Write only if the key is new:
const { modified } = await store.set("jane@netlify.com", "Jane Doe", { onlyIfNew: true });
if (!modified) return new Response("Email already exists", { status: 400 });
Write only if the entry matches a known ETag (compare-and-swap):
const { modified } = await store.set(key, "New Jane", { onlyIfMatch: etag });
if (!modified) return new Response("Cached data is stale", { status: 400 });
Do not build counters, balances, or read-modify-write logic on a blob key — even with onlyIfMatch retries. That is transactional data; use Netlify DB.
const { blobs } = await store.list(); // auto-paginates all pages
// blobs: [ { etag: "\"etag1\"", key: "..." }, ... ]
Manual pagination (returns an AsyncIterator):
for await (const entry of store.list({ paginate: true })) {
console.log(entry.blobs);
}
Hierarchical listing — group keys with /, set directories: true to list one level, and use a trailing slash on prefix to drill in (without it, cats would also match catsuit):
const { blobs, directories } = await store.list({ directories: true }); // top level
const catList = await store.list({ directories: true, prefix: "cats/" }); // inside cats/
const { stores } = await listStores(); // does NOT include deploy-specific stores
await store.delete(key); // resolves undefined
const { deletedBlobs } = await store.deleteAll(); // deletes the whole store; 0 if it didn't exist
Build plugins can READ from any of the site's stores, but can WRITE only to deploy-specific stores (getDeployStore).
import { readFile } from "node:fs/promises";
import { getDeployStore } from "@netlify/blobs";
import { v4 as uuid } from "uuid";
export const onPostBuild = async () => {
const file = await readFile("some-file.txt", "utf8");
const uploads = getDeployStore("file-uploads");
await uploads.set(uuid(), file);
};
Blobs have no TTL. Store a timestamp in metadata, check it on read, and delete when expired:
await uploads.set(key, await req.text(), {
metadata: { expiration: new Date("2024-01-01").getTime() }
});
const entry = await uploads.getWithMetadata(key);
const { expiration } = entry.metadata;
if (expiration && expiration < Date.now()) {
await uploads.delete(key);
}
getWithMetadata)const { data, etag } = await uploads.getWithMetadata("my-key", { etag: cachedETag });
if (etag === cachedETag) {
// data is null — cached copy still fresh
}
getWithMetadata returns { data, etag, metadata }, or null if the key is absent. getMetadata(key) returns { metadata, etag } (no blob body) — use it to check existence cheaply.
Store instance methods:
set(key, value, { metadata, onlyIfMatch, onlyIfNew }) → { modified, etag }. value is ArrayBuffer | Blob | string.setJSON(key, value, { metadata, onlyIfMatch, onlyIfNew }) → { modified, etag }.get(key, { consistency, type }) → blob in requested format, or null.getWithMetadata(key, { consistency, etag, type }) → { data, etag, metadata } or null.getMetadata(key, { consistency, etag }) → { metadata, etag } or null.list({ directories, paginate, prefix }) → { blobs, directories } (auto-paginates unless paginate: true).delete(key) → undefined.deleteAll() → { deletedBlobs }.Module functions:
listStores({ paginate }) → { stores }. Excludes deploy-specific stores.Default is eventual: writes are globally readable immediately; updates and deletes propagate within 60 seconds. Opt into strong consistency per store or per read:
const store = getStore({ name: "animals", consistency: "strong" }); // whole store
await store.get("dog", { consistency: "strong" }); // single read
The CLI always uses strong consistency.
Deploy-specific stores default to the function's region. Override with region:
const uploads = getDeployStore({ name: "file-uploads", region: "ap-southeast-2" });
Available regions: https://docs.netlify.com/build/functions/configuration#region
Place blob files under .netlify/blobs/deploy/ in the site's base directory; Netlify uploads them to deploy-specific stores (preserving directory structure) after build, before deploy.
$: $mouse.jpg.json for mouse.jpg, dogs/$good-boy.jpg.json for dogs/good-boy.jpg..netlify/blobs/deploy is wiped before each build — files must be created DURING the build (build command or plugin). Files committed to the repo beforehand are NOT uploaded./, no :, max 64 bytes./, max 600 bytes, any Unicode. (UTF-8: most chars 1 byte, some more, e.g. à = 2 bytes.)list and listStores cap pages at 1,000 entries/stores.onlyIfMatch / onlyIfNew.Surface the error and read the function logs. Do not invent REST endpoints or side-channel APIs to retry a failed store operation.
Inspect blobs with netlify blobs:list / :get / :set / :delete — reference: https://cli.netlify.com/commands/blobs/
If you wrote to site-wide stores with @netlify/blobs ≤ 6.5.0, data becomes inaccessible after upgrading (namespacing change). Migrate with the latest CLI, which makes the store accessible on 7.0.0+:
netlify recipes blobs-migrate YOUR_STORE_NAME
<!-- system: agent-context/blobs/system.md — human-owned, merged by ctx-gen; edit system.md, not this section -->
These are org conventions, not docs facts — merged into the rendered skill by ctx-gen and never generated. Owned by the skills maintainer.
netlify blobs:list/get/set/delete exist for inspection; the CLI
reference is their source of truth — link, don't restate.getDeployStore() or a context-specific store name for isolation.onlyIfMatch retries. That's transactional data; use Netlify DB.getDeployStore).This skill is written to stay usable across GitHub Copilot, Claude Code, and Codex.
$CODEX_HOME/skills/netlify-blobs and restart Codex after major changes.Preferred MCP Server: None required
netlify-blobs outside its documented task boundary.Before claiming the netlify-blobs workflow succeeded:
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
AI-powered adeno-associated virus (AAV) vector design for gene therapy including capsid engineering, promoter selection, and tropism optimization.
日本語の概要は準備中です。原文の説明を表示しています。
Improve the clarity and voice of AI-assisted academic writing (papers, theses, rebuttals) and
日本語の概要は準備中です。原文の説明を表示しています。
12-agent academic paper writing pipeline. 11 modes (full/plan/outline/revision/revision-coach/abstract/lit-review/format-convert/citation-check/disclosure/rebuttal-audit). 6 paper types, 5 citation formats, bilingual abstracts, LaTeX/DOCX-via-Pandoc/PDF output. Style Calibration + Writing Quality Check + Anti-Patterns with IRON RULE markers. Triggers: write paper, academic paper, guide my paper, parse reviews, audit my rebuttal, check my response draft, AI disclosure, 寫論文, 學術論文, 引導我寫論文, 審查意見, 評估回覆, 논문 작성, 초록 작성, 논문 수정, 논문 계획을 도와줘, 심사 의견 반영, 답변서 점검, AI 사용 고지.
日本語の概要は準備中です。原文の説明を表示しています。
Systematic writing framework for philosophy and interdisciplinary academic papers from optimized outline to submission-ready manuscript. Use when users want to: (1) write a paper from a detailed outline, (2) ensure quality control during writing, (3) maintain consistency across chapters, (4) prepare a submission-ready manuscript, or (5) systematically execute a planned paper. Triggered by phrases like 'write the paper from this outline,' 'compose the full manuscript,' 'execute the outline,' or when users have completed strategic planning (academic-paper-strategist skill) and are ready to write. Takes optimized outline as input; outputs complete manuscript with iterative quality checks.
日本語の概要は準備中です。原文の説明を表示しています。
Multi-perspective academic paper review with dynamic reviewer personas. Runs a 5-seat, role-separated review panel (Journal-Fit Reviewer + 3 peer-review roles + Devil's Advocate) with field-specific expertise; role separation is not a claim of independent error processes. Supports full review, re-review (verification), quick assessment, methodology focus, Socratic guided, and calibration modes. Triggers on: review paper, peer review, manuscript review, referee report, review my paper, critique paper, simulate review, editorial review, calibrate reviewer, reviewer calibration, measure reviewer accuracy, 審查論文, 論文審查, 模擬審查, 同儕審查, 幫我審這篇, 以審查人角度評估, 審查者校準, 논문 심사, 동료 심사, 모의 심사, 심사자 관점에서 평가, 심사자 보정.
日本語の概要は準備中です。原文の説明を表示しています。
Systematic strategic planning framework for philosophy and interdisciplinary academic papers targeting preprint platforms (PhilArchive, arXiv, PhilSci-Archive). Use when users want to: (1) plan a paper on a specific topic, (2) identify research gaps and assess originality, (3) develop optimized paper outlines, (4) prepare for preprint submission, or (5) understand platform requirements and writing standards. Triggered by phrases like 'plan a paper on,' 'help me design a paper about,' 'identify research gaps in,' 'is this idea original,' or when users need structured research planning. The skill guides through three phases: Platform Analysis (identifying target venue and studying sample papers), Theoretical Framework (AI-driven literature search and gap identification), and Outline Optimization (structured design with reviewer-perspective self-assessment). Each phase includes quality evaluation standards and validation checkpoints.
日本語の概要は準備中です。原文の説明を表示しています。