@grove-dev/astro 0.1.4 → 0.2.2
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/index.d.ts +4 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -22
- package/dist/index.js.map +1 -1
- package/dist/layouts/index.d.ts +25 -0
- package/dist/layouts/index.d.ts.map +1 -0
- package/dist/layouts/index.js +25 -0
- package/dist/layouts/index.js.map +1 -0
- package/dist/lib/display.d.ts +33 -0
- package/dist/lib/display.d.ts.map +1 -0
- package/dist/lib/display.js +104 -0
- package/dist/lib/display.js.map +1 -0
- package/dist/lib/format.d.ts +30 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +73 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/index.d.ts +26 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +26 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/lenses.d.ts +96 -0
- package/dist/lib/lenses.d.ts.map +1 -0
- package/dist/lib/lenses.js +181 -0
- package/dist/lib/lenses.js.map +1 -0
- package/dist/lib/repo.d.ts +30 -0
- package/dist/lib/repo.d.ts.map +1 -0
- package/dist/lib/repo.js +44 -0
- package/dist/lib/repo.js.map +1 -0
- package/dist/lib/scores.d.ts +38 -0
- package/dist/lib/scores.d.ts.map +1 -0
- package/dist/lib/scores.js +83 -0
- package/dist/lib/scores.js.map +1 -0
- package/dist/lib/search.d.ts +199 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +357 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/taxonomy-counts.d.ts +25 -0
- package/dist/lib/taxonomy-counts.d.ts.map +1 -0
- package/dist/lib/taxonomy-counts.js +41 -0
- package/dist/lib/taxonomy-counts.js.map +1 -0
- package/package.json +7 -7
- package/src/components/AppSection.astro +83 -0
- package/src/components/AppsIndexRow.astro +204 -0
- package/src/components/AppsPagination.astro +126 -0
- package/src/components/CategoryGrid.astro +86 -17
- package/src/components/ContributorsGrid.astro +149 -0
- package/src/components/DecisionRow.astro +89 -0
- package/src/components/ExploreByCategory.astro +67 -0
- package/src/components/ExploreByStack.astro +72 -0
- package/src/components/Hero.astro +246 -0
- package/src/components/Icon.astro +223 -0
- package/src/components/ItemCard.astro +289 -30
- package/src/components/MinimalAbout.astro +82 -0
- package/src/components/OriginalCollection.astro +116 -0
- package/src/components/RefinePanel.astro +197 -0
- package/src/components/ScoreBars.astro +92 -22
- package/src/components/SmartLensTabs.astro +71 -0
- package/src/components/StackGrid.astro +132 -0
- package/src/components/WhyThisExists.astro +116 -0
- package/src/index.ts +61 -14
- package/src/layouts/BaseLayout.astro +227 -15
- package/src/layouts/Container.astro +57 -0
- package/src/layouts/Footer.astro +235 -0
- package/src/layouts/Header.astro +159 -0
- package/src/layouts/SectionHeader.astro +58 -0
- package/{templates/default/src/components/layout → src/layouts}/Seo.astro +62 -38
- package/src/layouts/ThemeToggle.astro +110 -0
- package/src/layouts/astro-shim.d.ts +29 -0
- package/src/layouts/index.ts +24 -0
- package/src/lib/display.ts +118 -0
- package/src/lib/format.ts +65 -0
- package/src/lib/index.ts +26 -0
- package/src/lib/lenses.ts +241 -0
- package/src/lib/repo.ts +44 -0
- package/src/lib/scores.ts +94 -0
- package/src/lib/search.ts +481 -0
- package/src/lib/taxonomy-counts.ts +60 -0
- package/src/styles.css +366 -638
- package/templates/default/.astro/content.d.ts +155 -0
- package/templates/default/.astro/settings.json +5 -0
- package/templates/default/.astro/types.d.ts +2 -0
- package/templates/default/astro.config.mjs +8 -6
- package/templates/default/content/pages/about.md +66 -0
- package/templates/default/content/pages/methodology.md +103 -0
- package/templates/default/data/generated/records.full.json +8 -0
- package/templates/default/data/generated/records.index.json +7 -0
- package/templates/default/data/generated/records.json +8 -0
- package/templates/default/data/generated/site-config.json +31 -0
- package/templates/default/data/records/.gitkeep +0 -0
- package/templates/default/dist/_astro/BaseLayout.DfpwR3jc.css +1 -0
- package/templates/default/dist/about/index.html +165 -0
- package/templates/default/dist/icons/platforms/android.svg +1 -0
- package/templates/default/dist/icons/platforms/apple-dark.svg +1 -0
- package/templates/default/dist/icons/platforms/apple-light.svg +1 -0
- package/templates/default/dist/icons/platforms/chrome.svg +1 -0
- package/templates/default/dist/icons/platforms/chromeos.svg +5 -0
- package/templates/default/dist/icons/platforms/desktop.svg +4 -0
- package/templates/default/dist/icons/platforms/embedded.svg +5 -0
- package/templates/default/dist/icons/platforms/ios.svg +1 -0
- package/templates/default/dist/icons/platforms/linux.svg +1 -0
- package/templates/default/dist/icons/platforms/macos.svg +1 -0
- package/templates/default/dist/icons/platforms/ubuntu.svg +1 -0
- package/templates/default/dist/icons/platforms/web.svg +5 -0
- package/templates/default/dist/icons/platforms/windows.svg +6 -0
- package/templates/default/dist/icons/stacks/android.svg +1 -0
- package/templates/default/dist/icons/stacks/apple-dark.svg +1 -0
- package/templates/default/dist/icons/stacks/apple-light.svg +1 -0
- package/templates/default/dist/icons/stacks/capacitor.svg +14 -0
- package/templates/default/dist/icons/stacks/dart.svg +1 -0
- package/templates/default/dist/icons/stacks/firebase.svg +1 -0
- package/templates/default/dist/icons/stacks/flutter.svg +1 -0
- package/templates/default/dist/icons/stacks/graphql.svg +1 -0
- package/templates/default/dist/icons/stacks/ionic.svg +4 -0
- package/templates/default/dist/icons/stacks/java.svg +1 -0
- package/templates/default/dist/icons/stacks/javascript.svg +1 -0
- package/templates/default/dist/icons/stacks/kotlin.svg +1 -0
- package/templates/default/dist/icons/stacks/mongodb.svg +1 -0
- package/templates/default/dist/icons/stacks/nodejs.svg +1 -0
- package/templates/default/dist/icons/stacks/python.svg +1 -0
- package/templates/default/dist/icons/stacks/react-native.svg +1 -0
- package/templates/default/dist/icons/stacks/react.svg +1 -0
- package/templates/default/dist/icons/stacks/rust.svg +1 -0
- package/templates/default/dist/icons/stacks/solidity.svg +1 -0
- package/templates/default/dist/icons/stacks/swift.svg +1 -0
- package/templates/default/dist/icons/stacks/tensorflow.svg +1 -0
- package/templates/default/dist/icons/stacks/typescript.svg +1 -0
- package/templates/default/dist/index.html +55 -0
- package/templates/default/dist/llms-full.txt +14 -0
- package/templates/default/dist/llms.txt +11 -0
- package/templates/default/dist/og-image.svg +48 -0
- package/templates/default/dist/projects/index.html +61 -0
- package/templates/default/dist/robots.txt +53 -0
- package/templates/default/dist/sitemap.xml +21 -0
- package/templates/default/dist/submit/index.html +69 -0
- package/templates/default/grove.config.ts +36 -0
- package/templates/default/node_modules/.bin/astro +21 -0
- package/templates/default/node_modules/.bin/astro-check +21 -0
- package/templates/default/node_modules/.bin/grove +21 -0
- package/templates/default/node_modules/.bin/jiti +21 -0
- package/templates/default/node_modules/.bin/prettier +21 -0
- package/templates/default/node_modules/.bin/rollup +21 -0
- package/templates/default/node_modules/.bin/tsc +21 -0
- package/templates/default/node_modules/.bin/tsserver +21 -0
- package/templates/default/node_modules/.bin/tsx +21 -0
- package/templates/default/node_modules/.bin/vite +21 -0
- package/templates/default/node_modules/.bin/yaml +21 -0
- package/templates/default/node_modules/.vite/deps/_metadata.json +79 -0
- package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js +433 -0
- package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/astro___aria-query.js +5 -0
- package/templates/default/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/astro___axobject-query.js +5 -0
- package/templates/default/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/astro___html-escaper.js +9 -0
- package/templates/default/node_modules/.vite/deps/astro___html-escaper.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +241 -0
- package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js +1592 -0
- package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js +30 -0
- package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js +186 -0
- package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js +48 -0
- package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js +6779 -0
- package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js +33 -0
- package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js +88 -0
- package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js +72 -0
- package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js +3757 -0
- package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js +54 -0
- package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/package.json +3 -0
- package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js +213 -0
- package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js +525 -0
- package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js +1020 -0
- package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js.map +7 -0
- package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js +147 -0
- package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js.map +7 -0
- package/templates/default/package.json +6 -5
- package/templates/default/public/llms-full.txt +14 -0
- package/templates/default/public/llms.txt +11 -0
- package/templates/default/src/components/layout/BaseLayout.astro +10 -57
- package/templates/default/src/components/layout/Footer.astro +16 -134
- package/templates/default/src/components/layout/Header.astro +25 -126
- package/templates/default/src/data/records.ts +161 -0
- package/templates/default/src/lib/markdown.ts +171 -0
- package/templates/default/src/pages/about.astro +95 -429
- package/templates/default/src/pages/index.astro +258 -61
- package/templates/default/src/pages/projects/[slug].astro +480 -0
- package/templates/default/src/pages/projects/index.astro +193 -0
- package/templates/default/src/pages/sitemap.xml.ts +73 -61
- package/templates/default/src/pages/submit.astro +122 -411
- package/templates/default/src/styles/global.css +42 -68
- package/src/components/ActiveFilterChips.astro +0 -20
- package/src/components/DirectoryFilters.astro +0 -100
- package/src/components/DirectoryHero.astro +0 -32
- package/src/components/HealthBadge.astro +0 -12
- package/src/components/LensTabs.astro +0 -26
- package/src/components/MethodologyPanel.astro +0 -20
- package/src/components/Pagination.astro +0 -24
- package/src/components/ProjectDetail.astro +0 -166
- package/src/components/SubmitDraft.astro +0 -137
- package/templates/default/src/components/AppCard.astro +0 -248
- package/templates/default/src/components/AppSection.astro +0 -58
- package/templates/default/src/components/AppsIndexRow.astro +0 -230
- package/templates/default/src/components/AppsPagination.astro +0 -147
- package/templates/default/src/components/CategoryGrid.astro +0 -80
- package/templates/default/src/components/ContributorsGrid.astro +0 -105
- package/templates/default/src/components/DecisionRow.astro +0 -219
- package/templates/default/src/components/ExploreByCategory.astro +0 -74
- package/templates/default/src/components/ExploreByStack.astro +0 -102
- package/templates/default/src/components/Hero.astro +0 -176
- package/templates/default/src/components/MinimalAbout.astro +0 -57
- package/templates/default/src/components/OriginalCollection.astro +0 -144
- package/templates/default/src/components/RefinePanel.astro +0 -272
- package/templates/default/src/components/ScoreBars.astro +0 -72
- package/templates/default/src/components/SmartLensTabs.astro +0 -65
- package/templates/default/src/components/StackGrid.astro +0 -95
- package/templates/default/src/components/WhyThisExists.astro +0 -81
- package/templates/default/src/components/icons/Icon.astro +0 -148
- package/templates/default/src/components/layout/SectionHeader.astro +0 -42
- package/templates/default/src/components/layout/ThemeToggle.astro +0 -97
- package/templates/default/src/data/apps.ts +0 -149
- package/templates/default/src/data/categories.ts +0 -27
- package/templates/default/src/data/config.ts +0 -28
- package/templates/default/src/data/contributors.ts +0 -96
- package/templates/default/src/data/stacks.ts +0 -47
- package/templates/default/src/data/stats.ts +0 -65
- package/templates/default/src/data/types.ts +0 -248
- package/templates/default/src/lib/apps-search.ts +0 -228
- package/templates/default/src/lib/format.ts +0 -36
- package/templates/default/src/lib/lenses.ts +0 -98
- package/templates/default/src/lib/repo.ts +0 -12
- package/templates/default/src/lib/scores.ts +0 -51
- package/templates/default/src/lib/taxonomy-counts.ts +0 -31
- package/templates/default/src/pages/apps/[slug].astro +0 -709
- package/templates/default/src/pages/apps/index.astro +0 -669
- package/templates/default/src/pages/contributors.astro +0 -142
|
@@ -1,433 +1,99 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
//
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"Is this a real app or only a demo?",
|
|
41
|
-
"What stack does it use?",
|
|
42
|
-
"Which platforms does it support?",
|
|
43
|
-
"Is it actively maintained?",
|
|
44
|
-
"Is it mature or new?",
|
|
45
|
-
"Is it useful for learning?",
|
|
46
|
-
"Is it beginner-friendly or complex?",
|
|
47
|
-
"Does it have a clear license?",
|
|
48
|
-
"Are there similar apps worth checking?",
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
// Different shapes an app can take. The directory makes those
|
|
52
|
-
// dimensions visible instead of treating every repo as "just
|
|
53
|
-
// another project".
|
|
54
|
-
const appShapes = [
|
|
55
|
-
{ label: "Mature and stable", note: "Long-running, production-ish" },
|
|
56
|
-
{ label: "New and interesting", note: "Recent, worth watching" },
|
|
57
|
-
{ label: "Good for studying architecture", note: "Patterns worth reading" },
|
|
58
|
-
{ label: "Easier for beginners", note: "Smaller, readable" },
|
|
59
|
-
{ label: "Useful but inactive", note: "Stale, still a reference" },
|
|
60
|
-
{ label: "Archived but worth learning from", note: "Patterns outlive the repo" },
|
|
61
|
-
];
|
|
62
|
-
|
|
63
|
-
// Mobile stacks. Flutter is the original; others are being
|
|
64
|
-
// added in order.
|
|
65
|
-
const mobileStacks = [
|
|
66
|
-
{ name: "Flutter", status: "original", note: "Original collection" },
|
|
67
|
-
{ name: "React Native", status: "growing", note: "Second mobile stack" },
|
|
68
|
-
{ name: "Native iOS", status: "growing", note: "Swift / SwiftUI" },
|
|
69
|
-
{ name: "Native Android", status: "growing", note: "Kotlin / Compose" },
|
|
70
|
-
{ name: "Kotlin Multiplatform", status: "growing", note: "Shared mobile + desktop" },
|
|
71
|
-
{ name: "Ionic & Capacitor", status: "planned", note: "Web-tech mobile" },
|
|
72
|
-
];
|
|
73
|
-
|
|
74
|
-
const title = "About — ${siteConfig.name}";
|
|
75
|
-
const description =
|
|
76
|
-
"About ${siteConfig.name} — a static, community-curated directory of real open-source application codebases. Mobile first.";
|
|
2
|
+
/**
|
|
3
|
+
* About page — three value props (MinimalAbout) + a long-form
|
|
4
|
+
* methodology section rendered from `content/pages/methodology.md`.
|
|
5
|
+
*
|
|
6
|
+
* The markdown body is read at build time and rendered as a single
|
|
7
|
+
* <pre> block (we keep the template dep-free; consumers can swap in
|
|
8
|
+
* a real markdown pipeline by overriding the page). The intent is
|
|
9
|
+
* that the methodology is *visible on the page* even if the prose
|
|
10
|
+
* isn't styled — the structured content stays discoverable.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
import { dirname, resolve } from "node:path";
|
|
15
|
+
|
|
16
|
+
import siteConfig from "../../data/generated/site-config.json";
|
|
17
|
+
import BaseLayout from "@grove-dev/astro/layouts/BaseLayout.astro";
|
|
18
|
+
import Container from "@grove-dev/astro/layouts/Container.astro";
|
|
19
|
+
import MinimalAbout from "@grove-dev/astro/components/MinimalAbout.astro";
|
|
20
|
+
|
|
21
|
+
const title = `About — ${siteConfig.name}`;
|
|
22
|
+
const description = `About ${siteConfig.name} — ${siteConfig.tagline}`;
|
|
23
|
+
|
|
24
|
+
// ── Load methodology.md from content/pages/ (build time) ──────
|
|
25
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const methodologyPath = [
|
|
27
|
+
resolve(here, "..", "..", "..", "content", "pages", "methodology.md"),
|
|
28
|
+
resolve(here, "..", "..", "..", "..", "content", "pages", "methodology.md"),
|
|
29
|
+
resolve(process.cwd(), "content", "pages", "methodology.md"),
|
|
30
|
+
].find((p) => existsSync(p));
|
|
31
|
+
|
|
32
|
+
let methodologyText: string | null = null;
|
|
33
|
+
if (methodologyPath) {
|
|
34
|
+
try {
|
|
35
|
+
methodologyText = readFileSync(methodologyPath, "utf8");
|
|
36
|
+
} catch {
|
|
37
|
+
methodologyText = null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
77
40
|
---
|
|
78
41
|
|
|
79
|
-
<BaseLayout title={title} description={description}>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">·</span>
|
|
137
|
-
<span>{q}</span>
|
|
138
|
-
</li>
|
|
139
|
-
))}
|
|
140
|
-
</ul>
|
|
141
|
-
|
|
142
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
143
|
-
A plain README list becomes hard to scan as the number of apps
|
|
144
|
-
grows.
|
|
145
|
-
</p>
|
|
146
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
147
|
-
{siteConfig.name} turns that list into a structured directory.
|
|
148
|
-
</p>
|
|
149
|
-
</section>
|
|
150
|
-
|
|
151
|
-
{/* ── What this project provides ───────────────────────────── */}
|
|
152
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
153
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
154
|
-
What the directory adds
|
|
155
|
-
</span>
|
|
156
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
157
|
-
What this project provides
|
|
158
|
-
</h2>
|
|
159
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
160
|
-
Each app is organized with useful metadata, not just a link. The
|
|
161
|
-
directory can show information such as:
|
|
162
|
-
</p>
|
|
163
|
-
|
|
164
|
-
<ul class="m-0 mt-4 list-none space-y-1.5 p-0">
|
|
165
|
-
{directoryFields.map((f) => (
|
|
166
|
-
<li class="flex items-baseline gap-2 text-[0.875rem] text-ink-700 dark:text-ink-200">
|
|
167
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
168
|
-
<span>{f}</span>
|
|
169
|
-
</li>
|
|
170
|
-
))}
|
|
171
|
-
</ul>
|
|
172
|
-
|
|
173
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
174
|
-
This makes it easier to decide whether a repository is worth
|
|
175
|
-
opening.
|
|
176
|
-
</p>
|
|
177
|
-
</section>
|
|
178
|
-
|
|
179
|
-
{/* ── Why real apps matter ─────────────────────────────────── */}
|
|
180
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
181
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
182
|
-
Why real apps matter
|
|
183
|
-
</span>
|
|
184
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
185
|
-
Why real app codebases matter
|
|
186
|
-
</h2>
|
|
187
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
188
|
-
Small examples and tutorials are useful, but they do not show how
|
|
189
|
-
real applications grow.
|
|
190
|
-
</p>
|
|
191
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
192
|
-
Real app codebases can show:
|
|
193
|
-
</p>
|
|
194
|
-
|
|
195
|
-
<ul class="m-0 mt-4 flex flex-wrap gap-1.5 p-0">
|
|
196
|
-
{realAppPatterns.map((p) => (
|
|
197
|
-
<li class="inline-flex items-center rounded-md border border-ink-200 bg-ink-50 px-2 py-1 text-2xs font-medium text-ink-700 dark:border-ink-800 dark:bg-ink-900/60 dark:text-ink-300">
|
|
198
|
-
{p}
|
|
199
|
-
</li>
|
|
200
|
-
))}
|
|
201
|
-
</ul>
|
|
202
|
-
|
|
203
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
204
|
-
This project helps developers discover those real examples faster.
|
|
205
|
-
</p>
|
|
206
|
-
</section>
|
|
207
|
-
|
|
208
|
-
{/* ── AI hype ──────────────────────────────────────────────── */}
|
|
209
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
210
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
211
|
-
AI hype
|
|
212
|
-
</span>
|
|
213
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
214
|
-
Why this list is still needed
|
|
215
|
-
</h2>
|
|
216
|
-
|
|
217
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
218
|
-
A lot of developer attention right now is on AI coding tools. The
|
|
219
|
-
pitch is familiar: describe the app, the model builds it, ship
|
|
220
|
-
it.
|
|
221
|
-
</p>
|
|
222
|
-
|
|
223
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
224
|
-
This project does not pretend to compete with that. It does
|
|
225
|
-
something different.
|
|
226
|
-
</p>
|
|
227
|
-
|
|
228
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
229
|
-
AI can generate code. It can also generate code that{" "}
|
|
230
|
-
<em class="not-italic font-medium text-ink-900 dark:text-ink-100">looks like an app, runs like an app, and breaks like an app</em>.
|
|
231
|
-
</p>
|
|
232
|
-
|
|
233
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
234
|
-
A generated prototype is not the same as a real application. Real
|
|
235
|
-
apps have structure that survives years of changes, decisions,
|
|
236
|
-
edge cases, and contributors. They handle authentication,
|
|
237
|
-
navigation, storage, releases, deprecation. They have bugs and
|
|
238
|
-
they fix them.
|
|
239
|
-
</p>
|
|
240
|
-
|
|
241
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
242
|
-
That part does not come from prompting a model.
|
|
243
|
-
</p>
|
|
244
|
-
|
|
245
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
246
|
-
{siteConfig.name} is a list of those real applications. Curated by
|
|
247
|
-
humans. Useful as a reference for:
|
|
248
|
-
</p>
|
|
249
|
-
|
|
250
|
-
<ul class="m-0 mt-3 list-none space-y-1.5 p-0 text-[0.875rem] text-ink-700 dark:text-ink-200">
|
|
251
|
-
<li class="flex items-baseline gap-2">
|
|
252
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
253
|
-
<span>Studying how a real app is structured</span>
|
|
254
|
-
</li>
|
|
255
|
-
<li class="flex items-baseline gap-2">
|
|
256
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
257
|
-
<span>Comparing two real approaches to the same problem</span>
|
|
258
|
-
</li>
|
|
259
|
-
<li class="flex items-baseline gap-2">
|
|
260
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
261
|
-
<span>Finding a codebase to learn from</span>
|
|
262
|
-
</li>
|
|
263
|
-
<li class="flex items-baseline gap-2">
|
|
264
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
265
|
-
<span>Finding a codebase to contribute to</span>
|
|
266
|
-
</li>
|
|
267
|
-
<li class="flex items-baseline gap-2">
|
|
268
|
-
<span aria-hidden="true" class="text-ink-400 dark:text-ink-500">—</span>
|
|
269
|
-
<span>Finding a codebase to use as a reference when generating new code</span>
|
|
270
|
-
</li>
|
|
271
|
-
</ul>
|
|
272
|
-
|
|
273
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
274
|
-
AI tools are useful. A curated directory of real codebases is
|
|
275
|
-
also useful. They are not the same thing, and one does not
|
|
276
|
-
replace the other.
|
|
277
|
-
</p>
|
|
278
|
-
|
|
279
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
280
|
-
If you are using an AI tool to build something, you can also use
|
|
281
|
-
this directory to find real apps to point it at.{" "}
|
|
282
|
-
<em class="not-italic font-medium text-ink-900 dark:text-ink-100">
|
|
283
|
-
"Build me an app like this one"
|
|
284
|
-
</em>{" "}
|
|
285
|
-
is a stronger instruction than{" "}
|
|
286
|
-
<em class="not-italic font-medium text-ink-900 dark:text-ink-100">
|
|
287
|
-
"build me an app."
|
|
288
|
-
</em>
|
|
289
|
-
</p>
|
|
290
|
-
|
|
291
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
292
|
-
That is the idea.
|
|
293
|
-
</p>
|
|
294
|
-
</section>
|
|
295
|
-
|
|
296
|
-
{/* ── What makes an app valuable here ──────────────────────── */}
|
|
297
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
298
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
299
|
-
Different shapes
|
|
300
|
-
</span>
|
|
301
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
302
|
-
What makes an app valuable here
|
|
303
|
-
</h2>
|
|
304
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
305
|
-
Not every repository is useful in the same way.
|
|
306
|
-
</p>
|
|
307
|
-
|
|
308
|
-
<ul class="m-0 mt-4 list-none space-y-2 p-0">
|
|
309
|
-
{appShapes.map((s) => (
|
|
310
|
-
<li class="flex items-baseline gap-3 text-[0.9375rem]">
|
|
311
|
-
<span aria-hidden="true" class="mt-1.5 inline-block h-1.5 w-1.5 shrink-0 rounded-full bg-ink-400 dark:bg-ink-600"></span>
|
|
312
|
-
<span class="font-medium text-ink-900 dark:text-ink-100">{s.label}</span>
|
|
313
|
-
<span class="text-ink-500 dark:text-ink-400">— {s.note}</span>
|
|
314
|
-
</li>
|
|
315
|
-
))}
|
|
316
|
-
</ul>
|
|
317
|
-
|
|
318
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
319
|
-
The directory should make those differences visible.
|
|
320
|
-
</p>
|
|
321
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
322
|
-
Instead of treating every repository as the same, Open Source
|
|
323
|
-
Apps adds context around each app.
|
|
324
|
-
</p>
|
|
325
|
-
</section>
|
|
326
|
-
|
|
327
|
-
{/* ── Open data ────────────────────────────────────────────── */}
|
|
328
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
329
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
330
|
-
How data works
|
|
331
|
-
</span>
|
|
332
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
333
|
-
Open data
|
|
334
|
-
</h2>
|
|
335
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
336
|
-
The project is open-source by design.
|
|
337
|
-
</p>
|
|
338
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
339
|
-
The app data lives in the repository. The website is generated
|
|
340
|
-
from static data. Metadata can be reviewed and improved through
|
|
341
|
-
GitHub issues and pull requests.
|
|
342
|
-
</p>
|
|
343
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
344
|
-
This keeps the project simple, transparent, and
|
|
345
|
-
community-maintainable.
|
|
346
|
-
</p>
|
|
347
|
-
</section>
|
|
348
|
-
|
|
349
|
-
{/* ── Current focus ────────────────────────────────────────── */}
|
|
350
|
-
<section class="card mt-4 p-5 sm:p-6">
|
|
351
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
352
|
-
Scope right now
|
|
353
|
-
</span>
|
|
354
|
-
<h2 class="mt-1 m-0 text-[1.125rem] sm:text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
|
|
355
|
-
Current focus
|
|
356
|
-
</h2>
|
|
357
|
-
<p class="mt-3 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
358
|
-
The first focus is mobile apps.
|
|
359
|
-
</p>
|
|
360
|
-
<p class="mt-2 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
361
|
-
The original collection is Flutter-based, so Flutter is the
|
|
362
|
-
strongest starting point. The directory is also designed to
|
|
363
|
-
support other mobile stacks over time:
|
|
364
|
-
</p>
|
|
365
|
-
|
|
366
|
-
<ul class="m-0 mt-4 list-none space-y-1.5 p-0">
|
|
367
|
-
{mobileStacks.map((s) => (
|
|
368
|
-
<li class="flex items-baseline gap-3 text-[0.9375rem]">
|
|
369
|
-
<span
|
|
370
|
-
aria-hidden="true"
|
|
371
|
-
class={`mt-1.5 inline-block h-1.5 w-1.5 shrink-0 rounded-full ${
|
|
372
|
-
s.status === "original"
|
|
373
|
-
? "bg-emerald-500"
|
|
374
|
-
: s.status === "growing"
|
|
375
|
-
? "bg-amber-500"
|
|
376
|
-
: "bg-ink-300 dark:bg-ink-700"
|
|
377
|
-
}`}
|
|
378
|
-
></span>
|
|
379
|
-
<span class="font-medium text-ink-900 dark:text-ink-100">{s.name}</span>
|
|
380
|
-
<span class="text-ink-500 dark:text-ink-400">— {s.note}</span>
|
|
381
|
-
</li>
|
|
382
|
-
))}
|
|
383
|
-
</ul>
|
|
384
|
-
|
|
385
|
-
<p class="mt-4 m-0 text-[0.9375rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
386
|
-
Later, the same structure can support other app types such as
|
|
387
|
-
desktop apps.
|
|
388
|
-
</p>
|
|
389
|
-
</section>
|
|
390
|
-
|
|
391
|
-
{/* ── Principle ────────────────────────────────────────────── */}
|
|
392
|
-
<section class="mt-8 rounded-lg border border-ink-200 bg-ink-50/60 p-6 sm:p-7 dark:border-ink-800 dark:bg-ink-900/40">
|
|
393
|
-
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
394
|
-
The principle
|
|
395
|
-
</span>
|
|
396
|
-
<p class="mt-2 m-0 text-[1.125rem] sm:text-[1.375rem] font-semibold leading-[1.25] tracking-tight text-ink-900 dark:text-ink-100">
|
|
397
|
-
Real apps are easier to learn from when they are organized with
|
|
398
|
-
context.
|
|
399
|
-
</p>
|
|
400
|
-
<p class="mt-3 m-0 text-[0.9375rem] sm:text-[1rem] leading-relaxed text-ink-700 dark:text-ink-200">
|
|
401
|
-
{siteConfig.name} exists to make open-source application
|
|
402
|
-
codebases easier to discover, evaluate, and study.
|
|
403
|
-
</p>
|
|
404
|
-
</section>
|
|
405
|
-
|
|
406
|
-
{/* ── CTA ──────────────────────────────────────────────────── */}
|
|
407
|
-
<section class="mt-8 flex flex-wrap items-center gap-3">
|
|
408
|
-
<a
|
|
409
|
-
href="/apps"
|
|
410
|
-
class="btn-primary"
|
|
411
|
-
>
|
|
412
|
-
Browse the directory
|
|
413
|
-
</a>
|
|
414
|
-
<a
|
|
415
|
-
href={githubUrl}
|
|
416
|
-
target="_blank"
|
|
417
|
-
rel="noopener noreferrer"
|
|
418
|
-
class="btn-outline"
|
|
419
|
-
>
|
|
420
|
-
View on GitHub
|
|
421
|
-
</a>
|
|
422
|
-
<a
|
|
423
|
-
href={`${githubUrl}/blob/main/CONTRIBUTING.md`}
|
|
424
|
-
target="_blank"
|
|
425
|
-
rel="noopener noreferrer"
|
|
426
|
-
class="btn-ghost"
|
|
427
|
-
>
|
|
428
|
-
Submit an app →
|
|
429
|
-
</a>
|
|
430
|
-
</section>
|
|
431
|
-
</article>
|
|
432
|
-
</Container>
|
|
42
|
+
<BaseLayout title={title} description={description} site={siteConfig}>
|
|
43
|
+
<Container>
|
|
44
|
+
<article class="py-12 sm:py-16">
|
|
45
|
+
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
46
|
+
About
|
|
47
|
+
</span>
|
|
48
|
+
<h1 class="mt-1 text-[1.75rem] sm:text-[2.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100 m-0">
|
|
49
|
+
About {siteConfig.name}
|
|
50
|
+
</h1>
|
|
51
|
+
<p class="mt-4 max-w-[62ch] text-base text-ink-700 dark:text-ink-200 m-0">
|
|
52
|
+
{siteConfig.name} is a community knowledge site built with{" "}
|
|
53
|
+
<a
|
|
54
|
+
href="https://github.com/tortuvshin/grove"
|
|
55
|
+
target="_blank"
|
|
56
|
+
rel="noopener noreferrer"
|
|
57
|
+
class="text-ink-900 underline hover:text-ink-700 dark:text-ink-100 dark:hover:text-white"
|
|
58
|
+
>
|
|
59
|
+
Grove
|
|
60
|
+
</a>{" "}
|
|
61
|
+
— an open-source framework for growing useful structured knowledge.
|
|
62
|
+
</p>
|
|
63
|
+
</article>
|
|
64
|
+
</Container>
|
|
65
|
+
|
|
66
|
+
<MinimalAbout
|
|
67
|
+
title="Why this exists"
|
|
68
|
+
description="Three principles guide what gets listed and how it's surfaced."
|
|
69
|
+
/>
|
|
70
|
+
|
|
71
|
+
<Container>
|
|
72
|
+
<section class="py-12 sm:py-16" aria-labelledby="methodology-heading">
|
|
73
|
+
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
74
|
+
Methodology
|
|
75
|
+
</span>
|
|
76
|
+
<h2
|
|
77
|
+
id="methodology-heading"
|
|
78
|
+
class="mt-1 text-[1.5rem] sm:text-[1.75rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100 m-0"
|
|
79
|
+
>
|
|
80
|
+
How records are picked, scored, and surfaced
|
|
81
|
+
</h2>
|
|
82
|
+
<p class="mt-3 max-w-[62ch] text-sm text-ink-500 dark:text-ink-400 m-0">
|
|
83
|
+
The full editorial + scoring methodology lives in
|
|
84
|
+
<code class="font-mono text-ink-900 dark:text-ink-100">content/pages/methodology.md</code>.
|
|
85
|
+
Below is the rendered source so reviewers can audit the criteria.
|
|
86
|
+
</p>
|
|
87
|
+
{methodologyText ? (
|
|
88
|
+
<pre
|
|
89
|
+
class="mt-6 overflow-x-auto rounded-md border border-ink-200 bg-ink-50 p-4 text-xs leading-relaxed text-ink-800 dark:border-ink-800 dark:bg-ink-900/60 dark:text-ink-200"
|
|
90
|
+
><code>{methodologyText}</code></pre>
|
|
91
|
+
) : (
|
|
92
|
+
<p class="mt-6 max-w-[62ch] text-sm text-ink-500 dark:text-ink-400 m-0">
|
|
93
|
+
The methodology file is not yet present in this scaffold.
|
|
94
|
+
See <code class="font-mono">content/pages/methodology.md</code>.
|
|
95
|
+
</p>
|
|
96
|
+
)}
|
|
97
|
+
</section>
|
|
98
|
+
</Container>
|
|
433
99
|
</BaseLayout>
|