{"id":"db52701d-2dc5-47f4-ae46-4070adb3b282","shortId":"xdRUte","kind":"skill","title":"azure-storage-blob-ts","tagline":"Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations. Use for uploading, downloading, listing, and managing blobs and containers.","description":"# @azure/storage-blob (TypeScript/JavaScript)\n\nSDK for Azure Blob Storage operations — upload, download, list, and manage blobs and containers.\n\n## Installation\n\n```bash\nnpm install @azure/storage-blob @azure/identity\n```\n\n**Current Version**: 12.x  \n**Node.js**: >= 18.0.0\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_ACCOUNT_NAME=<account-name>\nAZURE_STORAGE_ACCOUNT_KEY=<account-key>\n# OR connection string\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\n```\n\n## Authentication\n\n### DefaultAzureCredential (Recommended)\n\n```typescript\nimport { BlobServiceClient } from \"@azure/storage-blob\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst client = new BlobServiceClient(\n  `https://${accountName}.blob.core.windows.net`,\n  new DefaultAzureCredential()\n);\n```\n\n### Connection String\n\n```typescript\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst client = BlobServiceClient.fromConnectionString(\n  process.env.AZURE_STORAGE_CONNECTION_STRING!\n);\n```\n\n### StorageSharedKeyCredential (Node.js only)\n\n```typescript\nimport { BlobServiceClient, StorageSharedKeyCredential } from \"@azure/storage-blob\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\nconst client = new BlobServiceClient(\n  `https://${accountName}.blob.core.windows.net`,\n  sharedKeyCredential\n);\n```\n\n### SAS Token\n\n```typescript\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!; // starts with \"?\"\n\nconst client = new BlobServiceClient(\n  `https://${accountName}.blob.core.windows.net${sasToken}`\n);\n```\n\n## Client Hierarchy\n\n```\nBlobServiceClient (account level)\n└── ContainerClient (container level)\n    └── BlobClient (blob level)\n        ├── BlockBlobClient (block blobs - most common)\n        ├── AppendBlobClient (append-only blobs)\n        └── PageBlobClient (page blobs - VHDs)\n```\n\n## Container Operations\n\n### Create Container\n\n```typescript\nconst containerClient = client.getContainerClient(\"my-container\");\nawait containerClient.create();\n\n// Or create if not exists\nawait containerClient.createIfNotExists();\n```\n\n### List Containers\n\n```typescript\nfor await (const container of client.listContainers()) {\n  console.log(container.name);\n}\n\n// With prefix filter\nfor await (const container of client.listContainers({ prefix: \"logs-\" })) {\n  console.log(container.name);\n}\n```\n\n### Delete Container\n\n```typescript\nawait containerClient.delete();\n// Or delete if exists\nawait containerClient.deleteIfExists();\n```\n\n## Blob Operations\n\n### Upload Blob (Simple)\n\n```typescript\nconst containerClient = client.getContainerClient(\"my-container\");\nconst blockBlobClient = containerClient.getBlockBlobClient(\"my-file.txt\");\n\n// Upload string\nawait blockBlobClient.upload(\"Hello, World!\", 13);\n\n// Upload Buffer\nconst buffer = Buffer.from(\"Hello, World!\");\nawait blockBlobClient.upload(buffer, buffer.length);\n```\n\n### Upload from File (Node.js only)\n\n```typescript\nconst blockBlobClient = containerClient.getBlockBlobClient(\"uploaded-file.txt\");\nawait blockBlobClient.uploadFile(\"/path/to/local/file.txt\");\n```\n\n### Upload from Stream (Node.js only)\n\n```typescript\nimport * as fs from \"fs\";\n\nconst blockBlobClient = containerClient.getBlockBlobClient(\"streamed-file.txt\");\nconst readStream = fs.createReadStream(\"/path/to/local/file.txt\");\n\nawait blockBlobClient.uploadStream(readStream, 4 * 1024 * 1024, 5, {\n  // bufferSize: 4MB, maxConcurrency: 5\n  onProgress: (progress) => console.log(`Uploaded ${progress.loadedBytes} bytes`),\n});\n```\n\n### Upload from Browser\n\n```typescript\nconst blockBlobClient = containerClient.getBlockBlobClient(\"browser-upload.txt\");\n\n// From File input\nconst fileInput = document.getElementById(\"fileInput\") as HTMLInputElement;\nconst file = fileInput.files![0];\nawait blockBlobClient.uploadData(file);\n\n// From Blob/ArrayBuffer\nconst arrayBuffer = new ArrayBuffer(1024);\nawait blockBlobClient.uploadData(arrayBuffer);\n```\n\n### Download Blob\n\n```typescript\nconst blobClient = containerClient.getBlobClient(\"my-file.txt\");\nconst downloadResponse = await blobClient.download();\n\n// Read as string (browser & Node.js)\nconst downloaded = await streamToText(downloadResponse.readableStreamBody!);\n\nasync function streamToText(readable: NodeJS.ReadableStream): Promise<string> {\n  const chunks: Buffer[] = [];\n  for await (const chunk of readable) {\n    chunks.push(Buffer.from(chunk));\n  }\n  return Buffer.concat(chunks).toString(\"utf-8\");\n}\n```\n\n### Download to File (Node.js only)\n\n```typescript\nconst blockBlobClient = containerClient.getBlockBlobClient(\"my-file.txt\");\nawait blockBlobClient.downloadToFile(\"/path/to/local/destination.txt\");\n```\n\n### Download to Buffer (Node.js only)\n\n```typescript\nconst blockBlobClient = containerClient.getBlockBlobClient(\"my-file.txt\");\nconst buffer = await blockBlobClient.downloadToBuffer();\nconsole.log(buffer.toString());\n```\n\n### List Blobs\n\n```typescript\n// List all blobs\nfor await (const blob of containerClient.listBlobsFlat()) {\n  console.log(blob.name, blob.properties.contentLength);\n}\n\n// List with prefix\nfor await (const blob of containerClient.listBlobsFlat({ prefix: \"logs/\" })) {\n  console.log(blob.name);\n}\n\n// List by hierarchy (virtual directories)\nfor await (const item of containerClient.listBlobsByHierarchy(\"/\")) {\n  if (item.kind === \"prefix\") {\n    console.log(`Directory: ${item.name}`);\n  } else {\n    console.log(`Blob: ${item.name}`);\n  }\n}\n```\n\n### Delete Blob\n\n```typescript\nconst blobClient = containerClient.getBlobClient(\"my-file.txt\");\nawait blobClient.delete();\n\n// Delete if exists\nawait blobClient.deleteIfExists();\n\n// Delete with snapshots\nawait blobClient.delete({ deleteSnapshots: \"include\" });\n```\n\n### Copy Blob\n\n```typescript\nconst sourceBlobClient = containerClient.getBlobClient(\"source.txt\");\nconst destBlobClient = containerClient.getBlobClient(\"destination.txt\");\n\n// Start copy operation\nconst copyPoller = await destBlobClient.beginCopyFromURL(sourceBlobClient.url);\nawait copyPoller.pollUntilDone();\n```\n\n## Blob Properties & Metadata\n\n### Get Properties\n\n```typescript\nconst blobClient = containerClient.getBlobClient(\"my-file.txt\");\nconst properties = await blobClient.getProperties();\n\nconsole.log(\"Content-Type:\", properties.contentType);\nconsole.log(\"Content-Length:\", properties.contentLength);\nconsole.log(\"Last Modified:\", properties.lastModified);\nconsole.log(\"ETag:\", properties.etag);\n```\n\n### Set Metadata\n\n```typescript\nawait blobClient.setMetadata({\n  author: \"John Doe\",\n  category: \"documents\",\n});\n```\n\n### Set HTTP Headers\n\n```typescript\nawait blobClient.setHTTPHeaders({\n  blobContentType: \"text/plain\",\n  blobCacheControl: \"max-age=3600\",\n  blobContentDisposition: \"attachment; filename=download.txt\",\n});\n```\n\n## SAS Token Generation (Node.js only)\n\n### Generate Blob SAS\n\n```typescript\nimport {\n  BlobSASPermissions,\n  generateBlobSASQueryParameters,\n  StorageSharedKeyCredential,\n} from \"@azure/storage-blob\";\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n\nconst sasToken = generateBlobSASQueryParameters(\n  {\n    containerName: \"my-container\",\n    blobName: \"my-file.txt\",\n    permissions: BlobSASPermissions.parse(\"r\"), // read only\n    startsOn: new Date(),\n    expiresOn: new Date(Date.now() + 3600 * 1000), // 1 hour\n  },\n  sharedKeyCredential\n).toString();\n\nconst sasUrl = `https://${accountName}.blob.core.windows.net/my-container/my-file.txt?${sasToken}`;\n```\n\n### Generate Container SAS\n\n```typescript\nimport { ContainerSASPermissions, generateBlobSASQueryParameters } from \"@azure/storage-blob\";\n\nconst sasToken = generateBlobSASQueryParameters(\n  {\n    containerName: \"my-container\",\n    permissions: ContainerSASPermissions.parse(\"racwdl\"), // read, add, create, write, delete, list\n    expiresOn: new Date(Date.now() + 24 * 3600 * 1000), // 24 hours\n  },\n  sharedKeyCredential\n).toString();\n```\n\n### Generate Account SAS\n\n```typescript\nimport {\n  AccountSASPermissions,\n  AccountSASResourceTypes,\n  AccountSASServices,\n  generateAccountSASQueryParameters,\n} from \"@azure/storage-blob\";\n\nconst sasToken = generateAccountSASQueryParameters(\n  {\n    services: AccountSASServices.parse(\"b\").toString(), // blob\n    resourceTypes: AccountSASResourceTypes.parse(\"sco\").toString(), // service, container, object\n    permissions: AccountSASPermissions.parse(\"rwdlacupi\"), // all permissions\n    expiresOn: new Date(Date.now() + 24 * 3600 * 1000),\n  },\n  sharedKeyCredential\n).toString();\n```\n\n## Blob Types\n\n### Block Blob (Default)\n\nMost common type for text and binary files.\n\n```typescript\nconst blockBlobClient = containerClient.getBlockBlobClient(\"document.pdf\");\nawait blockBlobClient.uploadFile(\"/path/to/document.pdf\");\n```\n\n### Append Blob\n\nOptimized for append operations (logs, audit trails).\n\n```typescript\nconst appendBlobClient = containerClient.getAppendBlobClient(\"app.log\");\n\n// Create the append blob\nawait appendBlobClient.create();\n\n// Append data\nawait appendBlobClient.appendBlock(\"Log entry 1\\n\", 12);\nawait appendBlobClient.appendBlock(\"Log entry 2\\n\", 12);\n```\n\n### Page Blob\n\nFixed-size blobs for random read/write (VHDs).\n\n```typescript\nconst pageBlobClient = containerClient.getPageBlobClient(\"disk.vhd\");\n\n// Create 512-byte aligned page blob\nawait pageBlobClient.create(1024 * 1024); // 1MB\n\n// Write pages (must be 512-byte aligned)\nconst buffer = Buffer.alloc(512);\nawait pageBlobClient.uploadPages(buffer, 0, 512);\n```\n\n## Error Handling\n\n```typescript\nimport { RestError } from \"@azure/storage-blob\";\n\ntry {\n  await containerClient.create();\n} catch (error) {\n  if (error instanceof RestError) {\n    switch (error.statusCode) {\n      case 404:\n        console.log(\"Container not found\");\n        break;\n      case 409:\n        console.log(\"Container already exists\");\n        break;\n      case 403:\n        console.log(\"Access denied\");\n        break;\n      default:\n        console.error(`Storage error ${error.statusCode}: ${error.message}`);\n    }\n  }\n  throw error;\n}\n```\n\n## TypeScript Types Reference\n\n```typescript\nimport {\n  // Clients\n  BlobServiceClient,\n  ContainerClient,\n  BlobClient,\n  BlockBlobClient,\n  AppendBlobClient,\n  PageBlobClient,\n\n  // Authentication\n  StorageSharedKeyCredential,\n  AnonymousCredential,\n\n  // SAS\n  BlobSASPermissions,\n  ContainerSASPermissions,\n  AccountSASPermissions,\n  AccountSASServices,\n  AccountSASResourceTypes,\n  generateBlobSASQueryParameters,\n  generateAccountSASQueryParameters,\n\n  // Options & Responses\n  BlobDownloadResponseParsed,\n  BlobUploadCommonResponse,\n  ContainerCreateResponse,\n  BlobItem,\n  ContainerItem,\n\n  // Errors\n  RestError,\n} from \"@azure/storage-blob\";\n```\n\n## Best Practices\n\n1. **Use DefaultAzureCredential** — Prefer AAD over connection strings/keys\n2. **Use streaming for large files** — `uploadStream`/`downloadToFile` for files > 256MB\n3. **Set appropriate content types** — Use `setHTTPHeaders` for correct MIME types\n4. **Use SAS tokens for client access** — Generate short-lived tokens for browser uploads\n5. **Handle errors gracefully** — Check `RestError.statusCode` for specific handling\n6. **Use `*IfNotExists` methods** — For idempotent container/blob creation\n7. **Close clients** — Not required but good practice in long-running apps\n\n## Platform Differences\n\n| Feature | Node.js | Browser |\n|---------|---------|---------|\n| `StorageSharedKeyCredential` | ✅ | ❌ |\n| `uploadFile()` | ✅ | ❌ |\n| `uploadStream()` | ✅ | ❌ |\n| `downloadToFile()` | ✅ | ❌ |\n| `downloadToBuffer()` | ✅ | ❌ |\n| `uploadData()` | ✅ | ✅ |\n| SAS generation | ✅ | ❌ |\n| DefaultAzureCredential | ✅ | ❌ |\n| Anonymous/SAS access | ✅ | ✅ |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["azure","storage","blob","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-azure-storage-blob-ts","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-storage-blob-ts","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34928 github stars · SKILL.md body (12,323 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T18:50:34.391Z","embedding":null,"createdAt":"2026-04-18T21:33:12.716Z","updatedAt":"2026-04-24T18:50:34.391Z","lastSeenAt":"2026-04-24T18:50:34.391Z","tsv":"'-8':417 '/my-container/my-file.txt?$':649 '/path/to/document.pdf':747 '/path/to/local/destination.txt':430 '/path/to/local/file.txt':302,321 '0':359,824 '1':640,774,908 '1000':639,682,724 '1024':326,327,369,807,808 '12':49,776,783 '13':278 '18.0.0':52 '1mb':809 '2':781,916 '24':680,683,722 '256mb':926 '3':927 '3600':591,638,681,723 '4':325,938 '403':859 '404':845 '409':852 '4mb':330 '5':328,332,953 '512':800,814,820,825 '6':962 '7':970 'aad':912 'access':861,944,998 'account':58,62,90,127,133,159,179,688 'accountkey':130,140,616 'accountnam':73,87,96,124,139,145,156,173,615,646 'accountsaspermiss':692,890 'accountsaspermissions.parse':714 'accountsasresourcetyp':693,892 'accountsasresourcetypes.parse':707 'accountsasservic':694,891 'accountsasservices.parse':702 'action':1011 'add':671 'age':590 'align':802,816 'alreadi':855 'anonymous/sas':997 'anonymouscredenti':886 'app':982 'app.log':761 'append':194,748,752,764,768 'append-on':193 'appendblobcli':192,759,882 'appendblobclient.appendblock':771,778 'appendblobclient.create':767 'applic':1005 'appropri':929 'arraybuff':366,368,372 'ask':1049 'async':394 'attach':593 'audit':755 'authent':74,884 'author':574 'await':212,219,225,236,248,254,274,286,300,322,360,370,382,391,404,428,443,454,466,481,503,508,513,533,536,550,572,583,745,766,770,777,805,821,834 'azur':2,6,29,56,60,67 'azure-storage-blob-t':1 'azure/identity':46,85 'azure/storage-blob':11,25,45,81,106,122,154,610,659,697,832,905 'b':703 'bash':42,55 'best':906 'binari':738 'blob':4,7,13,22,30,38,185,189,196,199,256,259,374,448,452,456,468,494,497,518,538,602,705,727,730,749,765,785,789,804 'blob.core.windows.net':97,146,174,648 'blob.core.windows.net/my-container/my-file.txt?$':647 'blob.name':460,474 'blob.properties.contentlength':461 'blob/arraybuffer':364 'blobcachecontrol':587 'blobclient':184,377,500,545,880 'blobclient.delete':504,514 'blobclient.deleteifexists':509 'blobclient.download':383 'blobclient.getproperties':551 'blobclient.sethttpheaders':584 'blobclient.setmetadata':573 'blobcontentdisposit':592 'blobcontenttyp':585 'blobdownloadresponsepars':897 'blobitem':900 'blobnam':624 'blobsaspermiss':606,888 'blobsaspermissions.parse':627 'blobservicecli':79,95,104,119,144,152,172,178,878 'blobserviceclient.fromconnectionstring':109 'blobuploadcommonrespons':898 'block':188,729 'blockblobcli':187,269,297,315,344,425,438,742,881 'blockblobclient.downloadtobuffer':444 'blockblobclient.downloadtofile':429 'blockblobclient.upload':275,287 'blockblobclient.uploaddata':361,371 'blockblobclient.uploadfile':301,746 'blockblobclient.uploadstream':323 'boundari':1057 'break':850,857,863 'browser':341,387,951,987 'browser-upload.txt':346 'buffer':280,282,288,402,433,442,818,823 'buffer.alloc':819 'buffer.concat':413 'buffer.from':283,410 'buffer.length':289 'buffer.tostring':446 'buffers':329 'byte':338,801,815 'case':844,851,858 'catch':836 'categori':577 'check':957 'chunk':401,406,411,414 'chunks.push':409 'clarif':1051 'clear':1024 'client':93,108,142,170,176,877,943,972 'client.getcontainerclient':208,264 'client.listcontainers':229,240 'close':971 'common':191,733 'connect':65,69,100,112,914 'console.error':865 'console.log':230,243,335,445,459,473,489,493,552,557,562,566,846,853,860 'const':86,92,107,123,129,135,141,155,161,169,206,226,237,262,268,281,296,314,318,343,350,356,365,376,380,389,400,405,424,437,441,455,467,482,499,520,524,531,544,548,611,617,644,660,698,741,758,795,817 'contain':24,40,182,201,204,211,222,227,238,246,267,623,652,666,711,847,854 'container.name':231,244 'container/blob':968 'containercli':181,207,263,879 'containerclient.create':213,835 'containerclient.createifnotexists':220 'containerclient.delete':249 'containerclient.deleteifexists':255 'containerclient.getappendblobclient':760 'containerclient.getblobclient':378,501,522,526,546 'containerclient.getblockblobclient':270,298,316,345,426,439,743 'containerclient.getpageblobclient':797 'containerclient.listblobsbyhierarchy':485 'containerclient.listblobsflat':458,470 'containercreaterespons':899 'containeritem':901 'containernam':620,663 'containersaspermiss':656,889 'containersaspermissions.parse':668 'content':554,559,930 'content-length':558 'content-typ':553 'copi':517,529 'copypol':532 'copypoller.polluntildone':537 'correct':935 'creat':203,215,672,762,799 'creation':969 'criteria':1060 'current':47 'data':769 'date':633,636,678,720 'date.now':637,679,721 'default':731,864 'defaultazurecredenti':75,83,99,910,996 'defaultendpointsprotocol':71 'delet':245,251,496,505,510,674 'deletesnapshot':515 'deni':862 'describ':1012,1028 'destblobcli':525 'destblobclient.begincopyfromurl':534 'destination.txt':527 'differ':984 'directori':479,490 'disk.vhd':798 'document':578 'document.getelementbyid':352 'document.pdf':744 'doe':576 'download':18,34,373,390,418,431 'download.txt':595 'downloadrespons':381 'downloadresponse.readablestreambody':393 'downloadtobuff':992 'downloadtofil':923,991 'els':492 'entri':773,780 'environ':53,1040 'environment-specif':1039 'error':826,837,839,867,871,902,955 'error.message':869 'error.statuscode':843,868 'etag':567 'execut':1007 'exist':218,253,507,856 'expert':1045 'expireson':634,676,718 'featur':985 'file':292,348,357,362,420,739,921,925 'fileinput':351,353 'fileinput.files':358 'filenam':594 'filter':234 'fix':787 'fixed-s':786 'found':849 'fs':311,313 'fs.createreadstream':320 'function':395 'generat':598,601,651,687,945,995 'generateaccountsasqueryparamet':695,700,894 'generateblobsasqueryparamet':607,619,657,662,893 'get':541 'good':976 'grace':956 'handl':827,954,961 'header':581 'hello':276,284 'hierarchi':177,477 'hour':641,684 'htmlinputel':355 'http':580 'https':72 'idempot':967 'ifnotexist':964 'import':78,82,103,118,151,309,605,655,691,829,876 'includ':516 'input':349,1054 'instal':41,44 'instanceof':840 'item':483 'item.kind':487 'item.name':491,495 'javascript/typescript':9 'john':575 'key':63,134 'larg':920 'last':563 'length':560 'level':180,183,186 'limit':1016 'list':19,35,221,447,450,462,475,675 'live':948 'log':242,472,754,772,779 'long':980 'long-run':979 'manag':21,37 'match':1025 'max':589 'max-ag':588 'maxconcurr':331 'metadata':540,570 'method':965 'mime':936 'miss':1062 'modifi':564 'must':812 'my-contain':209,265,621,664 'my-file.txt':271,379,427,440,502,547,625 'n':775,782 'name':59,91,128,160 'new':94,98,137,143,171,367,613,632,635,677,719 'node.js':51,115,293,306,388,421,434,599,986 'nodejs.readablestream':398 'npm':43 'object':712 'onprogress':333 'oper':14,32,202,257,530,753 'optim':750 'option':895 'output':1034 'overview':1015 'page':198,784,803,811 'pageblobcli':197,796,883 'pageblobclient.create':806 'pageblobclient.uploadpages':822 'permiss':626,667,713,717,1055 'platform':983 'practic':907,977 'prefer':911 'prefix':233,241,464,471,488 'process.env.azure':88,110,125,131,157,163 'progress':334 'progress.loadedbytes':337 'promis':399 'properti':539,542,549 'properties.contentlength':561 'properties.contenttype':556 'properties.etag':568 'properties.lastmodified':565 'r':628 'racwdl':669 'random':791 'read':384,629,670 'read/write':792 'readabl':397,408 'readstream':319,324 'recommend':76 'refer':874 'requir':974,1053 'resourcetyp':706 'respons':896 'resterror':830,841,903 'resterror.statuscode':958 'return':412 'review':1046 'run':981 'rwdlacupi':715 'safeti':1056 'sas':148,165,596,603,653,689,887,940,994 'sastoken':162,175,618,650,661,699 'sasurl':645 'sco':708 'scope':1027 'sdk':10,27 'servic':701,710 'set':569,579,928 'sethttphead':933 'sharedkeycredenti':136,147,612,642,685,725 'short':947 'short-liv':946 'simpl':260 'size':788 'skill':1003,1019 'skill-azure-storage-blob-ts' 'snapshot':512 'source-sickn33' 'source.txt':523 'sourceblobcli':521 'sourceblobclient.url':535 'specif':960,1041 'start':167,528 'startson':631 'stop':1047 'storag':3,8,31,57,61,68,89,111,126,132,158,164,866 'storagesharedkeycredenti':114,120,138,608,614,885,988 'stream':305,918 'streamed-file.txt':317 'streamtotext':392,396 'string':66,70,101,113,273,386 'strings/keys':915 'substitut':1037 'success':1059 'switch':842 'task':1023 'test':1043 'text':736 'text/plain':586 'throw':870 'token':149,166,597,941,949 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'tostr':415,643,686,704,709,726 'trail':756 'treat':1032 'tri':833 'ts':5 'type':555,728,734,873,931,937 'typescript':77,102,117,150,205,223,247,261,295,308,342,375,423,436,449,498,519,543,571,582,604,654,690,740,757,794,828,872,875 'typescript/javascript':26 'upload':17,33,258,272,279,290,303,336,339,952 'uploaddata':993 'uploaded-file.txt':299 'uploadfil':989 'uploadstream':922,990 'use':15,909,917,932,939,963,1001,1017 'utf':416 'valid':1042 'variabl':54 'version':48 'vhds':200,793 'virtual':478 'workflow':1009 'world':277,285 'write':673,810 'x':50","prices":[{"id":"8d139536-22da-4a35-a122-073d638401c2","listingId":"db52701d-2dc5-47f4-ae46-4070adb3b282","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:33:12.716Z"}],"sources":[{"listingId":"db52701d-2dc5-47f4-ae46-4070adb3b282","source":"github","sourceId":"sickn33/antigravity-awesome-skills/azure-storage-blob-ts","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-storage-blob-ts","isPrimary":false,"firstSeenAt":"2026-04-18T21:33:12.716Z","lastSeenAt":"2026-04-24T18:50:34.391Z"}],"details":{"listingId":"db52701d-2dc5-47f4-ae46-4070adb3b282","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"azure-storage-blob-ts","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34928,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"dd103440cba71333d00c45d5246d448c7c2d59a0","skill_md_path":"skills/azure-storage-blob-ts/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-storage-blob-ts"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"azure-storage-blob-ts","description":"Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations. Use for uploading, downloading, listing, and managing blobs and containers."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-storage-blob-ts"},"updatedAt":"2026-04-24T18:50:34.391Z"}}