From 4bf568d67943059a6eefbc67d0da942847a7a16b Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Sat, 7 Feb 2026 22:54:18 +0530 Subject: [PATCH 01/10] feat(site): enhance downloads page with dynamic asset metadata and improved UI --- apps/site/bun.lock | 49 +++++----- apps/site/package.json | 1 + apps/site/src/lib/download_links.ts | 134 ++++++++++++++++++++++++++++ apps/site/src/lib/gh_api.ts | 14 +++ apps/site/src/pages/downloads.astro | 85 ++++-------------- 5 files changed, 188 insertions(+), 95 deletions(-) create mode 100644 apps/site/src/lib/download_links.ts diff --git a/apps/site/bun.lock b/apps/site/bun.lock index a334f57..9689a04 100644 --- a/apps/site/bun.lock +++ b/apps/site/bun.lock @@ -7,30 +7,31 @@ "@0x-jerry/unocss-preset-daisyui": "^0.2.3", "@astrojs/check": "0.9.6", "@astrojs/mdx": "^4.3.13", - "@astrojs/sitemap": "^3.6.1", - "@astrojs/starlight": "^0.37.2", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/starlight": "^0.37.4", "@astrojs/svelte": "^7.2.5", - "astro": "5.16.9", + "astro": "5.16.16", "astro-robots-txt": "^1.0.0", - "astro-seo": "^0.8.4", + "astro-seo": "^1.1.0", "daisyui": "5.5.14", + "pretty-bytes": "^7.1.0", "starlight-sidebar-topics": "^0.6.2", - "svelte": "^5.46.1", + "svelte": "^5.49.0", "tiny-invariant": "^1.3.3", "typescript": "^5.9.3", }, "devDependencies": { "@iconify-json/mdi": "^1.2.3", "@iconify-json/tabler": "^1.2.26", - "@unocss/preset-icons": "^66.5.12", - "@unocss/preset-typography": "^66.5.12", - "@unocss/preset-web-fonts": "^66.5.12", - "@unocss/preset-wind4": "^66.5.12", - "@unocss/reset": "^66.5.12", - "@unocss/transformer-variant-group": "^66.5.12", - "prettier": "^3.7.4", + "@unocss/preset-icons": "^66.6.0", + "@unocss/preset-typography": "^66.6.0", + "@unocss/preset-web-fonts": "^66.6.0", + "@unocss/preset-wind4": "^66.6.0", + "@unocss/reset": "^66.6.0", + "@unocss/transformer-variant-group": "^66.6.0", + "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", - "unocss": "^66.5.12", + "unocss": "^66.6.0", "unocss-preset-animations": "^1.3.0", }, }, @@ -446,13 +447,13 @@ "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], - "astro": ["astro@5.16.9", "", { "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.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "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.20.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.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "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-gJvoZv0v8xCcKBcsxz1ZfXqoJ7sJJcyoKP8bUTjkuD4vDShLe0N26em4LQxitVv/2HLOpldQg67bEHB/qGoxJA=="], + "astro": ["astro@5.16.16", "", { "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.25.0", "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-MFlFvQ84ixaHyqB3uGwMhNHdBLZ3vHawyq3PqzQS2TNWiNfQrxp5ag6S3lX+Cvnh0MUcXX+UnJBPMBHjP1/1ZQ=="], "astro-expressive-code": ["astro-expressive-code@0.41.6", "", { "dependencies": { "rehype-expressive-code": "^0.41.6" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" } }, "sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw=="], "astro-robots-txt": ["astro-robots-txt@1.0.0", "", { "dependencies": { "valid-filename": "^4.0.0", "zod": "^3.22.2" } }, "sha512-6JQSLid4gMhoWjOm85UHLkgrw0+hHIjnJVIUqxjU2D6feKlVyYukMNYjH44ZDZBK1P8hNxd33PgWlHzCASvedA=="], - "astro-seo": ["astro-seo@0.8.4", "", { "dependencies": { "@astrojs/check": "^0.5.4" } }, "sha512-Ou1vzQSXAxa0K8rtNtXNvSpYqOGEgMhh0immMxJeXmbVZac3UKCNWAoXWyOQDFYsZvBugCRSg0N1phBqPMVgCw=="], + "astro-seo": ["astro-seo@1.1.0", "", { "dependencies": { "@astrojs/check": "^0.9.0" } }, "sha512-G6LDNDyga30o+52v58jU7C35n3cORUzk7RSuY+xf/ZRbW6JiNplyaOO1VoYVKO+xzYNaBcxqNln2RFRR/wgJNQ=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -464,8 +465,6 @@ "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], @@ -558,7 +557,7 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], + "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], @@ -714,8 +713,6 @@ "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], @@ -954,6 +951,8 @@ "prettier-plugin-astro": ["prettier-plugin-astro@0.14.1", "", { "dependencies": { "@astrojs/compiler": "^2.9.1", "prettier": "^3.0.0", "sass-formatter": "^0.7.6" } }, "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw=="], + "pretty-bytes": ["pretty-bytes@7.1.0", "", {}, "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw=="], + "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=="], @@ -1074,7 +1073,7 @@ "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="], - "svelte": ["svelte@5.48.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.2", "esm-env": "^1.2.1", "esrap": "^2.2.1", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-w7QZ398cdNherTdiQ/v3SYLLGOO4948Jgjh04PYqtTYVohmBvbmFwLmo7pp8gp4/1tceRWfSTjHgjtfpCVNJmQ=="], + "svelte": ["svelte@5.50.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.2", "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-FR9kTLmX5i0oyeQ5j/+w8DuagIkQ7MWMuPpPVioW2zx9Dw77q+1ufLzF1IqNtcTXPRnIIio4PlasliVn43OnbQ=="], "svelte2tsx": ["svelte2tsx@0.7.46", "", { "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-S++Vw3w47a8rBuhbz4JK0fcGea8tOoX1boT53Aib8+oUO2EKeOG+geXprJVTDfBlvR+IJdf3jIpR2RGwT6paQA=="], @@ -1252,8 +1251,6 @@ "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "astro-seo/@astrojs/check": ["@astrojs/check@0.5.10", "", { "dependencies": { "@astrojs/language-server": "^2.8.4", "chokidar": "^3.5.3", "fast-glob": "^3.3.1", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "dist/bin.js" } }, "sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w=="], - "boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -1288,8 +1285,6 @@ "@unocss/vite/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "astro-seo/@astrojs/check/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "boxen/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "boxen/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], @@ -1308,12 +1303,8 @@ "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "astro-seo/@astrojs/check/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "astro-seo/@astrojs/check/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], } } diff --git a/apps/site/package.json b/apps/site/package.json index 667bd1f..53fe2ce 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -21,6 +21,7 @@ "astro-robots-txt": "^1.0.0", "astro-seo": "^1.1.0", "daisyui": "5.5.14", + "pretty-bytes": "^7.1.0", "starlight-sidebar-topics": "^0.6.2", "svelte": "^5.49.0", "tiny-invariant": "^1.3.3", diff --git a/apps/site/src/lib/download_links.ts b/apps/site/src/lib/download_links.ts new file mode 100644 index 0000000..0afc062 --- /dev/null +++ b/apps/site/src/lib/download_links.ts @@ -0,0 +1,134 @@ +// @unocss-include +import { call_gh_api, file, repo } from "@/lib/gh_api.ts"; + +type Platform = { + label: string; + icon: string; + binaries: { + ext: "exe" | "msi" | "dmg" | "deb" | "rpm" | "appimage" | "apk"; + arch: "x64" | "arm64" | "armv7"; + size: number | undefined; + link: string; + }[]; +}; +const gh_relases_latest_metadata = (await call_gh_api("/releases/latest")) as { + assets: { name: string; size: number }[]; +}; + +function file_size(suffix: string): number | undefined { + return gh_relases_latest_metadata.assets.find( + (asset) => asset.name === `${repo}-${suffix}`, + )?.size; +} + +export let platforms: Platform[] = [ + { + label: "windows", + icon: "i-tabler:brand-windows-filled", + binaries: [ + { + ext: "exe", + arch: "x64", + size: file_size("windows-x64.exe"), + link: file("windows-x64.exe"), + }, + { + ext: "exe", + arch: "arm64", + size: file_size("windows-arm64.exe"), + link: file("windows-arm64.exe"), + }, + { + ext: "msi", + arch: "x64", + size: file_size("windows-x64.msi"), + link: file("windows-x64.msi"), + }, + { + ext: "msi", + arch: "arm64", + size: file_size("windows-arm64.exe"), + link: file("windows-arm64.msi"), + }, + ], + }, + { + label: "macos", + icon: "i-tabler:brand-apple-filled", + binaries: [ + { + ext: "dmg", + arch: "x64", + size: file_size("darwin-x64.dmg"), + link: file("darwin-x64.dmg"), + }, + { + ext: "dmg", + arch: "arm64", + size: file_size("darwin-aarch64.dmg"), + link: file("darwin-aarch64.dmg"), + }, + ], + }, + { + label: "linux", + icon: "i-mdi:linux", + binaries: [ + { + ext: "deb", + arch: "x64", + size: file_size("linux-amd64.deb"), + link: file("linux-amd64.deb"), + }, + { + ext: "deb", + arch: "arm64", + size: file_size("linux-arm64.deb"), + link: file("linux-arm64.deb"), + }, + { + ext: "rpm", + arch: "x64", + size: file_size("linux-x86_64.rpm"), + link: file("linux-x86_64.rpm"), + }, + { + ext: "rpm", + arch: "arm64", + size: file_size("linux-aarch64.rpm"), + link: file("linux-aarch64.rpm"), + }, + { + ext: "appimage", + arch: "x64", + size: file_size("linux-amd64.AppImage"), + link: file("linux-amd64.AppImage"), + }, + { + ext: "appimage", + arch: "arm64", + size: file_size("linux-aarch64.AppImage"), + link: file("linux-aarch64.AppImage"), + }, + ], + }, + { + label: "android", + icon: "i-mdi:android", + binaries: [ + { + ext: "apk", + arch: "arm64", + size: file_size("android-arm64.apk"), + link: file("android-arm64.apk"), + }, + { + ext: "apk", + arch: "armv7", + size: file_size("android-arm.apk"), + link: file("android-arm.apk"), + }, + ], + }, + { label: "IOS", icon: "i-mdi:apple-ios", binaries: [] }, +]; diff --git a/apps/site/src/lib/gh_api.ts b/apps/site/src/lib/gh_api.ts index 312a747..009cda3 100644 --- a/apps/site/src/lib/gh_api.ts +++ b/apps/site/src/lib/gh_api.ts @@ -18,3 +18,17 @@ export async function call_gh_api(path?: string) { ); return await res.json(); } + +export function get_total_downloads(data: any): number { + return Array.isArray(data) + ? data.reduce( + (acc, release) => + acc + + release.assets.reduce( + (sum: number, asset: any) => sum + asset.download_count, + 0, + ), + 0, + ) + : 0; +} diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index 5d713f2..c13172b 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -3,7 +3,9 @@ import SiteLayout from "@/layout/SiteLayout.astro"; import PagetopBG from "@/components/common/pagetop_background.html"; import DownloadBtnHeadless from "@/components/common/download_button_headless.svelte"; import type { PageMetadata } from "@/types"; -import { file, call_gh_api, owner, repo } from "@/lib/gh_api.ts"; +import { call_gh_api, get_total_downloads, owner, repo } from "@/lib/gh_api.ts"; +import { platforms } from "@/lib/download_links.ts"; +import prettyBytes from "pretty-bytes"; let metadata: PageMetadata = { title: "Downloads", @@ -20,68 +22,9 @@ let metadata: PageMetadata = { "Native performance on every platform. Markdown native, offline-first, and completely private.", }, }; -type Platform = { - label: string; - icon: string; - binaries: { label: string; link: string }[]; -}; - -let platforms: Platform[] = [ - { - label: "windows", - icon: "i-tabler:brand-windows-filled", - binaries: [ - { label: "EXE x64 (Installer)", link: file("windows-x64.exe") }, - { label: "EXE arm64 (Installer)", link: file("windows-arm64.exe") }, - { label: "MSI x64 (Installer)", link: file("windows-x64.msi") }, - { label: "MSI arm64 (Installer)", link: file("windows-arm64.msi") }, - ], - }, - { - label: "macos", - icon: "i-tabler:brand-apple-filled", - binaries: [ - { label: "DMG (x64)", link: file("darwin-x64.dmg") }, - { label: "DMG (Apple Silicon)", link: file("darwin-aarch64.dmg") }, - ], - }, - { - label: "linux", - icon: "i-mdi:linux", - binaries: [ - { label: "Deb x86_64", link: file("linux-amd64.deb") }, - { label: "Deb arm64", link: file("linux-arm64.deb") }, - { label: "Rpm x86_64", link: file("linux-x86_64.rpm") }, - { label: "Rpm arm64", link: file("linux-aarch64.rpm") }, - { label: "AppImage x86_64", link: file("linux-amd64.AppImage") }, - { label: "AppImage arm64", link: file("linux-aarch64.AppImage") }, - ], - }, - { - label: "android", - icon: "i-mdi:android", - binaries: [ - { label: "APK (aarch64)", link: file("android-arm64.apk") }, - { label: "APK (armv7)", link: file("android-arm.apk") }, - ], - }, - { label: "IOS", icon: "i-mdi:apple-ios", binaries: [] }, -]; -const get_total_downloads = (data: any): number => - Array.isArray(data) - ? data.reduce( - (acc, release) => - acc + - release.assets.reduce( - (sum: number, asset: any) => sum + asset.download_count, - 0, - ), - 0, - ) - : 0; -const releases_info = await call_gh_api("/releases"); -const download_count_server = get_total_downloads(releases_info); +const gh_releases_metadata = await call_gh_api("/releases"); +const download_count_server = get_total_downloads(gh_releases_metadata); --- @@ -131,13 +74,23 @@ const download_count_server = get_total_downloads(releases_info); (!binaries.length && (

No Build for {label} Available for now

))} - {binaries.map(({ label: text, link }) => ( + {binaries.map(({ ext, arch, size, link }) => ( - {text} -
+

{ext}

+

+ {arch} +

+ {size && ( +

+ {prettyBytes(size)} +

+ )} + +
+ ))}
From 299b05487bcef71265e2b44e782e0d874c9dec4d Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Sat, 7 Feb 2026 23:21:42 +0530 Subject: [PATCH 02/10] feat(site): implement real-time download counter increments and improve fetch resilience --- .../common/download_button_headless.svelte | 4 +-- apps/site/src/pages/downloads.astro | 27 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/site/src/components/common/download_button_headless.svelte b/apps/site/src/components/common/download_button_headless.svelte index 165d77a..1b5f4b5 100644 --- a/apps/site/src/components/common/download_button_headless.svelte +++ b/apps/site/src/components/common/download_button_headless.svelte @@ -74,7 +74,7 @@ diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index c13172b..c1665be 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -49,7 +49,7 @@ const download_count_server = get_total_downloads(gh_releases_metadata);
OR
From d81cfd4d032a61640d161917f27c0f51b7e63a86 Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Sun, 8 Feb 2026 22:17:11 +0530 Subject: [PATCH 03/10] fix(deps): sync tauri api vfersion with rust crate --- bun.lock | 21 ++++++++++++++++++++- package.json | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index f583fa3..d5b370f 100644 --- a/bun.lock +++ b/bun.lock @@ -14,6 +14,7 @@ "@lezer/markdown": "^1.6.3", "@prosemark/core": "^0.0.4", "@prosemark/render-html": "^0.0.5", + "@tauri-apps/api": "^2.10.1", }, "devDependencies": { "prettier": "^3.7.4", @@ -362,7 +363,7 @@ "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.2", "", { "dependencies": { "obug": "^2.1.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig=="], - "@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="], "@tauri-apps/cli": ["@tauri-apps/cli@2.9.6", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.9.6", "@tauri-apps/cli-darwin-x64": "2.9.6", "@tauri-apps/cli-linux-arm-gnueabihf": "2.9.6", "@tauri-apps/cli-linux-arm64-gnu": "2.9.6", "@tauri-apps/cli-linux-arm64-musl": "2.9.6", "@tauri-apps/cli-linux-riscv64-gnu": "2.9.6", "@tauri-apps/cli-linux-x64-gnu": "2.9.6", "@tauri-apps/cli-linux-x64-musl": "2.9.6", "@tauri-apps/cli-win32-arm64-msvc": "2.9.6", "@tauri-apps/cli-win32-ia32-msvc": "2.9.6", "@tauri-apps/cli-win32-x64-msvc": "2.9.6" }, "bin": { "tauri": "tauri.js" } }, "sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw=="], @@ -870,16 +871,34 @@ "@babel/template/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], + "@saurl/tauri-plugin-safe-area-insets-css-api/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-clipboard-manager/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-dialog/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-fs/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-opener/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-os/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + + "@tauri-apps/plugin-store/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], "@unocss/cli/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "@unocss/vite/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + "cherit/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + "data-urls/whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "tauri-plugin-android-fs-api/@tauri-apps/api": ["@tauri-apps/api@2.9.1", "", {}, "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw=="], + "@unocss/cli/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "@unocss/vite/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], diff --git a/package.json b/package.json index 791a6f0..c83cb42 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@codemirror/view": "^6.39.11", "@lezer/markdown": "^1.6.3", "@prosemark/core": "^0.0.4", - "@prosemark/render-html": "^0.0.5" + "@prosemark/render-html": "^0.0.5", + "@tauri-apps/api": "^2.10.1" } } From 95f1d6b39b6305b651f6e6d9db20e935a760e11b Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Sun, 8 Feb 2026 22:18:19 +0530 Subject: [PATCH 04/10] feat(site): enhance downloads page with version display and layout refinements --- apps/site/src/lib/download_links.ts | 4 +- apps/site/src/pages/downloads.astro | 63 ++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/apps/site/src/lib/download_links.ts b/apps/site/src/lib/download_links.ts index 0afc062..da0b260 100644 --- a/apps/site/src/lib/download_links.ts +++ b/apps/site/src/lib/download_links.ts @@ -11,7 +11,9 @@ type Platform = { link: string; }[]; }; -const gh_relases_latest_metadata = (await call_gh_api("/releases/latest")) as { +export const gh_relases_latest_metadata = (await call_gh_api( + "/releases/latest", +)) as { assets: { name: string; size: number }[]; }; diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index c1665be..6aab2ea 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -4,8 +4,10 @@ import PagetopBG from "@/components/common/pagetop_background.html"; import DownloadBtnHeadless from "@/components/common/download_button_headless.svelte"; import type { PageMetadata } from "@/types"; import { call_gh_api, get_total_downloads, owner, repo } from "@/lib/gh_api.ts"; -import { platforms } from "@/lib/download_links.ts"; +import { platforms, gh_relases_latest_metadata } from "@/lib/download_links.ts"; import prettyBytes from "pretty-bytes"; +import { Image } from "astro:assets"; +import logo from "@/assets/images/logo_500.png"; let metadata: PageMetadata = { title: "Downloads", @@ -30,19 +32,52 @@ const download_count_server = get_total_downloads(gh_releases_metadata);

Downloads

-
-
-
Total Downloads
-
- - - +
+
+
+

Version

+ +
+ Logo + + { + gh_relases_latest_metadata.tag_name.substring( + gh_relases_latest_metadata.tag_name.search(/\d/), + ) + } +
+
+
+

+ Total Downloads +

+ +
+ + + +
+
+
+
-
Downloads all time
@@ -58,7 +93,7 @@ const download_count_server = get_total_downloads(gh_releases_metadata); { platforms.map(({ label, icon, binaries }, i) => ( <> -
@@ -58,7 +58,7 @@ let { class: classes } = Astro.props; 4 MB
-

+

Rust Core + Native UI WebView

diff --git a/apps/site/src/components/navbar/interactive.svelte b/apps/site/src/components/navbar/interactive.svelte index 238ed9c..87f3780 100644 --- a/apps/site/src/components/navbar/interactive.svelte +++ b/apps/site/src/components/navbar/interactive.svelte @@ -55,7 +55,7 @@
diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index 6aab2ea..24c6b31 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -51,7 +51,7 @@ const download_count_server = get_total_downloads(gh_releases_metadata); slot="logo" loading="eager" /> - + { gh_relases_latest_metadata.tag_name.substring( gh_relases_latest_metadata.tag_name.search(/\d/), @@ -66,10 +66,10 @@ const download_count_server = get_total_downloads(gh_releases_metadata);

From 0d7957bb67b218e6a72b3766358f215bf47df3af Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Tue, 10 Feb 2026 00:01:25 +0530 Subject: [PATCH 09/10] fix(site): download count animation didn't play on page navigation --- apps/site/src/pages/downloads.astro | 52 ++++++++++++++++------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index 963bef1..d6da8ed 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -153,30 +153,36 @@ const download_count_server = get_total_downloads(gh_releases_metadata); ) : 0; - const download_count_elem = document.getElementById("downloads_count"); - if (!download_count_elem) return; - let download_count = 0; - - fetch(`https://api.github.com/repos/${owner}/${repo}/releases`) - .then((v) => v.json()) - .then((releases_info) => { - download_count += get_total_downloads(releases_info); - if (download_count) { - download_count_elem.style.setProperty("--value", download_count); - } else { + function on_load() { + const download_count_elem = document.getElementById("downloads_count"); + if (!download_count_elem) return; + let download_count = 0; + fetch(`https://api.github.com/repos/${owner}/${repo}/releases`) + .then((v) => v.json()) + .then((releases_info) => { + download_count += get_total_downloads(releases_info); + if (download_count) { + download_count_elem.style.setProperty("--value", download_count); + } else { + download_count = download_count_server; + download_count_elem.style.setProperty( + "--value", + download_count_server, + ); + } + }) + .catch(() => { download_count = download_count_server; download_count_elem.style.setProperty("--value", download_count_server); - } - }) - .catch(() => { - download_count = download_count_server; - download_count_elem.style.setProperty("--value", download_count_server); - }); - const buttons = document.querySelectorAll(".download-btn"); - buttons.forEach((btn) => { - btn.addEventListener("click", () => { - download_count++; - download_count_elem.style.setProperty("--value", download_count); + }); + const buttons = document.querySelectorAll(".download-btn"); + buttons.forEach((btn) => { + btn.addEventListener("click", () => { + download_count++; + download_count_elem.style.setProperty("--value", download_count); + }); }); - }); + } + + document.addEventListener("astro:page-load", on_load); From 46503151441f96765551642c5207d6601fc38dfd Mon Sep 17 00:00:00 2001 From: keshav-writes-code Date: Tue, 10 Feb 2026 00:01:45 +0530 Subject: [PATCH 10/10] fix(site): add small responsivness styles to download page elements --- apps/site/src/pages/downloads.astro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/site/src/pages/downloads.astro b/apps/site/src/pages/downloads.astro index d6da8ed..dc80bf5 100644 --- a/apps/site/src/pages/downloads.astro +++ b/apps/site/src/pages/downloads.astro @@ -48,7 +48,7 @@ const download_count_server = get_total_downloads(gh_releases_metadata); width={25} height={25} src={logo} - class="size-25px" + class="size-25px lt-sm:size-20px" alt="Logo" slot="logo" loading="eager" @@ -67,7 +67,7 @@ const download_count_server = get_total_downloads(gh_releases_metadata); Total Downloads

-
+
{size && ( - {prettyBytes(size)}

+ {prettyBytes(size, { maximumFractionDigits: 1 })}

)}