Compare commits

21 Commits
v1.0.0 ... main

Author SHA1 Message Date
Hadi
753f2c3dd1 Edit nav & colors
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-04-01 01:14:00 +02:00
Hadi
1b7c96da8f add banner
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 18:24:55 +02:00
Hadi
f5df9e127a edit readme
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-30 17:36:12 +02:00
Hadi
1c9d554b74 Merge branch 'main' of github.com:anotherhadi/default-creds 2026-03-25 20:54:49 +01:00
Hadi
f8465f8f00 update url
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-25 20:54:47 +01:00
Hadi
4866d28ebd Merge pull request #1 from C4mill3/add-misp 2026-03-19 18:33:16 +01:00
Hadi
34b1820e51 Svelte 5, renaming
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-17 00:09:32 +01:00
Hadi
909d61525a Improvement, Fixes
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-17 00:04:06 +01:00
Hadi
55d7a3404a Edit privacy policy
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:55:53 +01:00
Hadi
c79a5cc407 Add open graph & twitter banners
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:45:05 +01:00
Hadi
f5d355e18f Edit links
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:29:20 +01:00
Hadi
5b4ca98f70 Edit analytics
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:24:08 +01:00
Hadi
0cb4f515ce Add umami to CORS
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 23:14:11 +01:00
Hadi
ee1834d22b Test process env instead of meta
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:49:08 +01:00
Hadi
b25430730c Update bun.lock
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:32:20 +01:00
Hadi
73efc34475 update bun.nix
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:25:34 +01:00
Hadi
810984dcd9 add service side analytics
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:19:09 +01:00
Hadi
47b1da68e4 update
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:18:57 +01:00
Hadi
838d194164 Add analytics & privacy-policy
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-16 22:02:50 +01:00
C4mill3
24df290d0f added misp manufacturer 2026-03-14 16:38:30 +01:00
Hadi
9b8ce076bf strip searchStr from the api anwser
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
2026-03-07 17:56:08 +01:00
20 changed files with 415 additions and 99 deletions

