{"_id":"@artbrnv/realfavicongenerator","name":"@artbrnv/realfavicongenerator","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@artbrnv/realfavicongenerator","version":"1.0.0","description":"Zero-dependency favicon toolkit — HTML tags, web manifest, browserconfig, size maps, path helpers, SVG favicon, Apple/Android/Windows tile configs, PWA shortcuts","type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"types":"./dist/index.d.ts","scripts":{"build":"node build.js","test":"node --test test/index.test.js","prepublishOnly":"npm run build"},"keywords":["favicon","pwa","manifest","apple-touch-icon","browserconfig","web-app-manifest","meta-tags","zero-dependency"],"author":{"name":"art.brunov@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/artbrnv/realfavicongenerator.git"},"engines":{"node":">=18"},"_id":"@artbrnv/realfavicongenerator@1.0.0","bugs":{"url":"https://github.com/artbrnv/realfavicongenerator/issues"},"homepage":"https://github.com/artbrnv/realfavicongenerator#readme","_nodeVersion":"24.12.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-nHzvXRTSBDuuR2CyCa4R8CJKWCmAIUEk74V7h4YmZtO8OosEqrODsFOiHUbw4Cp1MOjHykK9UDLnh6fULsZZHw==","shasum":"f535585a74510839dc14f5476a12b22ca166e38c","tarball":"https://registry.npmjs.org/@artbrnv/realfavicongenerator/-/realfavicongenerator-1.0.0.tgz","fileCount":5,"unpackedSize":73215,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC6rxJM/rycoi9C65i5BpyubVABMdCWueEz/F5g3bjWRgIgNZQDoiDtgK84K/ZjCGc+FCk5/4gCfr1u9Yu0yRy2Jos="}]},"_npmUser":{"name":"artbrnv","email":"art.brunov@gmail.com"},"directories":{},"maintainers":[{"name":"artbrnv","email":"art.brunov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/realfavicongenerator_1.0.0_1781221786819_0.9643720060862835"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-11T23:49:46.650Z","1.0.0":"2026-06-11T23:49:46.968Z","modified":"2026-06-11T23:49:47.184Z"},"maintainers":[{"name":"artbrnv","email":"art.brunov@gmail.com"}],"description":"Zero-dependency favicon toolkit — HTML tags, web manifest, browserconfig, size maps, path helpers, SVG favicon, Apple/Android/Windows tile configs, PWA shortcuts","homepage":"https://github.com/artbrnv/realfavicongenerator#readme","keywords":["favicon","pwa","manifest","apple-touch-icon","browserconfig","web-app-manifest","meta-tags","zero-dependency"],"repository":{"type":"git","url":"git+https://github.com/artbrnv/realfavicongenerator.git"},"author":{"name":"art.brunov@gmail.com"},"bugs":{"url":"https://github.com/artbrnv/realfavicongenerator/issues"},"license":"MIT","readme":"# realfavicongenerator\n\nZero-dependency favicon toolkit for Node.js — HTML tags, web manifest, browserconfig, size maps, path helpers, SVG favicon, Apple/Android/Windows tile configs, PWA shortcuts.\n\n```sh\nnpm install realfavicongenerator\n```\n\nZero runtime dependencies. Pure JavaScript — works in Node.js, build tools, and server-side rendering.\n\n---\n\n## Quick start\n\n```ts\nimport { buildFaviconTags, renderFaviconHead, buildWebManifest, buildBrowserConfig } from 'realfavicongenerator';\n\n// All <head> tags in one call\nconst tags = buildFaviconTags({\n  basePath:      '/static/favicons',\n  appName:       'My App',\n  themeColor:    '#1a1a2e',\n  tileColor:     '#1a1a2e',\n  manifestPath:  '/site.webmanifest',\n  appleTouchSizes: [180],\n  faviconSizes:    [16, 32],\n  includeSvg:    true,\n});\n\n// → array of <link> and <meta> tag strings\nconsole.log(tags.join('\\n'));\n\n// Or render as a single block with a comment header\nconst html = renderFaviconHead({ basePath: '/', appName: 'My App', themeColor: '#ffffff' });\n```\n\n---\n\n## HTML tag builders\n\n### Individual tags\n\n```ts\nimport {\n  buildFaviconTag, buildIcoTag, buildSvgFaviconTag,\n  buildAppleTouchIconTag, buildMaskIconTag, buildManifestTag,\n  buildThemeColorTag, buildMsTags, buildAppNameTag,\n} from 'realfavicongenerator';\n\nbuildFaviconTag('/favicon-32x32.png', 32)\n// <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon-32x32.png\">\n\nbuildIcoTag('/favicon.ico')\n// <link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\nbuildSvgFaviconTag('/favicon.svg')\n// <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">\n\nbuildAppleTouchIconTag('/apple-touch-icon-180x180.png', 180)\n// <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon-180x180.png\">\n\nbuildMaskIconTag('/safari-pinned-tab.svg', '#5bbad5')\n// <link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n\nbuildManifestTag('/site.webmanifest')\n// <link rel=\"manifest\" href=\"/site.webmanifest\">\n\nbuildThemeColorTag('#ffffff')\n// <meta name=\"theme-color\" content=\"#ffffff\">\n\nbuildThemeColorTag('#0d0d0d', 'dark')\n// <meta name=\"theme-color\" content=\"#0d0d0d\" media=\"(prefers-color-scheme: dark)\">\n\nbuildMsTags('#ffffff', '/mstile-144x144.png')\n// [<meta name=\"msapplication-TileColor\" ...>, <meta name=\"msapplication-TileImage\" ...>, ...]\n\nbuildAppNameTag('My App')\n// <meta name=\"application-name\" content=\"My App\">\n```\n\n### Apple Web App tags\n\n```ts\nimport { buildAppleWebAppTags, buildAppleSplashTags } from 'realfavicongenerator';\n\nbuildAppleWebAppTags({ title: 'My App', statusBarStyle: 'black-translucent', capable: true })\n// [\n//   <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">,\n//   <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">,\n//   <meta name=\"apple-mobile-web-app-title\" content=\"My App\">,\n// ]\n\n// All common iPhone/iPad splash screen tags\nconst splashTags = buildAppleSplashTags('/static/splash');\n```\n\n---\n\n## Web App Manifest\n\n```ts\nimport { buildWebManifest, buildManifestIcon, buildShortcut, buildManifestScreenshot } from 'realfavicongenerator';\n\nconst manifest = buildWebManifest({\n  name:            'My Awesome App',\n  shortName:       'MyApp',\n  description:     'Does awesome things.',\n  startUrl:        '/',\n  display:         'standalone',\n  backgroundColor: '#ffffff',\n  themeColor:      '#1a1a2e',\n  basePath:        '/static/favicons',\n  iconSizes:       [192, 512],\n  shortcuts: [\n    buildShortcut('New Post', '/posts/new', { description: 'Create a new post', iconSrc: '/icons/new.png' }),\n    buildShortcut('Profile',  '/profile'),\n  ],\n});\n\n// Serialise to disk (Node.js)\nimport { writeFileSync } from 'fs';\nwriteFileSync('public/site.webmanifest', JSON.stringify(manifest, null, 2));\n```\n\nIndividual icon and screenshot builders:\n\n```ts\nbuildManifestIcon('/android-chrome-192x192.png', 192, { purpose: 'maskable' })\n// { src: '/android-chrome-192x192.png', sizes: '192x192', type: 'image/png', purpose: 'maskable' }\n\nbuildManifestScreenshot('/screenshots/home.png', 390, 844, { label: 'Home screen', formFactor: 'narrow' })\n```\n\n---\n\n## browserconfig.xml\n\n```ts\nimport { buildBrowserConfig } from 'realfavicongenerator';\n\nconst xml = buildBrowserConfig({ tileColor: '#1a1a2e', basePath: '/static/favicons' });\n// <?xml version=\"1.0\" encoding=\"utf-8\"?>\n// <browserconfig>\n//   <msapplication>\n//     <tile>\n//       <square70x70logo src=\"/static/favicons/mstile-70x70.png\"/>\n//       ...\n//     </tile>\n//   </msapplication>\n// </browserconfig>\n\nimport { writeFileSync } from 'fs';\nwriteFileSync('public/browserconfig.xml', xml);\n```\n\n---\n\n## Size maps & filename helpers\n\n```ts\nimport {\n  ICO_SIZES, FAVICON_SIZES, APPLE_TOUCH_SIZES, ANDROID_SIZES, WINDOWS_TILE_SIZES,\n  faviconFilename, appleTouchFilename, androidFilename, mstileFilename, faviconPath,\n} from 'realfavicongenerator';\n\nICO_SIZES            // [16, 32, 48]\nFAVICON_SIZES        // [16, 32, 96, 192]\nAPPLE_TOUCH_SIZES    // [57, 60, 72, 76, 114, 120, 144, 152, 167, 180]\nANDROID_SIZES        // [36, 48, 72, 96, 144, 192, 256, 384, 512]\n\nfaviconFilename(32)                          // 'favicon-32x32.png'\nfaviconFilename(32, 'png', 'apple')          // 'apple-touch-icon-32x32.png'\nappleTouchFilename(180)                      // 'apple-touch-icon-180x180.png'\nandroidFilename(512)                         // 'android-chrome-512x512.png'\nmstileFilename(150)                          // 'mstile-150x150.png'\nfaviconPath('favicon-32x32.png', '/static')  // '/static/favicon-32x32.png'\n```\n\n---\n\n## Full favicon file set\n\n```ts\nimport { buildFaviconFileSet } from 'realfavicongenerator';\n\nconst set = buildFaviconFileSet({ basePath: '/static/favicons' });\n// {\n//   count: 19,\n//   basePath: '/static/favicons',\n//   files: [\n//     { filename: 'favicon.ico',        format: 'ico', platform: 'generic', ... },\n//     { filename: 'favicon.svg',        format: 'svg', platform: 'generic', ... },\n//     { filename: 'favicon-16x16.png',  format: 'png', sizes: [16], ...         },\n//     { filename: 'android-chrome-192x192.png', ...                             },\n//     { filename: 'site.webmanifest',   format: 'json', platform: 'pwa', ...    },\n//     { filename: 'browserconfig.xml',  format: 'xml',  platform: 'windows',... },\n//     ...\n//   ]\n// }\n\n// Use to feed any image-generation pipeline:\nfor (const f of set.files.filter(f => f.format === 'png')) {\n  console.log(`generate: ${f.path}  (${f.sizes.join(', ')}px)`);\n}\n```\n\n---\n\n## Theme config\n\n```ts\nimport { buildThemeConfig } from 'realfavicongenerator';\n\nconst theme = buildThemeConfig({\n  themeColor:      '#1a1a2e',\n  darkThemeColor:  '#0d0d0d',\n  backgroundColor: '#ffffff',\n  tileColor:       '#1a1a2e',\n  maskIconColor:   '#5bbad5',\n});\n```\n\n---\n\n## Open Graph & Twitter tags\n\n```ts\nimport { buildOgImageTags, buildTwitterImageTags } from 'realfavicongenerator';\n\nbuildOgImageTags('https://example.com/og-image.png', { width: 1200, height: 630, alt: 'My App' })\n// [\n//   <meta property=\"og:image\" content=\"...\">,\n//   <meta property=\"og:image:width\" content=\"1200\">,\n//   <meta property=\"og:image:height\" content=\"630\">,\n//   <meta property=\"og:image:type\" content=\"image/png\">,\n//   <meta property=\"og:image:alt\" content=\"My App\">,\n// ]\n\nbuildTwitterImageTags('https://example.com/og-image.png', { card: 'summary_large_image', alt: 'My App' })\n```\n\n---\n\n## Utilities\n\n```ts\nimport { parseSize, sizeString, isHexColor, normaliseColor, isSvgFavicon, deduplicateTags, filterTags, renderHeadBlock } from 'realfavicongenerator';\n\nparseSize('192x192')          // { width: 192, height: 192 }\nsizeString(192, 192)          // '192x192'\nisHexColor('#1a1a2e')         // true\nnormaliseColor('#fff')        // '#ffffff'\nisSvgFavicon('/favicon.svg')  // true\n\n// Deduplicate and filter tag lists\nconst allTags = [...buildFaviconTags(), ...buildFaviconTags()];\ndeduplicateTags(allTags)           // removes duplicates\nfilterTags(allTags, 'icon')        // only <link rel=\"icon\"> tags\nfilterTags(allTags, 'theme-color') // only theme-color meta tags\n\n// Wrap in a comment block\nrenderHeadBlock(buildFaviconTags({ basePath: '/' }), { comment: 'Favicons' })\n// <!-- Favicons -->\n// <link rel=\"shortcut icon\" href=\"/favicon.ico\">\n// ...\n```\n\n---\n\n## ICO config\n\n```ts\nimport { buildIcoConfig, ICO_SIZES } from 'realfavicongenerator';\n\nbuildIcoConfig(ICO_SIZES, { basePath: '/static' })\n// {\n//   sizes: [16, 32, 48],\n//   sources: [\n//     { size: 16, filename: 'favicon-16x16.png', path: '/static/favicon-16x16.png' },\n//     { size: 32, filename: 'favicon-32x32.png', path: '/static/favicon-32x32.png' },\n//     { size: 48, filename: 'favicon-48x48.png', path: '/static/favicon-48x48.png' },\n//   ]\n// }\n```\n\n---\n\n## CommonJS\n\n```js\nconst {\n  buildFaviconTags, buildWebManifest, buildBrowserConfig,\n  FAVICON_SIZES, ANDROID_SIZES, buildThemeConfig,\n} = require('realfavicongenerator');\n```\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-2366ad4a0f36f6b8a430b45224fd8983"}