@grove-dev/astro 0.2.10 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/display.d.ts +11 -17
- package/dist/lib/display.d.ts.map +1 -1
- package/dist/lib/display.js +43 -43
- package/dist/lib/display.js.map +1 -1
- package/dist/lib/format.d.ts +6 -7
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +11 -12
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/lenses.d.ts +35 -73
- package/dist/lib/lenses.d.ts.map +1 -1
- package/dist/lib/lenses.js +144 -126
- package/dist/lib/lenses.js.map +1 -1
- package/dist/lib/repo.d.ts +11 -22
- package/dist/lib/repo.d.ts.map +1 -1
- package/dist/lib/repo.js +12 -25
- package/dist/lib/repo.js.map +1 -1
- package/dist/lib/scores.d.ts +15 -16
- package/dist/lib/scores.d.ts.map +1 -1
- package/dist/lib/scores.js +4 -11
- package/dist/lib/scores.js.map +1 -1
- package/dist/lib/search.d.ts +47 -129
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +195 -180
- package/dist/lib/search.js.map +1 -1
- package/dist/lib/taxonomy-counts.d.ts +7 -21
- package/dist/lib/taxonomy-counts.d.ts.map +1 -1
- package/dist/lib/taxonomy-counts.js +12 -31
- package/dist/lib/taxonomy-counts.js.map +1 -1
- package/package.json +4 -4
- package/src/components/AppsIndexRow.astro +55 -184
- package/src/components/AppsPagination.astro +45 -108
- package/src/components/CategoryGrid.astro +43 -31
- package/src/components/ContributorsGrid.astro +3 -3
- package/src/components/CurationGrid.astro +41 -0
- package/src/components/ExploreByStack.astro +6 -0
- package/src/components/FilterGroupMenu.astro +49 -0
- package/src/components/FilterOptions.astro +44 -0
- package/src/components/Hero.astro +198 -147
- package/src/components/Icon.astro +10 -3
- package/src/components/ItemCard.astro +266 -248
- package/src/components/RecordSection.astro +68 -33
- package/src/components/RefinePanel.astro +115 -141
- package/src/components/StackGrid.astro +32 -24
- package/src/components/WhyThisExists.astro +32 -32
- package/src/layouts/BaseLayout.astro +104 -49
- package/src/layouts/Container.astro +5 -44
- package/src/layouts/Footer.astro +31 -20
- package/src/layouts/Header.astro +40 -19
- package/src/layouts/SectionHeader.astro +27 -43
- package/src/layouts/Seo.astro +38 -56
- package/src/layouts/ThemeToggle.astro +35 -48
- package/src/lib/display.ts +46 -53
- package/src/lib/format.ts +11 -12
- package/src/lib/lenses.ts +151 -172
- package/src/lib/repo.ts +16 -28
- package/src/lib/scores.ts +15 -19
- package/src/lib/search.ts +222 -290
- package/src/lib/taxonomy-counts.ts +12 -46
- package/src/styles.css +207 -1
- package/templates/default/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
- package/templates/default/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/templates/default/.github/ISSUE_TEMPLATE/record_submission.md +48 -0
- package/templates/default/.github/pull_request_template.md +27 -0
- package/templates/default/.github/workflows/build.yml +55 -0
- package/templates/default/.github/workflows/cleanup-stale-records.yml +48 -0
- package/templates/default/.github/workflows/daily-refresh.yml +53 -0
- package/templates/default/.github/workflows/sync-contributors.yml +53 -0
- package/templates/default/.github/workflows/sync-github-metadata.yml +58 -0
- package/templates/default/.github/workflows/validate-data.yml +35 -0
- package/templates/default/data/records/coolify.yml +46 -0
- package/templates/default/data/records/gitea.yml +46 -0
- package/templates/default/data/records/hoppscotch.yml +47 -0
- package/templates/default/data/records/inventree.yml +47 -0
- package/templates/default/data/records/label-studio.yml +46 -0
- package/templates/default/data/records/logseq.yml +48 -0
- package/templates/default/data/records/private-gpt.yml +47 -0
- package/templates/default/data/records/wakapi.yml +44 -0
- package/templates/default/data/taxonomy/categories.yml +47 -0
- package/templates/default/data/taxonomy/distribution-channels.yml +43 -0
- package/templates/default/data/taxonomy/platforms.yml +27 -0
- package/templates/default/data/taxonomy/stacks.yml +41 -0
- package/templates/default/grove.config.ts +1 -1
- package/templates/default/package.json +5 -4
- package/templates/default/public/icons/stacks/bun.svg +1 -0
- package/templates/default/public/icons/stacks/clojure.svg +1 -0
- package/templates/default/public/icons/stacks/clojurescript.svg +1 -0
- package/templates/default/public/icons/stacks/deno.svg +1 -0
- package/templates/default/public/icons/stacks/django.svg +1 -0
- package/templates/default/public/icons/stacks/docker.svg +1 -0
- package/templates/default/public/icons/stacks/go.svg +1 -0
- package/templates/default/public/icons/stacks/llm.svg +1 -0
- package/templates/default/public/icons/stacks/node.js.svg +1 -0
- package/templates/default/public/icons/stacks/sveltekit.svg +1 -0
- package/templates/default/public/icons/stacks/vue.svg +1 -0
- package/templates/default/public/llms-full.txt +197 -5
- package/templates/default/public/llms.txt +107 -6
- package/templates/default/public/sitemap.xml +63 -0
- package/templates/default/scripts/build-llms.mjs +123 -0
- package/templates/default/scripts/build-records-json.mjs +27 -0
- package/templates/default/scripts/build-sitemap.mjs +20 -0
- package/templates/default/scripts/cleanup-stale-records.mjs +20 -0
- package/templates/default/scripts/enrich-github-metadata.mjs +99 -0
- package/templates/default/scripts/fetch-icons.mjs +137 -0
- package/templates/default/scripts/migrate-legacy-to-schema-v1.mjs +86 -0
- package/templates/default/scripts/parse-legacy-readme.mjs +59 -0
- package/templates/default/scripts/refresh-records-activity.mjs +24 -0
- package/templates/default/scripts/repair-license-format.mjs +72 -0
- package/templates/default/scripts/report-cleanup-candidates.mjs +21 -0
- package/templates/default/scripts/seed-from-github.mjs +62 -0
- package/templates/default/scripts/sync-contributors.mjs +145 -0
- package/templates/default/scripts/sync-github-metadata.mjs +28 -0
- package/templates/default/scripts/validate-records.mjs +27 -0
- package/templates/default/src/data/records.ts +134 -51
- package/templates/default/src/pages/404.astro +64 -0
- package/templates/default/src/pages/{projects/[slug].astro → [slug]/[itemSlug].astro} +236 -66
- package/templates/default/src/pages/[slug]/index.astro +476 -0
- package/templates/default/src/pages/about.astro +165 -82
- package/templates/default/src/pages/apps/[itemSlug].astro +301 -0
- package/templates/default/src/pages/apps/index.astro +146 -0
- package/templates/default/src/pages/contributors.astro +184 -0
- package/templates/default/src/pages/index.astro +119 -162
- package/templates/default/src/pages/submit.astro +276 -114
- package/templates/default/wrangler.jsonc +28 -0
- package/LICENSE +0 -21
- package/templates/default/.astro/content.d.ts +0 -155
- package/templates/default/.astro/settings.json +0 -5
- package/templates/default/.astro/types.d.ts +0 -1
- package/templates/default/data/generated/apps.json +0 -1
- package/templates/default/data/generated/records.full.json +0 -8
- package/templates/default/data/generated/records.index.json +0 -7
- package/templates/default/data/generated/records.json +0 -8
- package/templates/default/data/generated/repo-stats.json +0 -1
- package/templates/default/data/generated/site-config.json +0 -31
- package/templates/default/dist/_astro/BaseLayout.Dz_HR-68.css +0 -1
- package/templates/default/dist/about/index.html +0 -165
- package/templates/default/dist/icons/platforms/android.svg +0 -1
- package/templates/default/dist/icons/platforms/apple-dark.svg +0 -1
- package/templates/default/dist/icons/platforms/apple-light.svg +0 -1
- package/templates/default/dist/icons/platforms/chrome.svg +0 -1
- package/templates/default/dist/icons/platforms/chromeos.svg +0 -5
- package/templates/default/dist/icons/platforms/desktop.svg +0 -4
- package/templates/default/dist/icons/platforms/embedded.svg +0 -5
- package/templates/default/dist/icons/platforms/ios.svg +0 -1
- package/templates/default/dist/icons/platforms/linux.svg +0 -1
- package/templates/default/dist/icons/platforms/macos.svg +0 -1
- package/templates/default/dist/icons/platforms/ubuntu.svg +0 -1
- package/templates/default/dist/icons/platforms/web.svg +0 -5
- package/templates/default/dist/icons/platforms/windows.svg +0 -6
- package/templates/default/dist/icons/stacks/android.svg +0 -1
- package/templates/default/dist/icons/stacks/apple-dark.svg +0 -1
- package/templates/default/dist/icons/stacks/apple-light.svg +0 -1
- package/templates/default/dist/icons/stacks/capacitor.svg +0 -14
- package/templates/default/dist/icons/stacks/dart.svg +0 -1
- package/templates/default/dist/icons/stacks/firebase.svg +0 -1
- package/templates/default/dist/icons/stacks/flutter.svg +0 -1
- package/templates/default/dist/icons/stacks/graphql.svg +0 -1
- package/templates/default/dist/icons/stacks/ionic.svg +0 -4
- package/templates/default/dist/icons/stacks/java.svg +0 -1
- package/templates/default/dist/icons/stacks/javascript.svg +0 -1
- package/templates/default/dist/icons/stacks/kotlin.svg +0 -1
- package/templates/default/dist/icons/stacks/mongodb.svg +0 -1
- package/templates/default/dist/icons/stacks/nodejs.svg +0 -1
- package/templates/default/dist/icons/stacks/python.svg +0 -1
- package/templates/default/dist/icons/stacks/react-native.svg +0 -1
- package/templates/default/dist/icons/stacks/react.svg +0 -1
- package/templates/default/dist/icons/stacks/rust.svg +0 -1
- package/templates/default/dist/icons/stacks/solidity.svg +0 -1
- package/templates/default/dist/icons/stacks/swift.svg +0 -1
- package/templates/default/dist/icons/stacks/tensorflow.svg +0 -1
- package/templates/default/dist/icons/stacks/typescript.svg +0 -1
- package/templates/default/dist/index.html +0 -55
- package/templates/default/dist/llms-full.txt +0 -14
- package/templates/default/dist/llms.txt +0 -11
- package/templates/default/dist/og-image.svg +0 -48
- package/templates/default/dist/projects/index.html +0 -61
- package/templates/default/dist/robots.txt +0 -53
- package/templates/default/dist/sitemap.xml +0 -21
- package/templates/default/dist/submit/index.html +0 -69
- package/templates/default/node_modules/.bin/astro +0 -21
- package/templates/default/node_modules/.bin/astro-check +0 -21
- package/templates/default/node_modules/.bin/grove +0 -21
- package/templates/default/node_modules/.bin/jiti +0 -21
- package/templates/default/node_modules/.bin/prettier +0 -21
- package/templates/default/node_modules/.bin/rollup +0 -21
- package/templates/default/node_modules/.bin/tsc +0 -21
- package/templates/default/node_modules/.bin/tsserver +0 -21
- package/templates/default/node_modules/.bin/tsx +0 -21
- package/templates/default/node_modules/.bin/vite +0 -21
- package/templates/default/node_modules/.bin/yaml +0 -21
- package/templates/default/node_modules/.vite/deps/_metadata.json +0 -79
- package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js +0 -433
- package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/astro___aria-query.js +0 -5
- package/templates/default/node_modules/.vite/deps/astro___aria-query.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/astro___axobject-query.js +0 -5
- package/templates/default/node_modules/.vite/deps/astro___axobject-query.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/astro___html-escaper.js +0 -9
- package/templates/default/node_modules/.vite/deps/astro___html-escaper.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +0 -241
- package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js +0 -1592
- package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js +0 -30
- package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js +0 -186
- package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js +0 -48
- package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js +0 -6779
- package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js +0 -33
- package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js +0 -88
- package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js +0 -72
- package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js +0 -3757
- package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js +0 -54
- package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/package.json +0 -3
- package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js +0 -213
- package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js +0 -525
- package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js +0 -1020
- package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js.map +0 -7
- package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js +0 -147
- package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js.map +0 -7
- package/templates/default/src/components/layout/BaseLayout.astro +0 -47
- package/templates/default/src/components/layout/Container.astro +0 -18
- package/templates/default/src/components/layout/Footer.astro +0 -27
- package/templates/default/src/components/layout/Header.astro +0 -43
- package/templates/default/src/lib/markdown.ts +0 -171
- package/templates/default/src/pages/projects/index.astro +0 -193
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Sync GitHub metadata
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
# Weekly — Sunday 03:00 UTC. Off-hours so PR validation has the
|
|
6
|
+
# freshest metadata by Monday morning.
|
|
7
|
+
- cron: "0 3 * * 0"
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
# Run on push to data/records/** so curators see fresh stars/forks
|
|
10
|
+
# without waiting for the weekly cron.
|
|
11
|
+
push:
|
|
12
|
+
branches: [main]
|
|
13
|
+
paths:
|
|
14
|
+
- "data/records/**"
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
sync:
|
|
18
|
+
name: grove sync github
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
timeout-minutes: 20
|
|
21
|
+
permissions:
|
|
22
|
+
contents: write
|
|
23
|
+
pull-requests: write
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- uses: pnpm/action-setup@v4
|
|
28
|
+
with:
|
|
29
|
+
version: 10
|
|
30
|
+
|
|
31
|
+
- uses: actions/setup-node@v4
|
|
32
|
+
with:
|
|
33
|
+
node-version: 20
|
|
34
|
+
cache: pnpm
|
|
35
|
+
|
|
36
|
+
- name: Install dependencies
|
|
37
|
+
run: pnpm install --frozen-lockfile
|
|
38
|
+
|
|
39
|
+
- name: Sync GitHub metadata
|
|
40
|
+
env:
|
|
41
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
+
# `grove sync github` walks every record, fetches stars/forks/
|
|
43
|
+
# activity from the GitHub API, and writes a `github` block
|
|
44
|
+
# back into each record's YAML. Falls back to HTML scraping
|
|
45
|
+
# when the API rate-limits.
|
|
46
|
+
run: pnpm exec grove sync github
|
|
47
|
+
|
|
48
|
+
- name: Open PR if records changed
|
|
49
|
+
uses: peter-evans/create-pull-request@v6
|
|
50
|
+
with:
|
|
51
|
+
commit-message: "chore(data): sync GitHub metadata"
|
|
52
|
+
title: "Weekly GitHub metadata sync"
|
|
53
|
+
body: |
|
|
54
|
+
Automated weekly sync of stars, forks, activity, and topics
|
|
55
|
+
for every record. Generated by the `sync-github-metadata`
|
|
56
|
+
workflow.
|
|
57
|
+
branch: chore/sync-github-metadata
|
|
58
|
+
delete-branch: true
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Validate data
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
validate:
|
|
11
|
+
name: grove validate
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
timeout-minutes: 5
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- uses: pnpm/action-setup@v4
|
|
18
|
+
with:
|
|
19
|
+
version: 10
|
|
20
|
+
|
|
21
|
+
- uses: actions/setup-node@v4
|
|
22
|
+
with:
|
|
23
|
+
node-version: 20
|
|
24
|
+
cache: pnpm
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: pnpm install --frozen-lockfile
|
|
28
|
+
|
|
29
|
+
- name: Validate records
|
|
30
|
+
# `grove validate` checks every records/*.yml against the
|
|
31
|
+
# blueprint schema, plus decisions.yml, taxonomy, and the
|
|
32
|
+
# health block. --strict fails on warnings, used on the
|
|
33
|
+
# main branch but not on PRs (where external contributors
|
|
34
|
+
# may have minor warnings we'd rather flag than block).
|
|
35
|
+
run: pnpm exec grove validate
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Coolify
|
|
3
|
+
slug: coolify
|
|
4
|
+
description: Open-source, self-hostable Heroku / Netlify / Vercel alternative — deploy apps and databases from a single dashboard.
|
|
5
|
+
category: DevOps
|
|
6
|
+
tags:
|
|
7
|
+
- self-host
|
|
8
|
+
- paas
|
|
9
|
+
- deployment
|
|
10
|
+
- svelte
|
|
11
|
+
stack: SvelteKit
|
|
12
|
+
stacks:
|
|
13
|
+
- SvelteKit
|
|
14
|
+
- Node.js
|
|
15
|
+
- Docker
|
|
16
|
+
platforms:
|
|
17
|
+
- linux
|
|
18
|
+
- self-host
|
|
19
|
+
projectType: real-app
|
|
20
|
+
difficulty: intermediate
|
|
21
|
+
codebaseSize: large
|
|
22
|
+
repoUrl: https://github.com/coollabsio/coolify
|
|
23
|
+
links:
|
|
24
|
+
github: https://github.com/coollabsio/coolify
|
|
25
|
+
website: https://coolify.io
|
|
26
|
+
bestFor:
|
|
27
|
+
- Self-hosted PaaS
|
|
28
|
+
- VPS deployments
|
|
29
|
+
- Docker-based stacks
|
|
30
|
+
whyListed:
|
|
31
|
+
- One-click app + DB deploys
|
|
32
|
+
- Active dev
|
|
33
|
+
- Clear upgrade path from manual Docker
|
|
34
|
+
caveats: []
|
|
35
|
+
distribution:
|
|
36
|
+
channels: []
|
|
37
|
+
source:
|
|
38
|
+
type: manual
|
|
39
|
+
curation:
|
|
40
|
+
reviewed: true
|
|
41
|
+
reviewedBy: grove-bot
|
|
42
|
+
reviewedAt: "2026-06-13"
|
|
43
|
+
labels:
|
|
44
|
+
- hot
|
|
45
|
+
lenses: []
|
|
46
|
+
visibility: keep
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Gitea
|
|
3
|
+
slug: gitea
|
|
4
|
+
description: Lightweight, self-hosted Git service — painless, single-binary, low-resource alternative to GitHub.
|
|
5
|
+
category: DevOps
|
|
6
|
+
tags:
|
|
7
|
+
- git
|
|
8
|
+
- forge
|
|
9
|
+
- self-host
|
|
10
|
+
- go
|
|
11
|
+
stack: Go
|
|
12
|
+
stacks:
|
|
13
|
+
- Go
|
|
14
|
+
- Vue
|
|
15
|
+
platforms:
|
|
16
|
+
- linux
|
|
17
|
+
- self-host
|
|
18
|
+
- docker
|
|
19
|
+
projectType: real-app
|
|
20
|
+
difficulty: intermediate
|
|
21
|
+
codebaseSize: large
|
|
22
|
+
repoUrl: https://github.com/go-gitea/gitea
|
|
23
|
+
links:
|
|
24
|
+
github: https://github.com/go-gitea/gitea
|
|
25
|
+
website: https://about.gitea.com
|
|
26
|
+
bestFor:
|
|
27
|
+
- Self-hosted Git hosting
|
|
28
|
+
- Lightweight CI/CD integration
|
|
29
|
+
- Internal team forges
|
|
30
|
+
whyListed:
|
|
31
|
+
- Single binary, easy install
|
|
32
|
+
- Mature, stable releases
|
|
33
|
+
- Active community
|
|
34
|
+
caveats: []
|
|
35
|
+
distribution:
|
|
36
|
+
channels: []
|
|
37
|
+
source:
|
|
38
|
+
type: manual
|
|
39
|
+
curation:
|
|
40
|
+
reviewed: true
|
|
41
|
+
reviewedBy: grove-bot
|
|
42
|
+
reviewedAt: "2026-06-13"
|
|
43
|
+
labels:
|
|
44
|
+
- mature
|
|
45
|
+
lenses: []
|
|
46
|
+
visibility: keep
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Hoppscotch
|
|
3
|
+
slug: hoppscotch
|
|
4
|
+
description: Open-source API development ecosystem — design, test, and debug APIs faster from a single interface.
|
|
5
|
+
category: Web
|
|
6
|
+
tags:
|
|
7
|
+
- api
|
|
8
|
+
- testing
|
|
9
|
+
- developer-tools
|
|
10
|
+
- vue
|
|
11
|
+
stack: Vue
|
|
12
|
+
stacks:
|
|
13
|
+
- Vue
|
|
14
|
+
- TypeScript
|
|
15
|
+
- GraphQL
|
|
16
|
+
platforms:
|
|
17
|
+
- web
|
|
18
|
+
- desktop
|
|
19
|
+
- self-host
|
|
20
|
+
projectType: real-app
|
|
21
|
+
difficulty: beginner
|
|
22
|
+
codebaseSize: large
|
|
23
|
+
repoUrl: https://github.com/hoppscotch/hoppscotch
|
|
24
|
+
links:
|
|
25
|
+
github: https://github.com/hoppscotch/hoppscotch
|
|
26
|
+
website: https://hoppscotch.io
|
|
27
|
+
bestFor:
|
|
28
|
+
- API exploration
|
|
29
|
+
- REST/GraphQL/WebSocket testing
|
|
30
|
+
- Self-hosted team workflows
|
|
31
|
+
whyListed:
|
|
32
|
+
- Lightweight, fast UI
|
|
33
|
+
- PWA + desktop builds
|
|
34
|
+
- Open-source Postman/Insomnia alternative
|
|
35
|
+
caveats: []
|
|
36
|
+
distribution:
|
|
37
|
+
channels: []
|
|
38
|
+
source:
|
|
39
|
+
type: manual
|
|
40
|
+
curation:
|
|
41
|
+
reviewed: true
|
|
42
|
+
reviewedBy: grove-bot
|
|
43
|
+
reviewedAt: "2026-06-13"
|
|
44
|
+
labels:
|
|
45
|
+
- hot
|
|
46
|
+
lenses: []
|
|
47
|
+
visibility: keep
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: InvenTree
|
|
3
|
+
slug: inventree
|
|
4
|
+
description: Open-source inventory management system with parts, stock, and purchase orders.
|
|
5
|
+
category: Mobile
|
|
6
|
+
tags:
|
|
7
|
+
- inventory
|
|
8
|
+
- stock
|
|
9
|
+
- mobile
|
|
10
|
+
- dart
|
|
11
|
+
- flutter
|
|
12
|
+
stack: Flutter
|
|
13
|
+
stacks:
|
|
14
|
+
- Flutter
|
|
15
|
+
- Dart
|
|
16
|
+
platforms:
|
|
17
|
+
- ios
|
|
18
|
+
- android
|
|
19
|
+
- web
|
|
20
|
+
projectType: real-app
|
|
21
|
+
difficulty: intermediate
|
|
22
|
+
codebaseSize: large
|
|
23
|
+
repoUrl: https://github.com/inventree/InvenTree
|
|
24
|
+
links:
|
|
25
|
+
github: https://github.com/inventree/InvenTree
|
|
26
|
+
website: https://inventree.org
|
|
27
|
+
bestFor:
|
|
28
|
+
- Inventory tracking
|
|
29
|
+
- Manufacturing
|
|
30
|
+
- Hardware projects
|
|
31
|
+
whyListed:
|
|
32
|
+
- Production-grade mobile + web stack
|
|
33
|
+
- Strong community
|
|
34
|
+
- Cleanly factored Dart codebase
|
|
35
|
+
caveats: []
|
|
36
|
+
distribution:
|
|
37
|
+
channels: []
|
|
38
|
+
source:
|
|
39
|
+
type: manual
|
|
40
|
+
curation:
|
|
41
|
+
reviewed: true
|
|
42
|
+
reviewedBy: grove-bot
|
|
43
|
+
reviewedAt: "2026-06-13"
|
|
44
|
+
labels:
|
|
45
|
+
- mature
|
|
46
|
+
lenses: []
|
|
47
|
+
visibility: keep
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Label Studio
|
|
3
|
+
slug: label-studio
|
|
4
|
+
description: Open-source data labeling platform — annotate images, text, audio, video, and time series for ML training.
|
|
5
|
+
category: AI/ML
|
|
6
|
+
tags:
|
|
7
|
+
- labeling
|
|
8
|
+
- ml-ops
|
|
9
|
+
- annotation
|
|
10
|
+
- python
|
|
11
|
+
stack: Python
|
|
12
|
+
stacks:
|
|
13
|
+
- Python
|
|
14
|
+
- Django
|
|
15
|
+
- React
|
|
16
|
+
platforms:
|
|
17
|
+
- web
|
|
18
|
+
- self-host
|
|
19
|
+
projectType: real-app
|
|
20
|
+
difficulty: intermediate
|
|
21
|
+
codebaseSize: large
|
|
22
|
+
repoUrl: https://github.com/HumanSignal/label-studio
|
|
23
|
+
links:
|
|
24
|
+
github: https://github.com/HumanSignal/label-studio
|
|
25
|
+
website: https://labelstud.io
|
|
26
|
+
bestFor:
|
|
27
|
+
- ML dataset labeling
|
|
28
|
+
- Multi-modal annotation
|
|
29
|
+
- Active learning pipelines
|
|
30
|
+
whyListed:
|
|
31
|
+
- Mature, production-grade
|
|
32
|
+
- Strong ML backend
|
|
33
|
+
- Active commercial + community backing
|
|
34
|
+
caveats: []
|
|
35
|
+
distribution:
|
|
36
|
+
channels: []
|
|
37
|
+
source:
|
|
38
|
+
type: manual
|
|
39
|
+
curation:
|
|
40
|
+
reviewed: true
|
|
41
|
+
reviewedBy: grove-bot
|
|
42
|
+
reviewedAt: "2026-06-13"
|
|
43
|
+
labels:
|
|
44
|
+
- mature
|
|
45
|
+
lenses: []
|
|
46
|
+
visibility: keep
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Logseq
|
|
3
|
+
slug: logseq
|
|
4
|
+
description: Privacy-first, open-source knowledge base that works on top of plain text Markdown and Org-mode files.
|
|
5
|
+
category: Web
|
|
6
|
+
tags:
|
|
7
|
+
- notes
|
|
8
|
+
- knowledge-base
|
|
9
|
+
- productivity
|
|
10
|
+
- clojure
|
|
11
|
+
stack: ClojureScript
|
|
12
|
+
stacks:
|
|
13
|
+
- ClojureScript
|
|
14
|
+
- Clojure
|
|
15
|
+
- JavaScript
|
|
16
|
+
platforms:
|
|
17
|
+
- web
|
|
18
|
+
- desktop
|
|
19
|
+
projectType: real-app
|
|
20
|
+
difficulty: intermediate
|
|
21
|
+
codebaseSize: huge
|
|
22
|
+
repoUrl: https://github.com/logseq/logseq
|
|
23
|
+
links:
|
|
24
|
+
github: https://github.com/logseq/logseq
|
|
25
|
+
website: https://logseq.com
|
|
26
|
+
bestFor:
|
|
27
|
+
- PKM (personal knowledge management)
|
|
28
|
+
- Local-first note taking
|
|
29
|
+
- Graph-based outliner
|
|
30
|
+
whyListed:
|
|
31
|
+
- Local-first with sync
|
|
32
|
+
- Active community
|
|
33
|
+
- Strong plugin ecosystem
|
|
34
|
+
caveats:
|
|
35
|
+
- Mobile app still maturing
|
|
36
|
+
distribution:
|
|
37
|
+
channels: []
|
|
38
|
+
source:
|
|
39
|
+
type: manual
|
|
40
|
+
curation:
|
|
41
|
+
reviewed: true
|
|
42
|
+
reviewedBy: grove-bot
|
|
43
|
+
reviewedAt: "2026-06-13"
|
|
44
|
+
labels:
|
|
45
|
+
- hot
|
|
46
|
+
- mature
|
|
47
|
+
lenses: []
|
|
48
|
+
visibility: keep
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: PrivateGPT
|
|
3
|
+
slug: private-gpt
|
|
4
|
+
description: Interact privately with your documents using LLMs — 100% private, no data leaves your execution environment.
|
|
5
|
+
category: AI/ML
|
|
6
|
+
tags:
|
|
7
|
+
- llm
|
|
8
|
+
- rag
|
|
9
|
+
- privacy
|
|
10
|
+
- python
|
|
11
|
+
stack: Python
|
|
12
|
+
stacks:
|
|
13
|
+
- Python
|
|
14
|
+
- LLM
|
|
15
|
+
- RAG
|
|
16
|
+
platforms:
|
|
17
|
+
- linux
|
|
18
|
+
- macos
|
|
19
|
+
- self-host
|
|
20
|
+
projectType: real-app
|
|
21
|
+
difficulty: intermediate
|
|
22
|
+
codebaseSize: medium
|
|
23
|
+
repoUrl: https://github.com/zylon-ai/private-gpt
|
|
24
|
+
links:
|
|
25
|
+
github: https://github.com/zylon-ai/private-gpt
|
|
26
|
+
bestFor:
|
|
27
|
+
- Private document Q&A
|
|
28
|
+
- Local LLM experimentation
|
|
29
|
+
- Enterprise privacy use cases
|
|
30
|
+
whyListed:
|
|
31
|
+
- Strict no-network mode
|
|
32
|
+
- Pluggable LLM providers
|
|
33
|
+
- Clean ingestion pipeline
|
|
34
|
+
caveats:
|
|
35
|
+
- GPU recommended for best results
|
|
36
|
+
distribution:
|
|
37
|
+
channels: []
|
|
38
|
+
source:
|
|
39
|
+
type: manual
|
|
40
|
+
curation:
|
|
41
|
+
reviewed: true
|
|
42
|
+
reviewedBy: grove-bot
|
|
43
|
+
reviewedAt: "2026-06-13"
|
|
44
|
+
labels:
|
|
45
|
+
- hot
|
|
46
|
+
lenses: []
|
|
47
|
+
visibility: keep
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
kind: project
|
|
2
|
+
name: Wakapi
|
|
3
|
+
slug: wakapi
|
|
4
|
+
description: Open-source time tracker for developers — coding stats, language breakdowns, and project-level metrics.
|
|
5
|
+
category: Mobile
|
|
6
|
+
tags:
|
|
7
|
+
- time-tracking
|
|
8
|
+
- analytics
|
|
9
|
+
- mobile
|
|
10
|
+
- kotlin
|
|
11
|
+
stack: Kotlin
|
|
12
|
+
stacks:
|
|
13
|
+
- Kotlin
|
|
14
|
+
- Android
|
|
15
|
+
platforms:
|
|
16
|
+
- android
|
|
17
|
+
projectType: real-app
|
|
18
|
+
difficulty: beginner
|
|
19
|
+
codebaseSize: medium
|
|
20
|
+
repoUrl: https://github.com/muety/wakapi
|
|
21
|
+
links:
|
|
22
|
+
github: https://github.com/muety/wakapi
|
|
23
|
+
website: https://wakapi.dev
|
|
24
|
+
bestFor:
|
|
25
|
+
- Personal coding stats
|
|
26
|
+
- WakaTime alternative
|
|
27
|
+
- Privacy-first telemetry
|
|
28
|
+
whyListed:
|
|
29
|
+
- Self-host friendly
|
|
30
|
+
- Companion mobile app
|
|
31
|
+
- Clean MVVM architecture
|
|
32
|
+
caveats: []
|
|
33
|
+
distribution:
|
|
34
|
+
channels: []
|
|
35
|
+
source:
|
|
36
|
+
type: manual
|
|
37
|
+
curation:
|
|
38
|
+
reviewed: true
|
|
39
|
+
reviewedBy: grove-bot
|
|
40
|
+
reviewedAt: "2026-06-13"
|
|
41
|
+
labels:
|
|
42
|
+
- new
|
|
43
|
+
lenses: []
|
|
44
|
+
visibility: keep
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
- id: productivity
|
|
2
|
+
name: Productivity
|
|
3
|
+
|
|
4
|
+
- id: finance
|
|
5
|
+
name: Finance
|
|
6
|
+
|
|
7
|
+
- id: education
|
|
8
|
+
name: Education
|
|
9
|
+
|
|
10
|
+
- id: tools
|
|
11
|
+
name: Tools
|
|
12
|
+
|
|
13
|
+
- id: communication
|
|
14
|
+
name: Communication
|
|
15
|
+
|
|
16
|
+
- id: health-and-fitness
|
|
17
|
+
name: Health and Fitness
|
|
18
|
+
|
|
19
|
+
- id: business
|
|
20
|
+
name: Business
|
|
21
|
+
|
|
22
|
+
- id: games
|
|
23
|
+
name: Games
|
|
24
|
+
|
|
25
|
+
- id: media
|
|
26
|
+
name: Media
|
|
27
|
+
|
|
28
|
+
- id: entertainment
|
|
29
|
+
name: Entertainment
|
|
30
|
+
|
|
31
|
+
- id: social-network
|
|
32
|
+
name: Social Network
|
|
33
|
+
|
|
34
|
+
- id: shopping
|
|
35
|
+
name: Shopping
|
|
36
|
+
|
|
37
|
+
- id: news
|
|
38
|
+
name: News and Magazine
|
|
39
|
+
|
|
40
|
+
- id: travel
|
|
41
|
+
name: Travel
|
|
42
|
+
|
|
43
|
+
- id: lifestyle
|
|
44
|
+
name: Lifestyle
|
|
45
|
+
|
|
46
|
+
- id: personalization
|
|
47
|
+
name: Personalization
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
- id: app-store
|
|
2
|
+
name: App Store
|
|
3
|
+
platforms: [ios, macos]
|
|
4
|
+
|
|
5
|
+
- id: play-store
|
|
6
|
+
name: Play Store
|
|
7
|
+
platforms: [android]
|
|
8
|
+
|
|
9
|
+
- id: fdroid
|
|
10
|
+
name: F-Droid
|
|
11
|
+
platforms: [android]
|
|
12
|
+
|
|
13
|
+
- id: github-releases
|
|
14
|
+
name: GitHub Releases
|
|
15
|
+
platforms: [android, ios, macos, windows, linux]
|
|
16
|
+
|
|
17
|
+
- id: apk
|
|
18
|
+
name: APK download
|
|
19
|
+
platforms: [android]
|
|
20
|
+
|
|
21
|
+
- id: testflight
|
|
22
|
+
name: TestFlight
|
|
23
|
+
platforms: [ios]
|
|
24
|
+
|
|
25
|
+
- id: website
|
|
26
|
+
name: Website download
|
|
27
|
+
platforms: [web, ios, android, macos, windows, linux]
|
|
28
|
+
|
|
29
|
+
- id: snapcraft
|
|
30
|
+
name: Snapcraft
|
|
31
|
+
platforms: [linux]
|
|
32
|
+
|
|
33
|
+
- id: flathub
|
|
34
|
+
name: Flathub
|
|
35
|
+
platforms: [linux]
|
|
36
|
+
|
|
37
|
+
- id: microsoft-store
|
|
38
|
+
name: Microsoft Store
|
|
39
|
+
platforms: [windows]
|
|
40
|
+
|
|
41
|
+
- id: other
|
|
42
|
+
name: Other
|
|
43
|
+
platforms: []
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
- id: ios
|
|
2
|
+
name: iOS
|
|
3
|
+
icon: ios
|
|
4
|
+
|
|
5
|
+
- id: android
|
|
6
|
+
name: Android
|
|
7
|
+
icon: android
|
|
8
|
+
|
|
9
|
+
- id: web
|
|
10
|
+
name: Web
|
|
11
|
+
icon: web
|
|
12
|
+
|
|
13
|
+
- id: macos
|
|
14
|
+
name: macOS
|
|
15
|
+
icon: macos
|
|
16
|
+
|
|
17
|
+
- id: windows
|
|
18
|
+
name: Windows
|
|
19
|
+
icon: windows
|
|
20
|
+
|
|
21
|
+
- id: linux
|
|
22
|
+
name: Linux
|
|
23
|
+
icon: linux
|
|
24
|
+
|
|
25
|
+
- id: desktop
|
|
26
|
+
name: Desktop
|
|
27
|
+
icon: desktop
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
- id: flutter
|
|
2
|
+
name: Flutter
|
|
3
|
+
family: cross-platform
|
|
4
|
+
languages: [dart]
|
|
5
|
+
platforms: [ios, android, web, macos, windows, linux]
|
|
6
|
+
icon: flutter
|
|
7
|
+
|
|
8
|
+
- id: react-native
|
|
9
|
+
name: React Native
|
|
10
|
+
family: cross-platform
|
|
11
|
+
languages: [typescript, javascript]
|
|
12
|
+
platforms: [ios, android]
|
|
13
|
+
icon: react-native
|
|
14
|
+
|
|
15
|
+
- id: ios
|
|
16
|
+
name: Native iOS
|
|
17
|
+
family: native
|
|
18
|
+
languages: [swift, objective-c]
|
|
19
|
+
platforms: [ios]
|
|
20
|
+
icon: swift
|
|
21
|
+
|
|
22
|
+
- id: android
|
|
23
|
+
name: Native Android
|
|
24
|
+
family: native
|
|
25
|
+
languages: [kotlin, java]
|
|
26
|
+
platforms: [android]
|
|
27
|
+
icon: android
|
|
28
|
+
|
|
29
|
+
- id: capacitor
|
|
30
|
+
name: Capacitor
|
|
31
|
+
family: hybrid
|
|
32
|
+
languages: [typescript, javascript]
|
|
33
|
+
platforms: [ios, android, web]
|
|
34
|
+
icon: capacitor
|
|
35
|
+
|
|
36
|
+
- id: kmp
|
|
37
|
+
name: Kotlin Multiplatform
|
|
38
|
+
family: cross-platform
|
|
39
|
+
languages: [kotlin]
|
|
40
|
+
platforms: [ios, android, desktop]
|
|
41
|
+
icon: kotlin
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"validate:data": "grove validate",
|
|
14
14
|
"build:data": "grove generate",
|
|
15
15
|
"build:sitemap": "grove sitemap",
|
|
16
|
-
"build:llms": "
|
|
16
|
+
"build:llms": "node scripts/build-llms.mjs",
|
|
17
17
|
"build": "pnpm run build:data && pnpm run build:sitemap && pnpm run build:llms && astro build",
|
|
18
18
|
"dev": "pnpm run build:data && astro dev",
|
|
19
19
|
"start": "astro dev",
|
|
@@ -25,11 +25,12 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@astrojs/check": "^0.9.9",
|
|
28
|
-
"@grove-dev/astro": "
|
|
29
|
-
"@grove-dev/cli": "
|
|
30
|
-
"@grove-dev/core": "
|
|
28
|
+
"@grove-dev/astro": "0.2.13",
|
|
29
|
+
"@grove-dev/cli": "0.2.13",
|
|
30
|
+
"@grove-dev/core": "0.2.13",
|
|
31
31
|
"@tailwindcss/vite": "^4.3.0",
|
|
32
32
|
"astro": "^6.4.4",
|
|
33
|
+
"marked": "^18.0.0",
|
|
33
34
|
"tailwindcss": "^4.3.0",
|
|
34
35
|
"yaml": "^2.9.0"
|
|
35
36
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><circle cx="50" cy="50" r="44" fill="#F9F1E1"/><path fill="#000000" d="M50 16c-18.8 0-34 15.2-34 34s15.2 34 34 34 34-15.2 34-34S68.8 16 50 16zm-9 18c0-1.7 1.3-3 3-3s3 1.3 3 3v8c0 4.4 3.6 8 8 8h2c1.7 0 3 1.3 3 3s-1.3 3-3 3h-2c-7.7 0-14-6.3-14-14v-8zm22 22c-1.7 0-3-1.3-3-3s1.3-3 3-3h2c4.4 0 8-3.6 8-8v-2c0-1.7 1.3-3 3-3s3 1.3 3 3v2c0 7.7-6.3 14-14 14h-2z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><circle cx="50" cy="50" r="42" fill="#5881D8"/><path fill="#FFFFFF" d="M50 18c-9 0-15 5-19 13l-3 7 4 5c3 4 7 6 11 6h14c4 0 8-2 11-6l4-5-3-7c-4-8-10-13-19-13z"/><circle cx="50" cy="50" r="12" fill="#FFFFFF"/><circle cx="50" cy="50" r="6" fill="#5881D8"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><circle cx="50" cy="50" r="42" fill="#5881D8"/><path fill="#FFFFFF" d="M50 18c-9 0-15 5-19 13l-3 7 4 5c3 4 7 6 11 6h14c4 0 8-2 11-6l4-5-3-7c-4-8-10-13-19-13z"/><text x="50" y="55" font-family="ui-sans-serif, system-ui, sans-serif" font-size="14" font-weight="700" fill="#FFFFFF" text-anchor="middle">CLJS</text></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><circle cx="50" cy="50" r="42" fill="#000000"/><path fill="#FFFFFF" d="M62 28c-3 0-6 1-8 3-1-2-3-3-6-3-5 0-9 4-9 9 0 1 0 3 1 4-3 1-5 4-5 7 0 4 3 7 7 7h22c5 0 9-4 9-9 0-4-2-7-5-8 0-1 0-2 0-3 0-4-3-7-6-7z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><rect width="100" height="100" rx="14" fill="#092E20"/><path fill="#FFFFFF" d="M30 30h40v40H30z"/><path fill="#44B78B" d="M30 30h40v8H30zM30 62h40v8H30zM30 38h8v24h-8zM62 38h8v24h-8z"/><text x="50" y="56" font-family="Arial, sans-serif" font-size="11" font-weight="700" fill="#092E20" text-anchor="middle">django</text></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><rect x="15" y="20" width="70" height="60" rx="6" fill="#2496ED"/><rect x="15" y="20" width="70" height="12" rx="6" fill="#1D7FB8"/><circle cx="25" cy="26" r="2" fill="#FFFFFF"/><circle cx="33" cy="26" r="2" fill="#FFFFFF"/><circle cx="41" cy="26" r="2" fill="#FFFFFF"/><path fill="#FFFFFF" d="M30 50h40v8H30zM30 64h40v4H30z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none"><circle cx="50" cy="50" r="42" fill="#00ADD8"/><path fill="#FFFFFF" d="M40 28c-6 0-11 5-11 11 0 2 0 3 1 5h-7c-2 0-3 1-3 3 0 11 9 20 22 20h25c9 0 17-7 18-16 0-2-1-3-3-3h-7c-1-3-4-5-7-5-1 0-2 0-3 1-1-4-5-7-9-7-2 0-3 0-4 1-2-5-7-9-12-9zm-7 11a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm14 0a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7 8a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm14 0a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"/></svg>
|