BIN
.github/assets/banner.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -1,5 +1,5 @@
<div align="center">
<img alt="logo" src="https://raw.githubusercontent.com/anotherhadi/default-creds/main/public/logo.svg" width="120px" />
<img alt="logo" src="./public/logo.svg" width="120px" />
</div>
<br>
@@ -25,9 +25,9 @@
**Default Creds** is a centralized, community-driven repository of factory-set credentials. Designed for pentesters and security researchers, it helps identify weak access points during engagement phases or audit internal infrastructure before they become a security liability.
**Live Instance:** [default-creds.hadi.diy](https://default-creds.hadi.diy)
**Live Instance:** [default-creds.hadi.icu](https://default-creds.hadi.icu?utm_source=github&utm_medium=readme)
**API Documentation:** [default-creds.hadi.diy/api-docs](https://default-creds.hadi.diy/api-docs)
**API Documentation:** [default-creds.hadi.icu/api-docs](https://default-creds.hadi.icu/api-docs?utm_source=github&utm_medium=readme)
## 🎯 The Mission
@@ -84,3 +84,11 @@ bun dev
## ⚠️ Legal Disclaimer
Usage of **Default Creds** for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state, and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program.
---
<div align="center">
<a href="https://github.com/anotherhadi/default-creds">github</a> |
<a href="https://gitlab.com/anotherhadi/default-creds">gitlab (mirror)</a> |
<a href="https://git.hadi.icu/anotherhadi/default-creds">gitea (mirror)</a>
</div

View File

@@ -6,6 +6,7 @@ import node from "@astrojs/node";
// https://astro.build/config
export default defineConfig({
site: "https://default-creds.hadi.icu",
output: "server",
vite: {
plugins: [tailwindcss()],

View File

@@ -5,19 +5,20 @@
"": {
"name": "default-creds",
"dependencies": {
"@astrojs/node": "^9.5.4",
"@astrojs/node": "^9.5.5",
"@astrojs/svelte": "^7.2.5",
"@tailwindcss/vite": "^4.2.1",
"astro": "^5.17.1",
"astro": "^5.18.1",
"js-yaml": "^4.1.1",
"lucide-svelte": "^0.575.0",
"svelte": "^5.53.5",
"svelte": "^5.53.12",
"tailwindcss": "^4.2.1",
"typescript": "^5.9.3",
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.19",
"@types/js-yaml": "^4.0.9",
"@types/node": "^25.3.2",
"@types/node": "^25.5.0",
"daisyui": "^5.5.19",
},
},
@@ -25,11 +26,11 @@
"packages": {
"@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="],
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="],
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="],
"@astrojs/node": ["@astrojs/node@9.5.4", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^5.17.3" } }, "sha512-AbPSZsMGu8hXPR2XxV79RaKy8h6wijhtoqZGeUf4OXg2w1mxXlx4VnIc1D+QvtsgauSz7P5PLhmvf6w/J41GJg=="],
"@astrojs/node": ["@astrojs/node@9.5.5", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^5.17.3" } }, "sha512-rtU2BGU5u3SfGURpANfMxVzCIoR86MkaN05ncza9rbtuMKJ/XnRJt/BbyVknDbOJ71hoci0SIsJwKcJR8vvi/A=="],
"@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
@@ -263,6 +264,8 @@
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="],
"@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="],
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="],
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
@@ -279,7 +282,7 @@
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
"@types/node": ["@types/node@25.3.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q=="],
"@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
@@ -303,7 +306,7 @@
"array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
"astro": ["astro@5.18.0", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-CHiohwJIS4L0G6/IzE1Fx3dgWqXBCXus/od0eGUfxrZJD2um2pE7ehclMmgL/fXqbU7NfE1Ze2pq34h2QaA6iQ=="],
"astro": ["astro@5.18.1", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.6", "@astrojs/markdown-remark": "6.3.11", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
@@ -379,7 +382,7 @@
"deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
"devalue": ["devalue@5.6.3", "", {}, "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg=="],
"devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
@@ -673,6 +676,8 @@
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
"postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="],
"prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
@@ -751,7 +756,7 @@
"strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
"svelte": ["svelte@5.53.5", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow=="],
"svelte": ["svelte@5.53.12", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-4x/uk4rQe/d7RhfvS8wemTfNjQ0bJbKvamIzRBfTe2eHHjzBZ7PZicUQrC2ryj83xxEacfA1zHKd1ephD1tAxA=="],
"svelte2tsx": ["svelte2tsx@0.7.51", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0" } }, "sha512-YbVMQi5LtQkVGOMdATTY8v3SMtkNjzYtrVDGaN3Bv+0LQ47tGXu/Oc8ryTkcYuEJWTZFJ8G2+2I8ORcQVGt9Ag=="],
@@ -813,6 +818,8 @@
"unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="],
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
"vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],

54
bun.nix
View File

@@ -17,17 +17,17 @@
url = "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz";
hash = "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==";
};
"@astrojs/internal-helpers@0.7.5" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz";
hash = "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==";
"@astrojs/internal-helpers@0.7.6" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz";
hash = "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==";
};
"@astrojs/markdown-remark@6.3.10" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz";
hash = "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==";
"@astrojs/markdown-remark@6.3.11" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz";
hash = "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==";
};
"@astrojs/node@9.5.4" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/node/-/node-9.5.4.tgz";
hash = "sha512-AbPSZsMGu8hXPR2XxV79RaKy8h6wijhtoqZGeUf4OXg2w1mxXlx4VnIc1D+QvtsgauSz7P5PLhmvf6w/J41GJg==";
"@astrojs/node@9.5.5" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/node/-/node-9.5.5.tgz";
hash = "sha512-rtU2BGU5u3SfGURpANfMxVzCIoR86MkaN05ncza9rbtuMKJ/XnRJt/BbyVknDbOJ71hoci0SIsJwKcJR8vvi/A==";
};
"@astrojs/prism@3.3.0" = fetchurl {
url = "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz";
@@ -609,6 +609,10 @@
url = "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz";
hash = "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==";
};
"@tailwindcss/typography@0.5.19" = fetchurl {
url = "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz";
hash = "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==";
};
"@tailwindcss/vite@4.2.1" = fetchurl {
url = "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz";
hash = "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==";
@@ -645,9 +649,9 @@
url = "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz";
hash = "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==";
};
"@types/node@25.3.2" = fetchurl {
url = "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz";
hash = "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==";
"@types/node@25.5.0" = fetchurl {
url = "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz";
hash = "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==";
};
"@types/trusted-types@2.0.7" = fetchurl {
url = "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz";
@@ -701,9 +705,9 @@
url = "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz";
hash = "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==";
};
"astro@5.18.0" = fetchurl {
url = "https://registry.npmjs.org/astro/-/astro-5.18.0.tgz";
hash = "sha512-CHiohwJIS4L0G6/IzE1Fx3dgWqXBCXus/od0eGUfxrZJD2um2pE7ehclMmgL/fXqbU7NfE1Ze2pq34h2QaA6iQ==";
"astro@5.18.1" = fetchurl {
url = "https://registry.npmjs.org/astro/-/astro-5.18.1.tgz";
hash = "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==";
};
"axobject-query@4.1.0" = fetchurl {
url = "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz";
@@ -857,9 +861,9 @@
url = "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz";
hash = "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==";
};
"devalue@5.6.3" = fetchurl {
url = "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz";
hash = "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==";
"devalue@5.6.4" = fetchurl {
url = "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz";
hash = "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==";
};
"devlop@1.1.0" = fetchurl {
url = "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz";
@@ -1469,6 +1473,10 @@
url = "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz";
hash = "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==";
};
"postcss-selector-parser@6.0.10" = fetchurl {
url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz";
hash = "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==";
};
"postcss@8.5.6" = fetchurl {
url = "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz";
hash = "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==";
@@ -1641,9 +1649,9 @@
url = "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.51.tgz";
hash = "sha512-YbVMQi5LtQkVGOMdATTY8v3SMtkNjzYtrVDGaN3Bv+0LQ47tGXu/Oc8ryTkcYuEJWTZFJ8G2+2I8ORcQVGt9Ag==";
};
"svelte@5.53.5" = fetchurl {
url = "https://registry.npmjs.org/svelte/-/svelte-5.53.5.tgz";
hash = "sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow==";
"svelte@5.53.12" = fetchurl {
url = "https://registry.npmjs.org/svelte/-/svelte-5.53.12.tgz";
hash = "sha512-4x/uk4rQe/d7RhfvS8wemTfNjQ0bJbKvamIzRBfTe2eHHjzBZ7PZicUQrC2ryj83xxEacfA1zHKd1ephD1tAxA==";
};
"svgo@4.0.0" = fetchurl {
url = "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz";
@@ -1761,6 +1769,10 @@
url = "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz";
hash = "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==";
};
"util-deprecate@1.0.2" = fetchurl {
url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
hash = "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==";
};
"vfile-location@5.0.3" = fetchurl {
url = "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz";
hash = "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==";

View File

@@ -9,19 +9,20 @@
"astro": "astro"
},
"dependencies": {
"@astrojs/node": "^9.5.4",
"@astrojs/node": "^9.5.5",
"@astrojs/svelte": "^7.2.5",
"@tailwindcss/vite": "^4.2.1",
"astro": "^5.17.1",
"astro": "^5.18.1",
"js-yaml": "^4.1.1",
"lucide-svelte": "^0.575.0",
"svelte": "^5.53.5",
"svelte": "^5.53.12",
"tailwindcss": "^4.2.1",
"typescript": "^5.9.3"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.19",
"@types/js-yaml": "^4.0.9",
"@types/node": "^25.3.2",
"@types/node": "^25.5.0",
"daisyui": "^5.5.19"
}
}

64
public/logo-large.svg Normal file
View File

@@ -0,0 +1,64 @@
<svg width="702" height="249" viewBox="0 0 702 249" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M47.9591 0C59.1413 0 68.9154 1.94653 77.2813 5.83959C85.73 9.64981 92.2737 15.0338 96.9122 21.9916C101.634 28.9494 103.994 37.1497 103.994 46.5924C103.994 55.9523 101.634 64.1526 96.9122 71.1932C92.2737 78.151 85.73 83.5764 77.2813 87.4695C68.9154 91.2797 59.1413 93.1848 47.9591 93.1848H0V0H47.9591ZM28.7009 80.6359L15.4066 67.4658H50.1956C55.2482 67.4658 59.5969 66.6375 63.2414 64.9809C66.9688 63.2414 69.8265 60.7979 71.8144 57.6504C73.8024 54.5028 74.7964 50.8168 74.7964 46.5924C74.7964 42.2852 73.8024 38.5992 71.8144 35.5345C69.8265 32.3869 66.9688 29.9848 63.2414 28.3282C59.5969 26.5887 55.2482 25.719 50.1956 25.719H15.4066L28.7009 12.5489V80.6359Z" fill="url(#paint0_linear_446_71)"/>
<path d="M196.406 36.4042V56.7806H127.201V36.4042H196.406ZM146.956 46.5924L141.117 82.6239L129.81 70.075H200.755V93.1848H112.416L119.374 46.5924L112.416 0H200.134V23.1098H129.81L141.117 10.561L146.956 46.5924Z" fill="url(#paint1_linear_446_71)"/>
<path d="M228.802 37.2739H296.765V61.502H228.802V37.2739ZM299.125 0V24.2281H230.168L243.711 10.9337V93.1848H214.762V0H299.125Z" fill="url(#paint2_linear_446_71)"/>
<path d="M324.799 76.4116V53.3017H388.661V76.4116H324.799ZM376.361 0L418.108 93.1848H387.17L353.375 12.5489H361.203L327.284 93.1848H296.47L338.093 0H376.361Z" fill="url(#paint3_linear_446_71)"/>
<path d="M447.888 50.941C447.888 54.8341 448.592 58.1473 450 60.8808C451.408 63.6142 453.521 65.7678 456.337 67.3416C459.153 68.8325 462.673 69.578 466.898 69.578C471.288 69.578 474.891 68.8325 477.707 67.3416C480.523 65.8506 482.594 63.7384 483.919 61.005C485.328 58.1888 486.032 54.8341 486.032 50.941V0H514.981V52.5562C514.981 61.0878 512.993 68.584 509.017 75.0449C505.041 81.4228 499.45 86.3927 492.244 89.9544C485.038 93.5162 476.589 95.297 466.898 95.297C457.372 95.297 449.006 93.5162 441.8 89.9544C434.594 86.3927 428.961 81.4228 424.902 75.0449C420.927 68.584 418.939 61.0878 418.939 52.5562V0H447.888V50.941Z" fill="url(#paint4_linear_446_71)"/>
<path d="M558.938 0V80.3875L545.892 67.4658H615.346V93.1848H529.989V0H558.938Z" fill="url(#paint5_linear_446_71)"/>
<path d="M637.927 12.5489H666.876V93.1848H637.927V12.5489ZM603.386 0H701.417V25.719H603.386V0Z" fill="url(#paint6_linear_446_71)"/>
<path d="M187.929 207.194C186.935 215.477 184.036 222.766 179.232 229.061C174.51 235.356 168.215 240.243 160.346 243.722C152.56 247.201 143.615 248.94 133.509 248.94C122.575 248.94 113.008 246.911 104.808 242.852C96.6079 238.794 90.2299 233.12 85.6742 225.83C81.1185 218.541 78.8407 210.01 78.8407 200.236C78.8407 190.462 81.1185 181.93 85.6742 174.641C90.2299 167.352 96.6079 161.678 104.808 157.619C113.008 153.56 122.575 151.531 133.509 151.531C143.615 151.531 152.56 153.271 160.346 156.749C168.215 160.228 174.51 165.115 179.232 171.411C184.036 177.623 186.935 184.912 187.929 193.278H158.855C158.027 189.716 156.495 186.693 154.258 184.208C152.105 181.64 149.288 179.694 145.81 178.368C142.331 176.96 138.23 176.256 133.509 176.256C128.208 176.256 123.652 177.209 119.842 179.114C116.032 181.019 113.091 183.794 111.021 187.438C108.95 191 107.914 195.266 107.914 200.236C107.914 205.206 108.95 209.471 111.021 213.033C113.091 216.595 116.032 219.37 119.842 221.358C123.652 223.263 128.208 224.215 133.509 224.215C138.23 224.215 142.331 223.594 145.81 222.352C149.288 221.026 152.105 219.08 154.258 216.512C156.495 213.944 158.027 210.838 158.855 207.194H187.929Z" fill="url(#paint7_linear_446_71)"/>
<path d="M219.659 193.899H252.212C255.857 193.899 258.673 193.071 260.661 191.414C262.732 189.758 263.767 187.355 263.767 184.208C263.767 181.06 262.732 178.658 260.661 177.002C258.673 175.345 255.857 174.517 252.212 174.517H215.559L228.605 161.098V246.828H199.656V153.643H256.561C263.767 153.643 270.104 154.927 275.57 157.495C281.037 160.063 285.303 163.624 288.368 168.18C291.432 172.736 292.965 178.078 292.965 184.208C292.965 190.172 291.432 195.473 288.368 200.111C285.303 204.667 281.037 208.229 275.57 210.797C270.104 213.282 263.767 214.524 256.561 214.524H219.659V193.899ZM232.084 203.218H264.264L296.32 246.828H263.146L232.084 203.218Z" fill="url(#paint8_linear_446_71)"/>
<path d="M388.297 190.048V210.424H319.092V190.048H388.297ZM338.847 200.236L333.007 236.267L321.701 223.718H392.645V246.828H304.306L311.264 200.236L304.306 153.643H392.024V176.753H321.701L333.007 164.204L338.847 200.236Z" fill="url(#paint9_linear_446_71)"/>
<path d="M454.611 153.643C465.794 153.643 475.568 155.59 483.934 159.483C492.382 163.293 498.926 168.677 503.565 175.635C508.286 182.593 510.647 190.793 510.647 200.236C510.647 209.596 508.286 217.796 503.565 224.837C498.926 231.794 492.382 237.22 483.934 241.113C475.568 244.923 465.794 246.828 454.611 246.828H406.652V153.643H454.611ZM435.353 234.279L422.059 221.109H456.848C461.901 221.109 466.249 220.281 469.894 218.624C473.621 216.885 476.479 214.441 478.467 211.294C480.455 208.146 481.449 204.46 481.449 200.236C481.449 195.929 480.455 192.243 478.467 189.178C476.479 186.03 473.621 183.628 469.894 181.971C466.249 180.232 461.901 179.362 456.848 179.362H422.059L435.353 166.192V234.279Z" fill="url(#paint10_linear_446_71)"/>
<path d="M519.288 216.264H548.61C548.941 218.417 549.976 220.322 551.716 221.979C553.538 223.553 555.982 224.795 559.046 225.706C562.111 226.535 565.714 226.949 569.856 226.949C575.571 226.949 580.003 226.286 583.15 224.961C586.381 223.635 587.996 221.606 587.996 218.873C587.996 216.968 587.085 215.435 585.262 214.276C583.44 213.033 579.837 212.205 574.453 211.791L558.052 210.424C544.634 209.43 534.901 206.531 528.854 201.727C522.891 196.84 519.909 190.296 519.909 182.096C519.909 175.386 521.855 169.795 525.748 165.322C529.641 160.767 535.067 157.329 542.025 155.01C548.982 152.691 557.183 151.531 566.625 151.531C575.737 151.531 583.813 152.815 590.854 155.383C597.977 157.951 603.609 161.595 607.751 166.316C611.975 170.955 614.295 176.38 614.709 182.593H585.387C585.055 180.77 584.103 179.197 582.529 177.871C581.038 176.463 578.884 175.386 576.068 174.641C573.252 173.895 569.897 173.523 566.004 173.523C560.869 173.523 556.768 174.144 553.704 175.386C550.722 176.629 549.231 178.493 549.231 180.978C549.231 182.8 550.101 184.291 551.84 185.45C553.662 186.61 556.976 187.397 561.78 187.811L579.796 189.302C588.741 189.965 595.948 191.373 601.414 193.526C606.964 195.597 610.981 198.455 613.466 202.099C615.951 205.661 617.194 210.175 617.194 215.642C617.194 222.269 615.206 228.108 611.23 233.161C607.254 238.131 601.663 242.024 594.457 244.84C587.333 247.574 578.967 248.94 569.359 248.94C559.502 248.94 550.846 247.574 543.391 244.84C535.937 242.107 530.097 238.297 525.873 233.41C521.648 228.44 519.453 222.724 519.288 216.264Z" fill="url(#paint11_linear_446_71)"/>
<defs>
<linearGradient id="paint0_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint1_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint2_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint3_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint4_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint5_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint6_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint7_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint8_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint9_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint10_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
<linearGradient id="paint11_linear_446_71" x1="350.708" y1="0" x2="350.708" y2="248.94" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7A5F5"/>
<stop offset="1" stop-color="#89D2C7"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
public/op.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -28,7 +28,9 @@
<div class="stat-figure text-primary">
<Database size={32} />
</div>
<div class="stat-title uppercase tracking-widest text-xs">Manufacturers</div>
<div class="stat-title uppercase tracking-widest text-xs">
Manufacturers
</div>
<div class="stat-value text-primary">{totalApps}</div>
<div class="stat-desc">
Add a new manufacturer <a
@@ -42,7 +44,9 @@
<div class="stat-figure text-secondary">
<KeyRound size={32} />
</div>
<div class="stat-title uppercase tracking-widest text-xs">Credentials</div>
<div class="stat-title uppercase tracking-widest text-xs">
Credentials
</div>
<div class="stat-value text-secondary">{totalPasswords}</div>
<div class="stat-desc">
Full list available <a
@@ -108,3 +112,4 @@
</div>
</div>
</div>
<p class="text-base-content/20 m-auto text-center text-xs"><a href="/privacy-policy">Privacy policy</a></p>

View File

@@ -1,9 +1,34 @@
<script lang="ts">
import { Menu } from "lucide-svelte";
import type { NavItem } from "../types/nav";
import { Search, Book, Github, User, Shield, Menu } from "lucide-svelte";
import type { Snippet } from "svelte";
export let title: string = "";
export let navLinks: NavItem[] = [];
let {
action,
}: {
title?: string;
action?: Snippet;
} = $props();
const navLinks = [
{ label: "Search", href: "/", icon: Search },
{ label: "API", href: "/api-docs", icon: Book },
{
label: "More",
children: [
{
label: "Source code",
href: "https://github.com/anotherhadi/default-creds",
icon: Github,
},
{
label: "Passwords list",
href: "https://github.com/anotherhadi/default-creds/blob/main/src/data",
icon: Shield,
},
{ label: "About me", href: "https://hadi.icu", icon: User },
],
},
];
</script>
<div class="bg-base-200">
@@ -23,17 +48,37 @@
<span>{link.label}</span>
<ul class="p-2">
{#each link.children as sublink}
<li><a href={sublink.href}>{sublink.label}</a></li>
<li>
<a href={sublink.href} class="flex items-center gap-2">
{#if sublink.icon}
{@const Icon = sublink.icon}
<Icon size={12} />
{/if}
{sublink.label}
</a>
</li>
{/each}
</ul>
{:else}
<a href={link.href}>{link.label}</a>
<a href={link.href} class="flex items-center gap-2">
{#if link.icon}
{@const Icon = link.icon}
<Icon size={12} />
{/if}
{link.label}
</a>
{/if}
</li>
{/each}
</ul>
</div>
<a href="/" class="btn btn-ghost text-xl">{title}</a>
<a
href="/"
class="btn btn-ghost text-xl flex justify-center gap-4 items-center"
>
<img src="/logo.svg" class="m-auto h-6" alt="iky logo" />
<img src="/logo-large.svg" class="m-auto h-6" alt="iky logo large" />
</a>
</div>
<div class="navbar-center hidden lg:flex">
@@ -48,7 +93,8 @@
<li>
<a href={sublink.href} class="flex items-center gap-2">
{#if sublink.icon}
<svelte:component this={sublink.icon} size={16} />
{@const Icon = sublink.icon}
<Icon size={12} />
{/if}
{sublink.label}
</a>
@@ -59,7 +105,8 @@
{:else}
<a href={link.href} class="flex items-center gap-2">
{#if link.icon}
<svelte:component this={link.icon} size={18} />
{@const Icon = link.icon}
<Icon size={14} />
{/if}
{link.label}
</a>
@@ -70,7 +117,7 @@
</div>
<div class="navbar-end">
<slot name="action"></slot>
{@render action?.()}
</div>
</div>
</div>

View File

@@ -1,16 +1,6 @@
<script lang="ts">
import { User, Lock, Check, MessageCircle } from "lucide-svelte";
export interface Result {
manufacturer: string;
name: string;
icon: string;
tags: string[];
version: string;
comment: string;
user: string;
pass: string;
}
import type { Result } from "src/types/result";
let { result }: { result: Result} = $props();

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { onMount } from "svelte";
import type { Result as ResultType } from "./Result.svelte";
import Result from "./Result.svelte";
import type { Result as ResultType } from "src/types/result";
import { Search } from "lucide-svelte";
import DefaultView from "./DefaultView.svelte";
import NotFoundView from "./NotFoundView.svelte";
@@ -75,6 +75,18 @@
results = data.results;
totalPages = data.pagination.totalPages;
totalResults = data.pagination.totalResults;
if (typeof window !== "undefined" && (window as any).umami) {
(window as any).umami.track("search", {
query: lastQuery,
results: totalResults,
hasResults: totalResults > 0,
});
if (totalResults === 0) {
(window as any).umami.track("search_no_results", {
query: lastQuery,
});
}
}
} catch (e) {
console.error("Search error:", e);
results = [];
@@ -124,7 +136,7 @@
{:else if results.length > 0}
<ul class="list rounded-box">
<li class="px-4 pb-2 text-xs opacity-60 tracking-wide">
{totalResults} result{totalResults > 1 && "s" || ""} for the query '{cleanUserInput(
{totalResults} result{(totalResults > 1 && "s") || ""} for the query '{cleanUserInput(
lastQuery,
)}'
</li>
@@ -152,7 +164,7 @@
</div>
{/if}
{:else}
<NotFoundView lastQuery={lastQuery} />
<NotFoundView {lastQuery} />
{/if}
</div>
</div>

9
src/data/misp.yaml Normal file
View File

@@ -0,0 +1,9 @@
name: 'MISP'
tags:
- 'cti'
entries:
- name: MISP
version: 'all'
user: 'admin@admin.test'
pass: 'admin'
comment: 'MISP credentials'

View File

@@ -1,38 +1,22 @@
---
import "../styles/global.css";
import Navbar from "../components/Nav.svelte";
import { Search, Book, Github, User, Shield, Coffee } from "lucide-svelte";
import { Coffee } from "lucide-svelte";
interface Props {
title?: string;
description?: string;
ogImage?: string;
}
const {
title = "Default Creds",
description = "Open-source database of default credentials for pentesters and researchers. Find factory-set passwords for any device or software.",
ogImage = `${Astro.site ?? "https://default-creds.hadi.icu"}/og.png`
} = Astro.props;
const myLinks = [
{ label: "Search", href: "/", icon: Search },
{ label: "API", href: "/api-docs", icon: Book },
{
label: "More",
children: [
{
label: "Source code",
href: "https://github.com/anotherhadi/default-creds",
icon: Github,
},
{
label: "Passwords list",
href: "https://github.com/anotherhadi/default-creds/blob/main/src/data",
icon: Shield,
},
{ label: "About me", href: "https://hadi.diy", icon: User },
],
},
];
const umamiUrl = process.env.PUBLIC_UMAMI_URL;
const umamiId = process.env.PUBLIC_UMAMI_WEBSITE_ID;
---
<html lang="en">
@@ -46,21 +30,42 @@ const myLinks = [
{title === "Default Creds" ? title : `${title} | Default Creds`}
</title>
<meta name="description" content={description} />
<!-- Open Graph -->
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:type" content="website" />
<meta property="og:url" content={Astro.url} />
<meta property="og:image" content={ogImage} />
<meta property="og:site_name" content="Default Creds" />
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={ogImage} />
</head>
<body class="bg-base-100 min-h-screen">
<Navbar title="Default Creds" navLinks={myLinks} client:load>
<Navbar client:load>
<a
href="https://ko-fi.com/anotherhadi"
slot="action"
target="_blank"
class="btn btn-primary btn-sm md:btn-md"
><Coffee class="size-5" /> Support me</a
class="btn btn-primary btn-sm"
><Coffee class="size-3" /> Support me</a
>
</Navbar>
<div class="m-auto max-w-5xl md:py-10 md:px-10 py-5 px-5 animate-fade-in">
<slot />
</div>
</body>
{umamiUrl && umamiId && (
<script
defer
src={`${umamiUrl}/script.js`}
data-website-id={umamiId}
is:inline
/>
)}
</html>

View File

@@ -53,8 +53,8 @@ const SECURITY_HEADERS: Record<string, string> = {
"default-src 'self'",
"img-src 'self' cdn.jsdelivr.net data:",
"style-src 'self' 'unsafe-inline'",
"script-src 'self' 'unsafe-inline' static.cloudflareinsights.com",
"connect-src 'self' cloudflareinsights.com",
"script-src 'self' 'unsafe-inline' static.cloudflareinsights.com umami.hadi.icu",
"connect-src 'self' cloudflareinsights.com umami.hadi.icu",
"frame-ancestors 'none'",
].join("; "),
};

View File

@@ -96,7 +96,7 @@ import { Terminal, Settings, Database, Info, Code } from "lucide-svelte";
class="mockup-code bg-base-300 border border-white/5 shadow-xl group"
>
<pre
data-prefix="$"><code>curl -X GET "https://default-creds.hadi.diy/api/search?q=cisco"</code></pre>
data-prefix="$"><code>curl -X GET "https://default-creds.hadi.icu/api/search?q=cisco"</code></pre>
<pre
data-prefix=">"
class="text-success"><code>HTTP/1.1 200 OK</code></pre>
@@ -109,7 +109,7 @@ import { Terminal, Settings, Database, Info, Code } from "lucide-svelte";
</p>
<div class="mockup-code bg-base-300 border border-white/5 shadow-xl">
<pre
data-prefix="$"><code>curl -G "https://default-creds.hadi.diy/api/search" \
data-prefix="$"><code>curl -G "https://default-creds.hadi.icu/api/search" \
-d "q=cisco" \
-d "page=2" \
-d "size=5"</code></pre>

View File

@@ -89,7 +89,7 @@ export function getAllData(): CredentialEntry[] {
return allResults;
}
export const GET: APIRoute = async ({ url }) => {
export const GET: APIRoute = async ({ url, request }) => {
const query = url.searchParams.get("q")?.trim().toLowerCase() || "";
const page = Math.max(1, parseInt(url.searchParams.get("page") || "1"));
const size = Math.min(
@@ -97,6 +97,9 @@ export const GET: APIRoute = async ({ url }) => {
Math.max(1, parseInt(url.searchParams.get("size") || "10")),
);
const dnt = request.headers.get("DNT") === "1"
|| request.headers.get("Sec-GPC") === "1";
const allEntries = getAllData();
let filtered = allEntries;
@@ -107,13 +110,24 @@ export const GET: APIRoute = async ({ url }) => {
);
}
// NOTE: Server-side tracking is intentionally only triggered when DNT/GPC is active.
// When DNT is off, the client handles tracking via Umami's JS snippet.
// When DNT is on, the JS snippet is suppressed, so we fall back to server-side tracking
// to log search queries (query string + result count only, no user data) in order to
// identify missing manufacturers/products and improve the dataset.
if (query && dnt) {
await trackSearchServerSide(query, filtered.length);
}
const totalResults = filtered.length;
const totalPages = Math.ceil(totalResults / size);
const start = (page - 1) * size;
return new Response(
JSON.stringify({
results: filtered.slice(start, start + size),
results: filtered
.slice(start, start + size)
.map(({ searchStr: _, ...entry }) => entry),
pagination: {
totalResults,
totalPages,
@@ -130,3 +144,59 @@ export const GET: APIRoute = async ({ url }) => {
},
);
};
async function trackSearchServerSide(query: string, results: number) {
const umamiUrl = process.env.UMAMI_URL;
const umamiId = process.env.UMAMI_WEBSITE_ID;
if (!umamiUrl || !umamiId) return;
try {
await fetch(`${umamiUrl}/api/send`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (compatible; default-creds-server/1.0)",
},
body: JSON.stringify({
type: "event",
payload: {
website: umamiId,
hostname: "default-creds.hadi.icu",
url: "/api/search",
name: "search",
data: {
query,
results,
hasResults: results > 0,
source: "server",
},
},
}),
});
if (results === 0) {
await fetch(`${umamiUrl}/api/send`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (compatible; default-creds-server/1.0)",
},
body: JSON.stringify({
type: "event",
payload: {
website: umamiId,
hostname: "default-creds.hadi.icu",
url: "/api/search",
name: "search_no_results",
data: {
query,
source: "server",
},
},
}),
});
}
} catch (e) {
console.error("Umami server-side tracking failed:", e);
}
}

View File

@@ -0,0 +1,74 @@
---
import Layout from "../layouts/Layout.astro";
---
<Layout title="Privacy Policy">
<main class="prose prose-invert max-w-3xl mx-auto">
<h1 class="text-4xl font-black uppercase tracking-tighter text-primary">Privacy Policy</h1>
<p class="text-base-content/50 text-sm">Last updated: March 2026</p>
<p>
Default Creds is a free, open-source tool for security researchers and pentesters. This page explains
what data is collected when you use this site and why.
</p>
<h2>What we collect</h2>
<p>
This site uses <a href="https://umami.is" target="_blank" class="link link-primary">Umami</a>,
a privacy-focused analytics tool. Umami collects the following anonymized data:
</p>
<ul>
<li>Pages visited</li>
<li>Referrer URL (where you came from)</li>
<li>Browser and operating system (aggregated)</li>
<li>Country (derived from IP, not stored)</li>
<li>Search queries submitted through the search interface</li>
</ul>
<h2>What we do NOT collect</h2>
<ul>
<li>No cookies are set — ever</li>
<li>No IP addresses are stored</li>
<li>No personal information of any kind</li>
<li>No cross-site tracking</li>
<li>No data is sold or shared with third parties</li>
</ul>
<h2>How anonymization works</h2>
<p>
Umami does not store IP addresses. Instead, it generates a daily rotating hash from your IP,
browser, and a server-side secret. This hash is used solely to distinguish unique visits within
a single day and cannot be reversed or linked back to you.
</p>
<h2>Data storage</h2>
<p>
All analytics data is stored on our own self-hosted server. No data is sent to third-party
analytics providers. The Umami instance is hosted at <code>umami.hadi.icu</code>.
</p>
<h2>Your rights</h2>
<p>
Since no personal data is collected, there is nothing to access, correct, or delete. If you
still have concerns, you can reach out via the contact in our
<a href="/.well-known/security.txt" class="link link-primary">security.txt</a>.
</p>
<h2>Do Not Track</h2>
<p>
Umami respects the <code>DNT</code> (Do Not Track) header. If your browser has DNT enabled,
no client-side analytics will be collected for your session.
</p>
<p>
However, when a search is performed, the query and whether it returned results are logged
server-side, with no user information attached (no IP, no browser, no session identifier).
This is used solely to identify missing manufacturers or products in the database and improve
the dataset.
</p>
<h2>Changes to this policy</h2>
<p>
If anything changes, this page will be updated with a new date at the top.
</p>
</main>
</Layout>

View File

@@ -1,4 +1,5 @@
@import "tailwindcss";
@plugin "@tailwindcss/typography";
@plugin "daisyui" {
themes: dark --prefersdark --default;
@@ -22,9 +23,9 @@
--color-neutral: #313244; /* Surface0 */
--color-neutral-content: #cdd6f4; /* Text */
--color-base-300: #1e1e2e; /* Base */
--color-base-200: #181825; /* Mantle */
--color-base-100: #11111b; /* Crust */
--color-base-300: #1a1a2a; /* Base */
--color-base-200: #12121F; /* Mantle */
--color-base-100: #0C0C16; /* Crust */
--color-base-content: #cdd6f4; /* Text */
--color-info: #89b4fa; /* Blue */

10
src/types/result.ts Normal file
View File

@@ -0,0 +1,10 @@
export interface Result {
manufacturer: string;
name: string;
icon: string;
tags: string[];
version: string;
comment: string;
user: string;
pass: string;
}