Skip to content

Publishing

Publishing is the bridge between the curate side and the use side. When you publish an icon pack, the current set of assigned slots gets frozen into an immutable release that developers can install.

Every published pack has a three-part identifier:

org / project / pack

For example: acme/brand/core-icons

SegmentScopeExample
orgGlobally uniqueacme
projectUnique within the orgbrand
packUnique within the projectcore-icons

This is what developers pass to the CLI when installing.

Slugs are auto-generated from the names you give your org, project, and pack:

  • Lowercase letters, numbers, and hyphens only
  • Derived automatically — Core Icons becomes core-icons
  • Collisions within the same scope get a numeric suffix
  • Slugs can’t be set manually in v1

When you hit Publish:

  1. All currently assigned slots are snapshotted
  2. Empty or unassigned slots are excluded
  3. A release hash is generated — an opaque 12-character identifier like 8f3a9c2d14be
  4. If nothing material has changed since the last publish, Icon Forge returns the existing release as noop
  5. The release is frozen — the manifest, component source files, and framework archives all point to that version

Developers install by pack name and get the latest release by default. They can also pin a specific release hash when they need a fixed version.

Make sure:

  • The slots you care about are assigned
  • The slot names are the component names you actually want to ship — this is what developers will import
  • The assigned icons are finals, not temporary placeholders

Everything assigned at publish time becomes the release. Unassigned drafts stay in the workspace.

The pack panel keeps the latest published release visible so you can confirm what is currently installable:

  • The release hash
  • When it was published
  • How many slots were included

If your current assigned slots already match that latest release, publishing returns the same hash instead of creating a new one.

A few things that matter to the install side:

  • Latest means “most recent published release for this namespace”
  • Pinned install means “install this exact release hash, not latest”
  • Slot names become component names — check-circle becomes <CheckCircle />
  • Namespace slugs become the install identifier — acme/brand/core-icons
  • Assigned slots only means drafts and empty slots never ship until you attach them to a named slot and publish