# One Million Icons

A free, browser-based library of **1,000,000 distinct abstract geometric signs**. No account, paid API, external fonts or runtime dependencies. Open index.html or visit https://one-million-icons.pages.dev/.

## What the count means

This is a generative catalog, not a million hand-drawn pictograms of everyday objects. Four families contain 250,000 signs each: Orbits, Rosettes, Mosaics and Constellations. Each sign has 18 cells. The local ID determines whether each cell is a circle or square. Each family uses different coordinates and motifs. Color, export size and stroke changes are not counted as additional icons. Designs are intentionally similar and may be hard to distinguish at small sizes.

The complete catalog is generated locally on demand and works offline. A separate archive from the original delivery contains one million ready-made SVG files; the application does not need that large archive.

## Features

- Search by family name or exact number 1–1000000, without separators.
- Four categories, 48 icons per page and direct page navigation.
- Preview, icon color, line thickness and transparent or solid background.
- SVG and PNG downloads at 32–2048 pixels; SVG remains scalable.
- Copy SVG to the clipboard (HTTPS or localhost recommended).
- Favorites saved in this browser using localStorage. They do not sync across devices.

## Source and license

catalog.js contains the original procedural geometry. app.js handles interactions, styles.css controls appearance and index.html provides the page structure. No third-party icon sets, fonts or JavaScript libraries are included. Code and generated outputs are available under the MIT license, to the extent that licensable rights exist. Keep LICENSE when redistributing. Created with AI assistance. No claim of exclusive rights or trademark clearance in individual geometric signs is made.

## Export individual SVG files

Use Node.js 20 or later; no packages are needed:

```sh
node export.cjs 1 100 ./svg-export
node export.cjs 1 1000000 ./million-svg
node pack-million.cjs ../one-million-icons-million-svg.zip
```

The full export writes a million files and needs several GB of disk space. The archive command creates a ZIP64 without writing intermediate SVG files. Neither exporter overwrites existing SVG files or archives. Public IDs start at 1; catalog.js API IDs start at 0. Keep the license alongside exports.

## Free deployment

For Cloudflare Pages: Workers & Pages → Create application → Continue to Pages → Direct Upload. Upload the app ZIP with index.html at its root, then deploy. Do not upload the archive of a million SVG files.

For GitHub Pages: upload these files to a public repository, including .nojekyll. In Settings → Pages, select Deploy from a branch, main and /(root).

Official instructions:
- https://developers.cloudflare.com/pages/get-started/direct-upload/
- https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site

## Validation

```sh
node --test tests/catalog.test.cjs
node --test tests/app.test.cjs
node verify-archive.cjs ../one-million-icons-million-svg.zip
```

The catalog test checks all million geometries for duplicate SHA-256 hashes and decodes all cell patterns. The interface logic test uses a DOM model, not a real browser. Archive validation decompresses every entry and checks CRC32, filenames and the ZIP64 central directory; allow at least 1 GB of free RAM. TEST-REPORT.md records the original validation, before this English translation. The geometry, IDs and favorite storage key are unchanged by the translation.
