Bulk Inscriptions (bulk-files)
bulk-files is an inscription mode designed for multi-file packages where each file should be inscribed as its own standalone HCS-1 topic (as opposed to Hashinals, where media + JSON metadata are paired).
This is the mode used by Registry Broker skill publishing to inscribe a whole skill package (often 20+ files) efficiently.
When to use bulk-filesDirect link to When to use bulk-files
- HCS-26 skill packages that contain multiple artifacts (docs, schemas, code samples, etc.)
- Any workflow where you want one job submission, but you need one topic per file
- A two-step flow where you first inscribe the files, then inscribe a manifest that references them (for example
skill.json)
How it worksDirect link to How it works
- Create a ZIP that contains the files you want to inscribe.
- Call
inscribe(...)withmode: 'bulk-files'andmimeType: 'application/zip'. - The inscription service unpacks the ZIP and inscribes each file separately.
- The completed job includes a per-file result list in
inscription.files.bulkUploads.
Each bulkUploads[] entry typically includes:
name: file path in the ZIPtopicId: topic created for that file's inscriptionuri: HRL-like identifier (oftenhcs://1/<topicId>)mimeType,hash, and message counters when available
Standards SDK exampleDirect link to Standards SDK example
import fs from 'node:fs';
import { inscribe } from '@hashgraphonline/standards-sdk';
const zipBuffer = fs.readFileSync('./my-skill-package.zip');
const res = await inscribe(
{
type: 'buffer',
buffer: zipBuffer,
fileName: 'my-skill-package.zip',
mimeType: 'application/zip',
},
{
accountId: '0.0.1234',
privateKey: process.env.HEDERA_PRIVATE_KEY as string,
network: 'testnet',
},
{
mode: 'bulk-files',
waitForConfirmation: true,
metadata: {
type: 'my-bulk-package',
fileCount: 20,
},
},
);
const bulkUploads = res.inscription?.files?.bulkUploads ?? [];
for (const upload of bulkUploads) {
console.log(upload?.name, upload?.topicId, upload?.uri);
}
Registry Broker skill publishingDirect link to Registry Broker skill publishing
If you publish skills through the Registry Broker, you do not call inscribe(...) directly from your frontend. The client posts a publish job to the broker and the broker performs the bulk inscription server-side.
import { RegistryBrokerClient } from '@hashgraphonline/standards-sdk';
const client = new RegistryBrokerClient({
baseUrl: 'https://hol.org/registry/api/v1',
});
await client.authenticateWithLedgerCredentials({
accountId: '0.0.1234',
network: 'hedera:testnet',
hederaPrivateKey: process.env.HEDERA_PRIVATE_KEY,
});
const files = [
{
name: 'SKILL.md',
mimeType: 'text/markdown',
base64: Buffer.from('# My Awesome Skill\n\nThis skill does awesome things.').toString('base64'),
},
{
name: 'skill.json',
mimeType: 'application/json',
base64: Buffer.from(JSON.stringify({ name: 'my-awesome-skill', version: '1.0.0' })).toString('base64'),
},
// ... and other files
];
const quote = await client.quoteSkillPublish({ accountId: '0.0.1234', files });
const publish = await client.publishSkill({
accountId: '0.0.1234',
quoteId: quote.quoteId,
files,
});
const job = await client.getSkillPublishJob(publish.jobId, { accountId: '0.0.1234' });
console.log(job.status);
Internally, the broker:
- Inscribes the full file set as one ZIP using
mode: 'bulk-files', producing one topic per file. - Builds the HCS-26 manifest (
skill.json+ file HRLs) and inscribes that separately so the manifest can reference the file topics.
For more context on skill publishing, see Skills Upload & Discovery.