@grove-dev/astro 0.2.6 → 0.2.10

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.
Files changed (100) hide show
  1. package/package.json +3 -3
  2. package/templates/default/.astro/content.d.ts +155 -0
  3. package/templates/default/.astro/settings.json +5 -0
  4. package/templates/default/.astro/types.d.ts +1 -0
  5. package/templates/default/dist/_astro/BaseLayout.Dz_HR-68.css +1 -0
  6. package/templates/default/dist/about/index.html +165 -0
  7. package/templates/default/dist/icons/platforms/android.svg +1 -0
  8. package/templates/default/dist/icons/platforms/apple-dark.svg +1 -0
  9. package/templates/default/dist/icons/platforms/apple-light.svg +1 -0
  10. package/templates/default/dist/icons/platforms/chrome.svg +1 -0
  11. package/templates/default/dist/icons/platforms/chromeos.svg +5 -0
  12. package/templates/default/dist/icons/platforms/desktop.svg +4 -0
  13. package/templates/default/dist/icons/platforms/embedded.svg +5 -0
  14. package/templates/default/dist/icons/platforms/ios.svg +1 -0
  15. package/templates/default/dist/icons/platforms/linux.svg +1 -0
  16. package/templates/default/dist/icons/platforms/macos.svg +1 -0
  17. package/templates/default/dist/icons/platforms/ubuntu.svg +1 -0
  18. package/templates/default/dist/icons/platforms/web.svg +5 -0
  19. package/templates/default/dist/icons/platforms/windows.svg +6 -0
  20. package/templates/default/dist/icons/stacks/android.svg +1 -0
  21. package/templates/default/dist/icons/stacks/apple-dark.svg +1 -0
  22. package/templates/default/dist/icons/stacks/apple-light.svg +1 -0
  23. package/templates/default/dist/icons/stacks/capacitor.svg +14 -0
  24. package/templates/default/dist/icons/stacks/dart.svg +1 -0
  25. package/templates/default/dist/icons/stacks/firebase.svg +1 -0
  26. package/templates/default/dist/icons/stacks/flutter.svg +1 -0
  27. package/templates/default/dist/icons/stacks/graphql.svg +1 -0
  28. package/templates/default/dist/icons/stacks/ionic.svg +4 -0
  29. package/templates/default/dist/icons/stacks/java.svg +1 -0
  30. package/templates/default/dist/icons/stacks/javascript.svg +1 -0
  31. package/templates/default/dist/icons/stacks/kotlin.svg +1 -0
  32. package/templates/default/dist/icons/stacks/mongodb.svg +1 -0
  33. package/templates/default/dist/icons/stacks/nodejs.svg +1 -0
  34. package/templates/default/dist/icons/stacks/python.svg +1 -0
  35. package/templates/default/dist/icons/stacks/react-native.svg +1 -0
  36. package/templates/default/dist/icons/stacks/react.svg +1 -0
  37. package/templates/default/dist/icons/stacks/rust.svg +1 -0
  38. package/templates/default/dist/icons/stacks/solidity.svg +1 -0
  39. package/templates/default/dist/icons/stacks/swift.svg +1 -0
  40. package/templates/default/dist/icons/stacks/tensorflow.svg +1 -0
  41. package/templates/default/dist/icons/stacks/typescript.svg +1 -0
  42. package/templates/default/dist/index.html +55 -0
  43. package/templates/default/dist/llms-full.txt +14 -0
  44. package/templates/default/dist/llms.txt +11 -0
  45. package/templates/default/dist/og-image.svg +48 -0
  46. package/templates/default/dist/projects/index.html +61 -0
  47. package/templates/default/dist/robots.txt +53 -0
  48. package/templates/default/dist/sitemap.xml +21 -0
  49. package/templates/default/dist/submit/index.html +69 -0
  50. package/templates/default/node_modules/.bin/astro +21 -0
  51. package/templates/default/node_modules/.bin/astro-check +21 -0
  52. package/templates/default/node_modules/.bin/grove +21 -0
  53. package/templates/default/node_modules/.bin/jiti +21 -0
  54. package/templates/default/node_modules/.bin/prettier +21 -0
  55. package/templates/default/node_modules/.bin/rollup +21 -0
  56. package/templates/default/node_modules/.bin/tsc +21 -0
  57. package/templates/default/node_modules/.bin/tsserver +21 -0
  58. package/templates/default/node_modules/.bin/tsx +21 -0
  59. package/templates/default/node_modules/.bin/vite +21 -0
  60. package/templates/default/node_modules/.bin/yaml +21 -0
  61. package/templates/default/node_modules/.vite/deps/_metadata.json +79 -0
  62. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js +433 -0
  63. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js.map +7 -0
  64. package/templates/default/node_modules/.vite/deps/astro___aria-query.js +5 -0
  65. package/templates/default/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
  66. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js +5 -0
  67. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
  68. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js +9 -0
  69. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js.map +7 -0
  70. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +241 -0
  71. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +7 -0
  72. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js +1592 -0
  73. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js.map +7 -0
  74. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js +30 -0
  75. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +7 -0
  76. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js +186 -0
  77. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js.map +7 -0
  78. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js +48 -0
  79. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js.map +7 -0
  80. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js +6779 -0
  81. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js.map +7 -0
  82. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js +33 -0
  83. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js.map +7 -0
  84. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js +88 -0
  85. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js.map +7 -0
  86. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js +72 -0
  87. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js.map +7 -0
  88. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js +3757 -0
  89. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js.map +7 -0
  90. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js +54 -0
  91. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js.map +7 -0
  92. package/templates/default/node_modules/.vite/deps/package.json +3 -0
  93. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js +213 -0
  94. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js.map +7 -0
  95. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js +525 -0
  96. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js.map +7 -0
  97. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js +1020 -0
  98. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js.map +7 -0
  99. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js +147 -0
  100. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js.map +7 -0
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="url(#a)" d="M49.64 0C24.254 0 25.839 11.01 25.839 11.01l.028 11.405h24.225v3.424H16.245S0 23.997 0 49.612s14.179 24.707 14.179 24.707h8.462V62.432s-.457-14.179 13.952-14.179H60.62s13.5.218 13.5-13.047V13.275S76.17 0 49.64 0M36.282 7.67a4.354 4.354 0 0 1 4.358 4.359 4.355 4.355 0 0 1-6.027 4.027 4.35 4.35 0 0 1-2.69-4.027 4.355 4.355 0 0 1 4.359-4.358"/><path fill="url(#b)" d="M50.36 99.48c25.387 0 23.802-11.008 23.802-11.008l-.028-11.406H49.908v-3.424h33.847S100 75.484 100 49.869 85.821 25.162 85.821 25.162H77.36V37.05s.457 14.178-13.952 14.178H39.38s-13.5-.218-13.5 13.048v21.932s-2.05 13.274 24.48 13.274m13.359-7.669a4.353 4.353 0 0 1-4.358-4.358 4.356 4.356 0 0 1 7.44-3.083 4.36 4.36 0 0 1 .945 4.751 4.355 4.355 0 0 1-4.027 2.69"/><defs><linearGradient id="a" x1="9.61" x2="59.167" y1="8.948" y2="58.011" gradientUnits="userSpaceOnUse"><stop stop-color="#387EB8"/><stop offset="1" stop-color="#366994"/></linearGradient><linearGradient id="b" x1="40.028" x2="93.247" y1="40.453" y2="90.762" gradientUnits="userSpaceOnUse"><stop stop-color="#FFE052"/><stop offset="1" stop-color="#FFC331"/></linearGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#61DAFB" d="M50.307 58.817a8.816 8.816 0 1 0 0-17.632 8.816 8.816 0 0 0 0 17.632"/><path stroke="#61DAFB" stroke-width="5" d="M50.307 68.063c26.126 0 47.306-8.087 47.306-18.062s-21.18-18.063-47.306-18.063C24.18 31.938 3 40.025 3 50.001s21.18 18.062 47.307 18.062Z"/><path stroke="#61DAFB" stroke-width="5" d="M34.664 59.032C47.727 81.658 65.321 95.957 73.96 90.969c8.64-4.988 5.053-27.373-8.01-50C52.885 18.343 35.291 4.044 26.652 9.032s-5.052 27.373 8.011 50Z"/><path stroke="#61DAFB" stroke-width="5" d="M34.664 40.97c-13.063 22.626-16.65 45.011-8.01 50 8.638 4.987 26.232-9.312 39.295-31.938 13.064-22.627 16.65-45.012 8.01-50-8.638-4.988-26.232 9.31-39.295 31.937Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#61DAFB" d="M50.307 58.817a8.816 8.816 0 1 0 0-17.632 8.816 8.816 0 0 0 0 17.632"/><path stroke="#61DAFB" stroke-width="5" d="M50.307 68.063c26.126 0 47.306-8.087 47.306-18.062s-21.18-18.063-47.306-18.063C24.18 31.938 3 40.025 3 50.001s21.18 18.062 47.307 18.062Z"/><path stroke="#61DAFB" stroke-width="5" d="M34.664 59.032C47.727 81.658 65.321 95.957 73.96 90.969c8.64-4.988 5.053-27.373-8.01-50C52.885 18.343 35.291 4.044 26.652 9.032s-5.052 27.373 8.011 50Z"/><path stroke="#61DAFB" stroke-width="5" d="M34.664 40.97c-13.063 22.626-16.65 45.011-8.01 50 8.638 4.987 26.232-9.312 39.295-31.938 13.064-22.627 16.65-45.012 8.01-50-8.638-4.988-26.232 9.31-39.295 31.937Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100.03"><path fill="#fff" d="m99.317 48.775-4.198-2.599a57 57 0 0 0-.12-1.222l3.608-3.366a1.44 1.44 0 0 0 .432-1.338 1.44 1.44 0 0 0-.91-1.072l-4.613-1.725a54 54 0 0 0-.36-1.19l2.876-3.996a1.444 1.444 0 0 0-.94-2.271l-4.864-.791q-.284-.553-.584-1.092l2.043-4.486a1.44 1.44 0 0 0-.112-1.402 1.44 1.44 0 0 0-1.252-.642l-4.935.172a39 39 0 0 0-.78-.946l1.134-4.807a1.444 1.444 0 0 0-1.738-1.74l-4.807 1.134a42 42 0 0 0-.947-.78l.172-4.935a1.44 1.44 0 0 0-1.327-1.492 1.44 1.44 0 0 0-.716.126l-4.484 2.045q-.543-.3-1.092-.586L70.01 4.91a1.446 1.446 0 0 0-2.27-.94l-4 2.877q-.59-.188-1.188-.36l-1.725-4.614a1.442 1.442 0 0 0-2.41-.48l-3.365 3.61a43 43 0 0 0-1.222-.119l-2.6-4.2a1.445 1.445 0 0 0-2.456 0l-2.599 4.2a43 43 0 0 0-1.224.12l-3.366-3.611a1.443 1.443 0 0 0-2.41.48l-1.724 4.613q-.599.173-1.19.36L32.266 3.97a1.44 1.44 0 0 0-1.977.275 1.45 1.45 0 0 0-.294.665l-.793 4.864q-.55.285-1.092.586l-4.485-2.045a1.44 1.44 0 0 0-1.401.114 1.44 1.44 0 0 0-.642 1.252l.172 4.935q-.48.384-.948.78L16 14.263a1.45 1.45 0 0 0-1.723 1.011 1.44 1.44 0 0 0-.016.728l1.132 4.807q-.394.468-.777.946l-4.936-.172a1.45 1.45 0 0 0-1.491 1.328c-.02.245.023.492.125.716l2.045 4.486q-.3.54-.586 1.092l-4.863.79a1.445 1.445 0 0 0-.94 2.272l2.877 3.996q-.189.591-.362 1.19l-4.612 1.725a1.446 1.446 0 0 0-.479 2.41l3.609 3.365q-.068.61-.12 1.223l-4.198 2.6a1.443 1.443 0 0 0 0 2.455l4.198 2.6q.053.613.12 1.222l-3.61 3.367a1.445 1.445 0 0 0 .479 2.41l4.612 1.725q.174.598.362 1.19L3.969 67.74a1.444 1.444 0 0 0 .941 2.27l4.862.792q.285.552.586 1.093L8.313 76.38a1.44 1.44 0 0 0 .656 1.886c.22.112.463.166.71.157l4.933-.172q.386.48.78.947l-1.132 4.809a1.44 1.44 0 0 0 .385 1.35 1.44 1.44 0 0 0 1.354.385l4.806-1.132q.47.397.948.777l-.171 4.937a1.444 1.444 0 0 0 2.042 1.364l4.485-2.043q.542.3 1.092.586l.793 4.86a1.44 1.44 0 0 0 1.593 1.205c.245-.028.478-.118.678-.262l3.996-2.879q.591.189 1.19.362l1.725 4.611a1.44 1.44 0 0 0 1.072.91 1.44 1.44 0 0 0 1.338-.431l3.366-3.609q.61.07 1.223.122l2.6 4.199a1.445 1.445 0 0 0 2.456 0l2.598-4.199q.615-.053 1.223-.122l3.366 3.609a1.44 1.44 0 0 0 1.337.432 1.44 1.44 0 0 0 1.072-.91l1.725-4.612q.599-.173 1.19-.362l3.997 2.88a1.445 1.445 0 0 0 2.27-.943l.793-4.861q.55-.287 1.092-.586l4.484 2.043a1.443 1.443 0 0 0 2.043-1.364l-.171-4.936q.48-.382.946-.778l4.807 1.132c.488.115 1-.028 1.353-.384a1.44 1.44 0 0 0 .385-1.351l-1.132-4.809q.396-.468.777-.947l4.936.172a1.44 1.44 0 0 0 1.252-.64 1.44 1.44 0 0 0 .113-1.404l-2.044-4.483q.3-.543.585-1.094l4.863-.791a1.44 1.44 0 0 0 1.102-.874 1.44 1.44 0 0 0-.162-1.397l-2.877-3.996q.187-.592.362-1.19l4.611-1.725a1.44 1.44 0 0 0 .91-1.072 1.44 1.44 0 0 0-.431-1.338l-3.608-3.366q.066-.61.12-1.222l4.198-2.6a1.44 1.44 0 0 0 .684-1.227c0-.5-.258-.966-.683-1.229M71.218 83.602a2.975 2.975 0 0 1-2.278-3.534 2.966 2.966 0 0 1 3.524-2.283 2.974 2.974 0 0 1 2.28 3.531 2.973 2.973 0 0 1-3.526 2.286m-1.426-9.648a2.71 2.71 0 0 0-3.215 2.082l-1.49 6.956A36.4 36.4 0 0 1 50 86.24a36.4 36.4 0 0 1-15.402-3.394l-1.49-6.956a2.706 2.706 0 0 0-3.214-2.082l-6.14 1.319a36 36 0 0 1-3.176-3.742h29.879c.338 0 .563-.062.563-.37V60.448c0-.308-.225-.37-.563-.37h-8.738V53.38h9.45c.863 0 4.614.246 5.813 5.04.375 1.474 1.2 6.269 1.764 7.804.561 1.722 2.848 5.162 5.286 5.162h14.889q.254-.001.54-.054a37 37 0 0 1-3.387 3.973zm-41.324 9.502a2.97 2.97 0 0 1-3.527-2.282 2.976 2.976 0 0 1 2.28-3.534 2.975 2.975 0 0 1 1.247 5.816m-11.335-45.96a2.975 2.975 0 0 1-1.51 3.923 2.967 2.967 0 0 1-3.919-1.513 2.975 2.975 0 0 1 2.642-4.178 2.97 2.97 0 0 1 2.787 1.767m-3.484 8.257 6.397-2.842a2.71 2.71 0 0 0 1.377-3.578l-1.317-2.979h5.18V59.71H14.834a36.6 36.6 0 0 1-1.393-10.028c0-1.327.072-2.64.21-3.928m28.071-2.268V36.6H54.06c.637 0 4.5.737 4.5 3.625 0 2.398-2.963 3.258-5.4 3.258H41.72m44.84 6.196q0 1.369-.1 2.714h-3.75c-.376 0-.527.247-.527.614v1.723c0 4.055-2.287 4.937-4.29 5.161-1.908.215-4.023-.798-4.284-1.966-1.126-6.33-3.001-7.682-5.963-10.019 3.676-2.334 7.5-5.777 7.5-10.386 0-4.977-3.412-8.112-5.737-9.649-3.263-2.15-6.875-2.582-7.85-2.582H22.765c5.26-5.871 12.39-10.03 20.454-11.543l4.573 4.797a2.703 2.703 0 0 0 3.828.088l5.116-4.894c10.72 1.996 19.798 8.67 25.028 17.825l-3.502 7.912a2.715 2.715 0 0 0 1.377 3.577l6.744 2.995q.177 1.795.178 3.633M47.795 9.667a2.97 2.97 0 0 1 4.198.096 2.977 2.977 0 0 1-.098 4.205 2.965 2.965 0 0 1-4.199-.097 2.977 2.977 0 0 1 .099-4.204m34.759 27.972a2.967 2.967 0 0 1 3.917-1.512 2.975 2.975 0 0 1-1.277 5.692 3 3 0 0 1-1.13-.255 2.98 2.98 0 0 1-1.51-3.925"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#000" d="M66.208 0 50.13 28.574H18L34.064 0z" opacity=".45"/><path fill="#000" d="M50.131 28.574h32.14L66.21 0H34.064z" opacity=".6"/><path fill="#000" d="m34.064 57.134 16.067-28.56L34.064 0 18 28.574z" opacity=".8"/><path fill="#000" d="m34.221 99.997 16.077-28.574H82.44L66.364 99.996z" opacity=".45"/><path fill="#000" d="M50.298 71.423h-32.14L34.22 99.996h32.143z" opacity=".6"/><path fill="#000" d="M66.364 42.86 50.297 71.423l16.067 28.573L82.44 71.423z" opacity=".8"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="url(#a)" d="M22.218 0h55.369c2.694 0 5.31.43 7.848 1.329a22.06 22.06 0 0 1 9.489 6.718 21.9 21.9 0 0 1 4.803 10.703c.234 1.446.273 2.891.273 4.336V77.11c0 1.719-.078 3.476-.43 5.156a22.1 22.1 0 0 1-5.27 10.43c-2.617 2.93-6.053 5.117-9.763 6.289-2.264.703-4.607 1.015-6.99 1.015-1.053 0-55.485 0-56.305-.039a22.3 22.3 0 0 1-11.246-3.71 22.6 22.6 0 0 1-7.614-8.75C.898 84.493.156 81.133.156 77.774V22.227a20.74 20.74 0 0 1 2.07-9.57C3.905 9.14 6.52 6.055 9.762 3.867 13.08 1.603 16.986.275 20.968.08c.39-.079.82-.079 1.25-.079"/><path fill="url(#b)" d="M84.342 81.797a15 15 0 0 0-1.171-1.601 16.6 16.6 0 0 0-3.359-3.047c-1.561-1.055-3.397-1.719-5.27-1.797-1.329-.078-2.656.156-3.906.625-1.25.43-2.46 1.055-3.631 1.68-1.367.703-2.733 1.406-4.178 1.992a31.4 31.4 0 0 1-5.35 1.64c-2.303.43-4.646.587-6.95.547a47 47 0 0 1-12.339-1.875 46.7 46.7 0 0 1-10.035-4.335 52 52 0 0 1-7.77-5.508 57 57 0 0 1-5.545-5.508 60 60 0 0 1-3.358-4.297c-.43-.586-.82-1.211-1.171-1.836L0 47.344V22.15C0 9.922 9.879 0 22.1 0h19.72l14.603 14.844C89.38 37.266 78.72 61.993 78.72 61.993s9.372 10.547 5.623 19.804"/><path fill="#fff" d="M56.501 14.844c32.956 22.422 22.296 47.149 22.296 47.149s9.371 10.586 5.584 19.843c0 0-3.866-6.484-10.348-6.484-6.247 0-9.918 6.484-22.49 6.484-27.997 0-41.234-23.398-41.234-23.398 25.224 16.602 42.444 4.844 42.444 4.844C41.39 56.68 17.22 25.118 17.22 25.118c21.046 17.93 30.144 22.656 30.144 22.656-5.427-4.492-20.656-26.445-20.656-26.445C38.891 33.672 63.1 50.899 63.1 50.899c6.872-19.063-6.599-36.055-6.599-36.055"/><defs><linearGradient id="a" x1="59.465" x2="40.565" y1="-3.568" y2="103.578" gradientUnits="userSpaceOnUse"><stop stop-color="#FAAE42"/><stop offset="1" stop-color="#EF3E31"/></linearGradient><linearGradient id="b" x1="51" x2="37.167" y1="1.616" y2="80.035" gradientUnits="userSpaceOnUse"><stop stop-color="#E39F3A"/><stop offset="1" stop-color="#D33929"/></linearGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="1.78 0 60.42 64.03"><path fill="#f6bd3a" fill-rule="nonzero" d="m27.733 34.453 8.64-5.013 8.533 5.013-8.533 4.907-8.64-4.8zM1.813 19.627 36.373 0 62.08 14.613 53.547 29.44l-17.173-9.813-25.92 14.72z"/><path fill="#eb8c23" fill-rule="nonzero" d="M27.733 54.08v-9.813l8.533-4.907 8.64-4.907v9.813l-8.533 4.907v9.813L27.733 64zm0-19.627-8.64-4.907-8.64 4.8v-9.813l25.92-14.72V29.44zm25.707-9.92v-4.907l8.64-5.013.107 9.813-8.64 5.013z"/><path fill="#e35a2b" fill-rule="nonzero" d="M19.093 58.773V29.547l8.533-4.8.107 9.707 8.64 4.8v9.92l-8.64-4.587V64zM6.08 31.787l-4.267-2.56v-9.6l8.64 4.907v9.813zm30.293-12.16V9.813l17.067 9.813.107 9.813-17.173-9.813z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><path fill="#017ACB" d="M0 0h100v100H0z"/><path fill="#fff" d="M48.016 37.032h4.797v8.281h-12.97v36.844l-.343.094c-.469.124-6.64.124-7.969-.016l-1.062-.094V45.313H17.5v-8.281l4.11-.047c2.25-.031 8.03-.031 12.843 0s10.906.047 13.563.047m36.61 41.219c-1.907 2.015-3.954 3.14-7.36 4.062-1.485.406-1.735.422-5.078.406s-3.61-.015-5.235-.437c-4.203-1.078-7.594-3.188-9.906-6.172-.656-.844-1.734-2.594-1.734-2.813 0-.062.156-.203.359-.296.203-.094.625-.36.969-.563s.968-.578 1.39-.797 1.64-.937 2.703-1.578c1.063-.64 2.032-1.156 2.141-1.156.11 0 .313.219.469.484.937 1.578 3.125 3.594 4.672 4.281.953.407 3.062.86 4.078.86.937 0 2.656-.406 3.578-.828.984-.453 1.484-.907 2.078-1.813.406-.64.453-.812.438-2.031 0-1.125-.063-1.438-.375-1.953-.875-1.438-2.063-2.188-6.875-4.313-4.97-2.203-7.204-3.515-9.016-5.281-1.344-1.312-1.61-1.672-2.453-3.312-1.094-2.11-1.235-2.797-1.25-5.938-.016-2.203.031-2.922.265-3.672.329-1.125 1.391-3.297 1.875-3.844 1-1.171 1.36-1.53 2.063-2.109 2.125-1.75 5.438-2.906 8.61-3.016.359 0 1.546.063 2.656.141 3.187.266 5.359 1.047 7.453 2.719 1.578 1.25 3.968 4.187 3.734 4.578-.156.234-6.39 4.39-6.797 4.516-.25.078-.422-.016-.765-.422-2.125-2.547-2.985-3.094-5.047-3.22-1.469-.093-2.25.079-3.235.735-1.03.688-1.53 1.735-1.53 3.188.015 2.125.827 3.125 3.827 4.61 1.938.952 3.594 1.733 3.719 1.733.188 0 4.203 2 5.25 2.626 4.875 2.859 6.86 5.796 7.375 10.859.375 3.812-.703 7.297-3.047 9.766"/></svg>
@@ -0,0 +1,55 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v6.4.5"><meta name="theme-color" content="#0a0a0c" media="(prefers-color-scheme: dark)"><meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)"><link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%2318181b'/%3E%3C/svg%3E"><link rel="sitemap" href="/sitemap.xml"><link rel="alternate" type="text/plain" href="/llms.txt" title="LLM usage guidance"><!-- Primary meta --><title>Grove Directory — A curated, health-aware developer directory.</title><meta name="description" content="A curated, health-aware developer directory powered by Grove."><link rel="canonical" href="https://example.com/"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://example.com/"><meta property="og:title" content="Grove Directory — A curated, health-aware developer directory."><meta property="og:description" content="A curated, health-aware developer directory powered by Grove."><meta property="og:image" content="https://example.com/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><meta property="og:site_name" content="Grove Directory"><meta property="og:locale" content="en"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Grove Directory — A curated, health-aware developer directory."><meta name="twitter:description" content="A curated, health-aware developer directory powered by Grove."><meta name="twitter:image" content="https://example.com/og-image.svg"><meta name="twitter:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><!-- JSON-LD: site-wide identity --><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Grove Directory","description":"A curated, health-aware developer directory powered by Grove.","url":"https://example.com","inLanguage":"en","potentialAction":{"@type":"SearchAction","target":"https://example.com/projects?q={search_term_string}","query-input":"required name=search_term_string"}}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Grove Directory","url":"https://example.com","logo":"https://example.com/og-image.svg","sameAs":["https://github.com/tortuvshin/grove"]}</script><!-- JSON-LD: per-page (SoftwareSourceCode for [slug], etc.) --><script>
2
+ // THEME_INIT — runs before paint so the user never sees a
3
+ // flash of the wrong theme. State is persisted in localStorage
4
+ // under the key "grove-theme" (matching ThemeToggle.astro).
5
+ (function () {
6
+ var STORAGE_KEY = "grove-theme";
7
+ function getMode() {
8
+ try {
9
+ var stored = localStorage.getItem(STORAGE_KEY);
10
+ if (stored === "light" || stored === "dark" || stored === "system")
11
+ return stored;
12
+ } catch (e) {
13
+ // localStorage may be blocked (private mode, etc.) —
14
+ // fall through to the system default.
15
+ }
16
+ return "system";
17
+ }
18
+ function apply(mode) {
19
+ var resolved =
20
+ mode === "system"
21
+ ? (window.matchMedia("(prefers-color-scheme: dark)").matches
22
+ ? "dark"
23
+ : "light")
24
+ : mode;
25
+ var root = document.documentElement;
26
+ if (resolved === "dark") root.classList.add("dark");
27
+ else root.classList.remove("dark");
28
+ root.dataset.theme = mode;
29
+ root.dataset.resolvedTheme = resolved;
30
+ }
31
+ apply(getMode());
32
+ window.addEventListener("theme:set", function (e) {
33
+ apply(e.detail);
34
+ });
35
+ var mq = window.matchMedia("(prefers-color-scheme: dark)");
36
+ mq.addEventListener("change", function () {
37
+ if (getMode() === "system") apply("system");
38
+ });
39
+ })();
40
+ </script><link rel="stylesheet" href="/_astro/BaseLayout.Dz_HR-68.css">
41
+ <style>.grove-hero__gradient[data-astro-cid-qbosetkn]{background:linear-gradient(120deg,#1f6feb14,#6ee7b70f 35%,#fdba740f 65%,#93c5fd14);background-size:200% 200%;animation:var(--animate-gradient-shift, gradient-shift 8s ease-in-out infinite)}.dark .grove-hero__gradient[data-astro-cid-qbosetkn]{background:linear-gradient(120deg,#1f6feb2e,#065f461f 35%,#4314071f 65%,#1e40af2e);background-size:200% 200%}.grove-item-card[data-astro-cid-c5cxvqkr]{display:flex;flex-direction:column;gap:.25rem;height:100%}.line-clamp-2[data-astro-cid-c5cxvqkr],.line-clamp-2[data-astro-cid-wy3j7qop],.line-clamp-2[data-astro-cid-tsjw7eqr]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.line-clamp-1[data-astro-cid-ytjnxdza]{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}
42
+ </style></head> <body class="min-h-screen bg-white text-ink-900 dark:bg-ink-950 dark:text-ink-100"> <header class="sticky top-0 z-50 border-b border-ink-200 bg-white/85 backdrop-blur dark:border-ink-800 dark:bg-ink-950/85"> <div class="mx-auto flex max-w-wide items-center gap-6 px-5 py-3 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <a href="/" class="inline-flex items-center gap-2 text-[0.95rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-[18px] w-[18px] rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </a> <nav class="hidden flex-1 md:block" aria-label="Primary"> <ul class="m-0 flex list-none gap-5 p-0"> <li> <a href="/" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Home </a> </li><li> <a href="/projects" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Browse </a> </li><li> <a href="/about" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> About </a> </li> </ul> </nav> <div class="ml-auto flex items-center gap-2"> <a href="/submit" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true" fill="currentColor"> <path d="M7.75 2a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 7.75 2Z"></path> </svg> <span>Submit project</span> </a> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" aria-label="Star" title="Star" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38v-1.33c-2.22.48-2.69-1.07-2.69-1.07-.36-.92-.89-1.17-.89-1.17-.73-.5.05-.49.05-.49.8.06 1.23.83 1.23.83.72 1.22 1.87.87 2.33.67.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48v2.19c0 .21.15.46.55.38A8 8 0 0 0 8 0Z"></path> </svg> <span>Star</span> </a> <button type="button" data-theme-toggle aria-label="Toggle theme" title="Toggle theme" class="relative inline-flex h-8 w-8 items-center justify-center rounded-md border border-ink-200 bg-white text-ink-700 transition-colors hover:border-ink-300 hover:bg-ink-50 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200 dark:hover:border-ink-700 dark:hover:bg-ink-900/40"> <svg class="hidden h-4 w-4 dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="4"></circle> <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"></path> </svg> <svg class="block h-4 w-4 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"></path> </svg> </button> <script type="module">const c="grove-theme";function o(){try{const e=localStorage.getItem(c);return e==="light"||e==="dark"||e==="system"?e:"system"}catch{return"system"}}function s(){const e=["light","dark","system"],n=o(),r=e[(e.indexOf(n)+1)%e.length];try{localStorage.setItem(c,r)}catch{}return window.dispatchEvent(new CustomEvent("theme:set",{detail:r})),r}function t(e){e.title=`Theme: ${o()} (click to switch)`}document.querySelectorAll("[data-theme-toggle]").forEach(e=>{t(e),e.addEventListener("click",()=>{s(),t(e)}),e.addEventListener("mouseenter",()=>t(e)),e.addEventListener("focus",()=>t(e))});</script> </div> </div> </header> <script type="module">document.addEventListener("click",t=>{if(t.defaultPrevented||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.button!==0)return;const r=t.target.closest('a[href^="#"]');if(!r)return;const e=r.getAttribute("href");if(e.length<=1)return;const n=document.querySelector(e);n&&(t.preventDefault(),n.scrollIntoView({behavior:"smooth",block:"start"}),history.replaceState(null,"",e))});</script> <main> <section class="grove-hero relative overflow-hidden border-b border-ink-200 dark:border-ink-800" aria-labelledby="grove-hero-heading" data-astro-cid-qbosetkn> <div aria-hidden="true" class="grove-hero__gradient pointer-events-none absolute inset-0 -z-10" data-astro-cid-qbosetkn></div> <div class="grove-container-wide mx-auto px-5 py-16 sm:px-7 sm:py-20" data-astro-cid-qbosetkn> <div class="max-w-3xl" data-astro-cid-qbosetkn> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400" data-astro-cid-qbosetkn> Curated directory </span> <h1 id="grove-hero-heading" class="m-0 mt-2 text-[2.25rem] font-semibold leading-[1.05] tracking-tight text-ink-900 sm:text-[3rem] dark:text-ink-100" data-astro-cid-qbosetkn> Grove Directory </h1> <p class="m-0 mt-4 max-w-2xl text-lg leading-relaxed text-ink-700 dark:text-ink-200" data-astro-cid-qbosetkn> A curated, health-aware developer directory. </p> <p class="m-0 mt-2 max-w-2xl text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400" data-astro-cid-qbosetkn> A curated, health-aware developer directory powered by Grove. </p> <form class="mt-8 flex flex-col gap-2 sm:flex-row sm:items-center" role="search" action="/projects" method="get" data-grove-hero-search data-astro-cid-qbosetkn> <label class="relative flex-1" data-astro-cid-qbosetkn> <span class="sr-only" data-astro-cid-qbosetkn>Search</span> <svg aria-hidden="true" viewBox="0 0 16 16" width="14" height="14" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-ink-400" fill="currentColor" data-astro-cid-qbosetkn> <path d="M10.68 11.74a6 6 0 1 1 1.06-1.06l3.04 3.04a.75.75 0 1 1-1.06 1.06l-3.04-3.04ZM11.5 7a4.5 4.5 0 1 0-9 0 4.5 4.5 0 0 0 9 0Z" data-astro-cid-qbosetkn></path> </svg> <input type="search" name="q" placeholder="Search projects..." autocomplete="off" class="w-full rounded-md border border-ink-200 bg-white py-2.5 pl-9 pr-3 text-sm placeholder:text-ink-400 focus:border-ink-900 focus:outline-none focus:ring-2 focus:ring-ink-900/10 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-100" data-astro-cid-qbosetkn> </label> <button type="submit" class="grove-btn grove-btn-primary" data-astro-cid-qbosetkn>
43
+ Search
44
+ </button> </form> <div class="mt-4 flex flex-wrap items-center gap-2" data-astro-cid-qbosetkn> <a href="/projects" class="grove-btn grove-btn-primary" data-event="hero_cta_click" data-event-source="hero" data-astro-cid-qbosetkn> Browse projects </a><a href="/about" class="grove-btn grove-btn-outline" data-event="hero_cta_click" data-event-source="hero" data-astro-cid-qbosetkn> About </a> </div> <dl class="mt-10 flex flex-wrap items-center gap-x-6 gap-y-3 text-2xs text-ink-500 dark:text-ink-400" aria-label="Directory statistics" data-astro-cid-qbosetkn> <div class="flex items-baseline gap-1.5" data-astro-cid-qbosetkn> <dd class="m-0 font-mono text-base font-semibold text-ink-900 dark:text-ink-100" data-astro-cid-qbosetkn> 0 </dd> <dt data-astro-cid-qbosetkn>apps</dt> </div> <div class="flex items-baseline gap-1.5" data-astro-cid-qbosetkn> <dd class="m-0 font-mono text-base font-semibold text-ink-900 dark:text-ink-100" data-astro-cid-qbosetkn> 0 </dd> <dt data-astro-cid-qbosetkn>categories</dt> </div> <div class="flex items-baseline gap-1.5" data-astro-cid-qbosetkn> <dd class="m-0 font-mono text-base font-semibold text-ink-900 dark:text-ink-100" data-astro-cid-qbosetkn> 0 </dd> <dt data-astro-cid-qbosetkn>stacks</dt> </div> </dl> </div> </div> </section> <section class="grove-section" aria-labelledby="grove-why-heading"> <div class="grove-container mx-auto px-5 sm:px-7"> <header class="mb-8 flex flex-col items-center gap-2 text-center"> <h2 id="grove-why-heading" class="m-0 text-[1.5rem] sm:text-[1.625rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Why this directory exists </h2> <p class="m-0 max-w-2xl text-[0.9375rem] text-ink-500 dark:text-ink-400"> A short note on the point of all this. </p> </header> <ol class="m-0 grid list-none grid-cols-1 gap-6 p-0 md:grid-cols-3" aria-label="Why this directory"> <li class="flex flex-col items-center gap-2 text-center"> <span aria-hidden="true" class="inline-flex h-10 w-10 items-center justify-center rounded-full border border-ink-200 bg-white text-ink-700 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200"> <svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor"> <path d="M1.75 3.5a.25.25 0 0 1 .25-.25h12a.25.25 0 0 1 .25.25v8a.25.25 0 0 1-.25.25h-12a.25.25 0 0 1-.25-.25v-8ZM2 4.75v6h12v-6H2ZM2.5 6.5h4v2.5h-4V6.5Z"></path> </svg> </span> <span aria-hidden="true" class="font-mono text-2xs text-ink-400 dark:text-ink-500">
45
+ 01 </span> <h3 class="m-0 text-base font-semibold tracking-tight text-ink-900 dark:text-ink-100"> A curated starting point </h3> <p class="m-0 max-w-xs text-[0.875rem] leading-relaxed text-ink-500 dark:text-ink-400"> Skip the rabbit holes. Every entry here is something a real developer reached for, vetted for quality and longevity. </p> </li><li class="flex flex-col items-center gap-2 text-center"> <span aria-hidden="true" class="inline-flex h-10 w-10 items-center justify-center rounded-full border border-ink-200 bg-white text-ink-700 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200"> <svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor"> <path d="M4.72 3.22a.75.75 0 0 1 1.06 1.06L2.06 8l3.72 3.72a.75.75 0 1 1-1.06 1.06L.47 8.53a.75.75 0 0 1 0-1.06l4.25-4.25Zm6.56 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L13.94 8l-3.72-3.72a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span aria-hidden="true" class="font-mono text-2xs text-ink-400 dark:text-ink-500">
46
+ 02 </span> <h3 class="m-0 text-base font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Real, runnable source </h3> <p class="m-0 max-w-xs text-[0.875rem] leading-relaxed text-ink-500 dark:text-ink-400"> Every project links back to its source. Skim, fork, learn — no paywalls, no broken download links. </p> </li><li class="flex flex-col items-center gap-2 text-center"> <span aria-hidden="true" class="inline-flex h-10 w-10 items-center justify-center rounded-full border border-ink-200 bg-white text-ink-700 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200"> <svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor"> <path d="M10.68 11.74a6 6 0 1 1 1.06-1.06l3.04 3.04a.75.75 0 1 1-1.06 1.06l-3.04-3.04ZM11.5 7a4.5 4.5 0 1 0-9 0 4.5 4.5 0 0 0 9 0Z"></path> </svg> </span> <span aria-hidden="true" class="font-mono text-2xs text-ink-400 dark:text-ink-500">
47
+ 03 </span> <h3 class="m-0 text-base font-semibold tracking-tight text-ink-900 dark:text-ink-100"> Search that respects you </h3> <p class="m-0 max-w-xs text-[0.875rem] leading-relaxed text-ink-500 dark:text-ink-400"> Filter by stack, platform, license, or status. No SEO spam, no affiliate farms. The directory is the product. </p> </li> </ol> </div> </section> <section id="hot" class="grove-section" aria-labelledby="hot-heading"> <div class="grove-container-wide mx-auto px-5 sm:px-7"> <header class="mb-6 flex flex-col gap-2"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400"> Hot </span> <div class="flex flex-wrap items-end justify-between gap-3"> <h2 class="m-0 text-[1.5rem] sm:text-[1.625rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">Trending</h2> <a href="/projects?lens=hot" class="text-sm font-medium text-ink-500 hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> View all →
48
+ </a> </div> <p class="m-0 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400 max-w-[56ch]"> The projects getting attention right now — high-star repos and recently active codebases. </p> </header> <p class="m-0 text-sm text-ink-500 dark:text-ink-400">No trending projects yet.</p> </div> </section> <section id="new" class="grove-section" aria-labelledby="new-heading"> <div class="grove-container-wide mx-auto px-5 sm:px-7"> <header class="mb-6 flex flex-col gap-2"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400"> New </span> <div class="flex flex-wrap items-end justify-between gap-3"> <h2 class="m-0 text-[1.5rem] sm:text-[1.625rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">Recently added</h2> <a href="/projects?lens=new" class="text-sm font-medium text-ink-500 hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> View all →
49
+ </a> </div> <p class="m-0 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400 max-w-[56ch]"> Fresh entries — pushed within the last week or carrying the curated &#39;new&#39; label. </p> </header> <p class="m-0 text-sm text-ink-500 dark:text-ink-400">No new projects yet.</p> </div> </section> <section id="mature" class="grove-section" aria-labelledby="mature-heading"> <div class="grove-container-wide mx-auto px-5 sm:px-7"> <header class="mb-6 flex flex-col gap-2"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400"> Mature </span> <div class="flex flex-wrap items-end justify-between gap-3"> <h2 class="m-0 text-[1.5rem] sm:text-[1.625rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">Established</h2> <a href="/projects?lens=mature" class="text-sm font-medium text-ink-500 hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> View all →
50
+ </a> </div> <p class="m-0 text-[0.9375rem] leading-relaxed text-ink-500 dark:text-ink-400 max-w-[56ch]"> Long-running curated projects with deep history and stable architecture. </p> </header> <p class="m-0 text-sm text-ink-500 dark:text-ink-400">No established projects yet.</p> </div> </section> <section class="grove-section"> <div class="grove-container mx-auto px-5 sm:px-7"> <div class="grove-card flex flex-col gap-4 p-6 sm:flex-row sm:items-center sm:justify-between"> <div class="flex flex-col gap-2"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
51
+ Origin
52
+ </span> <h2 class="m-0 text-[1.25rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> A growing list, forked from the original </h2> <p class="m-0 max-w-2xl text-[0.875rem] text-ink-500 dark:text-ink-400"> This directory descends from an earlier curated collection. The original still lives on — same shape, same spirit, fresh data. </p> </div> <div class="flex flex-shrink-0 items-center gap-2"> <a href="https://github.com/example/repo" target="_blank" rel="noopener noreferrer" class="grove-btn grove-btn-primary" data-event="original_collection_click" data-event-source="original_collection"> View on GitHub →
53
+ </a> </div> </div> </div> </section> </main> <footer class="mt-16 border-t border-ink-200 bg-white text-ink-500 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-400"> <div class="mx-auto grid max-w-wide grid-cols-2 gap-8 px-5 py-12 md:grid-cols-4 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <div class="col-span-2 md:col-span-1"> <div class="mb-2 inline-flex items-center gap-2 text-[0.95rem] font-semibold text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-3.5 w-3.5 rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </div> <p class="m-0 max-w-[36ch] text-[0.8125rem] leading-relaxed text-ink-500 dark:text-ink-400"> A curated, health-aware developer directory. </p> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Discover </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Source on GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/releases" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Latest release </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Contribute </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Submit via GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/issues" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Report an issue </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Contributing guide </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Project </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/README.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> README </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CHANGELOG.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Changelog </a> </li> </ul> </div> </div> <div class="border-t border-ink-200 dark:border-ink-800"> <div class="mx-auto flex max-w-wide flex-wrap items-center gap-3 px-5 py-4 text-2xs text-ink-500 sm:px-7 dark:text-ink-400" style="max-width: var(--container-wide, 1400px);"> <span>© 2026 Grove Directory.</span> <span class="text-ink-300 dark:text-ink-700">·</span> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" class="transition-colors hover:text-ink-900 dark:hover:text-ink-100">
54
+ View source on GitHub
55
+ </a> </div> </div> </footer> </body> </html>
@@ -0,0 +1,14 @@
1
+ # Grove Directory — full directory
2
+
3
+ > Generated 2026-06-10T15:03:23.841Z from 0 records.
4
+ > Source: https://example.com/projects · Regenerate with `grove generate`.
5
+
6
+ Each section below mirrors one record detail page.
7
+
8
+ ## Index
9
+
10
+
11
+
12
+
13
+
14
+
@@ -0,0 +1,11 @@
1
+ # Grove Directory
2
+
3
+ A curated, health-aware developer directory powered by Grove.
4
+
5
+ Directory: https://example.com/projects
6
+ Records indexed: 0
7
+ Categories: 0
8
+
9
+ ## Usage
10
+
11
+ Use /llms-full.txt for record-level details. Prefer detail pages for citations.
@@ -0,0 +1,48 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" width="1200" height="630">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0%" stop-color="#0a0a0c"/>
5
+ <stop offset="100%" stop-color="#18181b"/>
6
+ </linearGradient>
7
+ <linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0%" stop-color="#1f6feb"/>
9
+ <stop offset="100%" stop-color="#6ee7b7"/>
10
+ </linearGradient>
11
+ <radialGradient id="glow1" cx="0.15" cy="0.2" r="0.5">
12
+ <stop offset="0%" stop-color="#1f6feb" stop-opacity="0.25"/>
13
+ <stop offset="100%" stop-color="#1f6feb" stop-opacity="0"/>
14
+ </radialGradient>
15
+ <radialGradient id="glow2" cx="0.85" cy="0.9" r="0.5">
16
+ <stop offset="0%" stop-color="#fb923c" stop-opacity="0.18"/>
17
+ <stop offset="100%" stop-color="#fb923c" stop-opacity="0"/>
18
+ </radialGradient>
19
+ </defs>
20
+ <rect width="1200" height="630" fill="url(#bg)"/>
21
+ <rect width="1200" height="630" fill="url(#glow1)"/>
22
+ <rect width="1200" height="630" fill="url(#glow2)"/>
23
+ <g transform="translate(96,96)">
24
+ <rect width="48" height="48" rx="9" fill="#fafafa"/>
25
+ </g>
26
+ <g transform="translate(96,260)">
27
+ <text x="0" y="0" font-family="ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="84" font-weight="700" fill="#fafafa" letter-spacing="-2.5">
28
+ Open Curated
29
+ </text>
30
+ <text x="0" y="84" font-family="ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="32" font-weight="400" fill="#a1a1aa">
31
+ A directory of real open-source projects
32
+ </text>
33
+ <text x="0" y="132" font-family="ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="32" font-weight="400" fill="#a1a1aa">
34
+ you can run, study, and contribute to.
35
+ </text>
36
+ </g>
37
+ <g transform="translate(96,520)">
38
+ <rect x="0" y="0" width="200" height="56" rx="10" fill="none" stroke="#3f3f46" stroke-width="1.5"/>
39
+ <text x="100" y="36" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" font-size="22" font-weight="500" fill="#d4d4d8">
40
+ open-curated.dev
41
+ </text>
42
+ </g>
43
+ <g transform="translate(820,520)">
44
+ <text x="0" y="36" font-family="ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" font-size="22" font-weight="500" fill="url(#accent)">
45
+ 79 apps · 4.3k stars
46
+ </text>
47
+ </g>
48
+ </svg>
@@ -0,0 +1,61 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v6.4.5"><meta name="theme-color" content="#0a0a0c" media="(prefers-color-scheme: dark)"><meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)"><link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%2318181b'/%3E%3C/svg%3E"><link rel="sitemap" href="/sitemap.xml"><link rel="alternate" type="text/plain" href="/llms.txt" title="LLM usage guidance"><!-- Primary meta --><title>Browse projects — Grove Directory</title><meta name="description" content="A searchable directory of projects for Grove Directory."><link rel="canonical" href="https://example.com/projects/"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://example.com/projects/"><meta property="og:title" content="Browse projects — Grove Directory"><meta property="og:description" content="A searchable directory of projects for Grove Directory."><meta property="og:image" content="https://example.com/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><meta property="og:site_name" content="Grove Directory"><meta property="og:locale" content="en"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Browse projects — Grove Directory"><meta name="twitter:description" content="A searchable directory of projects for Grove Directory."><meta name="twitter:image" content="https://example.com/og-image.svg"><meta name="twitter:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><!-- JSON-LD: site-wide identity --><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Grove Directory","description":"A curated, health-aware developer directory powered by Grove.","url":"https://example.com","inLanguage":"en","potentialAction":{"@type":"SearchAction","target":"https://example.com/projects?q={search_term_string}","query-input":"required name=search_term_string"}}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Grove Directory","url":"https://example.com","logo":"https://example.com/og-image.svg","sameAs":["https://github.com/tortuvshin/grove"]}</script><!-- JSON-LD: per-page (SoftwareSourceCode for [slug], etc.) --><script>
2
+ // THEME_INIT — runs before paint so the user never sees a
3
+ // flash of the wrong theme. State is persisted in localStorage
4
+ // under the key "grove-theme" (matching ThemeToggle.astro).
5
+ (function () {
6
+ var STORAGE_KEY = "grove-theme";
7
+ function getMode() {
8
+ try {
9
+ var stored = localStorage.getItem(STORAGE_KEY);
10
+ if (stored === "light" || stored === "dark" || stored === "system")
11
+ return stored;
12
+ } catch (e) {
13
+ // localStorage may be blocked (private mode, etc.) —
14
+ // fall through to the system default.
15
+ }
16
+ return "system";
17
+ }
18
+ function apply(mode) {
19
+ var resolved =
20
+ mode === "system"
21
+ ? (window.matchMedia("(prefers-color-scheme: dark)").matches
22
+ ? "dark"
23
+ : "light")
24
+ : mode;
25
+ var root = document.documentElement;
26
+ if (resolved === "dark") root.classList.add("dark");
27
+ else root.classList.remove("dark");
28
+ root.dataset.theme = mode;
29
+ root.dataset.resolvedTheme = resolved;
30
+ }
31
+ apply(getMode());
32
+ window.addEventListener("theme:set", function (e) {
33
+ apply(e.detail);
34
+ });
35
+ var mq = window.matchMedia("(prefers-color-scheme: dark)");
36
+ mq.addEventListener("change", function () {
37
+ if (getMode() === "system") apply("system");
38
+ });
39
+ })();
40
+ </script><link rel="stylesheet" href="/_astro/BaseLayout.Dz_HR-68.css">
41
+ <style>.line-clamp-2[data-astro-cid-ilaxscvv]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
42
+ </style></head> <body class="min-h-screen bg-white text-ink-900 dark:bg-ink-950 dark:text-ink-100"> <header class="sticky top-0 z-50 border-b border-ink-200 bg-white/85 backdrop-blur dark:border-ink-800 dark:bg-ink-950/85"> <div class="mx-auto flex max-w-wide items-center gap-6 px-5 py-3 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <a href="/" class="inline-flex items-center gap-2 text-[0.95rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-[18px] w-[18px] rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </a> <nav class="hidden flex-1 md:block" aria-label="Primary"> <ul class="m-0 flex list-none gap-5 p-0"> <li> <a href="/" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Home </a> </li><li> <a href="/projects" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Browse </a> </li><li> <a href="/about" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> About </a> </li> </ul> </nav> <div class="ml-auto flex items-center gap-2"> <a href="/submit" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true" fill="currentColor"> <path d="M7.75 2a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 7.75 2Z"></path> </svg> <span>Submit project</span> </a> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" aria-label="Star" title="Star" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38v-1.33c-2.22.48-2.69-1.07-2.69-1.07-.36-.92-.89-1.17-.89-1.17-.73-.5.05-.49.05-.49.8.06 1.23.83 1.23.83.72 1.22 1.87.87 2.33.67.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48v2.19c0 .21.15.46.55.38A8 8 0 0 0 8 0Z"></path> </svg> <span>Star</span> </a> <button type="button" data-theme-toggle aria-label="Toggle theme" title="Toggle theme" class="relative inline-flex h-8 w-8 items-center justify-center rounded-md border border-ink-200 bg-white text-ink-700 transition-colors hover:border-ink-300 hover:bg-ink-50 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200 dark:hover:border-ink-700 dark:hover:bg-ink-900/40"> <svg class="hidden h-4 w-4 dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="4"></circle> <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"></path> </svg> <svg class="block h-4 w-4 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"></path> </svg> </button> <script type="module">const c="grove-theme";function o(){try{const e=localStorage.getItem(c);return e==="light"||e==="dark"||e==="system"?e:"system"}catch{return"system"}}function s(){const e=["light","dark","system"],n=o(),r=e[(e.indexOf(n)+1)%e.length];try{localStorage.setItem(c,r)}catch{}return window.dispatchEvent(new CustomEvent("theme:set",{detail:r})),r}function t(e){e.title=`Theme: ${o()} (click to switch)`}document.querySelectorAll("[data-theme-toggle]").forEach(e=>{t(e),e.addEventListener("click",()=>{s(),t(e)}),e.addEventListener("mouseenter",()=>t(e)),e.addEventListener("focus",()=>t(e))});</script> </div> </div> </header> <script type="module">document.addEventListener("click",t=>{if(t.defaultPrevented||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.button!==0)return;const r=t.target.closest('a[href^="#"]');if(!r)return;const e=r.getAttribute("href");if(e.length<=1)return;const n=document.querySelector(e);n&&(t.preventDefault(),n.scrollIntoView({behavior:"smooth",block:"start"}),history.replaceState(null,"",e))});</script> <main> <section class="grove-section-tight border-b border-ink-200 dark:border-ink-800"> <div class="grove-container-wide mx-auto px-5 pt-10 sm:px-7 sm:pt-12"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400"> projects </span> <h1 class="m-0 mt-1 text-[1.875rem] sm:text-[2.125rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100">
43
+ Browse projects </h1> <p class="m-0 mt-2 max-w-[64ch] text-[0.9375rem] text-ink-500 dark:text-ink-400">
44
+ Search, filter, and explore 0 projects in this directory.
45
+ </p> <div class="mt-6"> <nav class="grove-lens-tabs flex flex-wrap items-center gap-1.5" aria-label="Curated views"> <a href="/projects" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-primary" aria-current="page" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> All </a><a href="/projects?lens=hot" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-ghost border border-ink-200 dark:border-ink-800" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> Trending </a><a href="/projects?lens=new" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-ghost border border-ink-200 dark:border-ink-800" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> Recently added </a><a href="/projects?lens=mature" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-ghost border border-ink-200 dark:border-ink-800" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> Established </a><a href="/projects?lens=featured" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-ghost border border-ink-200 dark:border-ink-800" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> Featured </a><a href="/projects?lens=needs-review" class="grove-btn rounded-md px-3 py-1.5 text-2xs font-medium transition-colors grove-btn-ghost border border-ink-200 dark:border-ink-800" data-event="lens_tab_click" data-event-source="smart_lens_tabs"> Needs review </a> </nav> </div> <div class="mt-5"> <form method="get" action="/projects" class="grove-refine-panel flex flex-wrap items-end gap-3" data-grove-refine-panel> <label class="flex flex-col gap-1"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
46
+ Sort
47
+ </span> <select name="sort" onchange="this.form?.requestSubmit()" class="grove-select min-w-[12rem] rounded-md border border-ink-200 bg-white py-1.5 pl-2 pr-7 text-sm focus:border-ink-900 focus:outline-none focus:ring-2 focus:ring-ink-900/10 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-100"> <option value="recently-updated"> Recently updated </option><option value="most-starred"> Most starred </option><option value="recently-added"> Recently added </option><option value="best-overall"> Best overall </option><option value="alphabetical"> Alphabetical </option> </select> </label> <noscript> <button type="submit" class="grove-btn grove-btn-outline">
48
+ Apply
49
+ </button> </noscript> </form> </div> </div> </section> <section class="grove-section-tight"> <div class="grove-container-wide mx-auto px-5 sm:px-7"> <div class="mb-4 flex flex-wrap items-baseline justify-between gap-2"> <p class="m-0 text-2xs text-ink-500 dark:text-ink-400">
50
+ Showing
51
+ <span class="ml-1 font-mono text-ink-900 dark:text-ink-100"> 0 </span>
52
+ –
53
+ <span class="font-mono text-ink-900 dark:text-ink-100"> 0 </span>
54
+ of
55
+ <span class="ml-1 font-mono text-ink-900 dark:text-ink-100"> 0 </span> projects </p> </div> <div class="flex flex-col items-center gap-2 py-16 text-center"> <p class="m-0 text-[0.9375rem] font-medium text-ink-700 dark:text-ink-200">
56
+ No projects match these filters.
57
+ </p> <a href="/projects" class="mt-3 text-sm text-ink-500 hover:text-ink-900 dark:hover:text-ink-100">
58
+ Clear all filters
59
+ </a> </div> </div> </section> </main> <footer class="mt-16 border-t border-ink-200 bg-white text-ink-500 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-400"> <div class="mx-auto grid max-w-wide grid-cols-2 gap-8 px-5 py-12 md:grid-cols-4 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <div class="col-span-2 md:col-span-1"> <div class="mb-2 inline-flex items-center gap-2 text-[0.95rem] font-semibold text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-3.5 w-3.5 rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </div> <p class="m-0 max-w-[36ch] text-[0.8125rem] leading-relaxed text-ink-500 dark:text-ink-400"> A curated, health-aware developer directory. </p> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Discover </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Source on GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/releases" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Latest release </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Contribute </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Submit via GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/issues" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Report an issue </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Contributing guide </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Project </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/README.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> README </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CHANGELOG.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Changelog </a> </li> </ul> </div> </div> <div class="border-t border-ink-200 dark:border-ink-800"> <div class="mx-auto flex max-w-wide flex-wrap items-center gap-3 px-5 py-4 text-2xs text-ink-500 sm:px-7 dark:text-ink-400" style="max-width: var(--container-wide, 1400px);"> <span>© 2026 Grove Directory.</span> <span class="text-ink-300 dark:text-ink-700">·</span> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" class="transition-colors hover:text-ink-900 dark:hover:text-ink-100">
60
+ View source on GitHub
61
+ </a> </div> </div> </footer> </body> </html>
@@ -0,0 +1,53 @@
1
+ # robots.txt for open-curated.dev
2
+ #
3
+ # Search engines, AI crawlers, and link preview bots are all welcome.
4
+ # The directory is intended to be fully indexable.
5
+ #
6
+ # The /submit path is a thin wrapper that POSTs to GitHub Issues —
7
+ # it carries no indexable content of its own, so we disallow it here
8
+ # (the page also serves `noindex,nofollow` as a belt-and-suspenders).
9
+
10
+ User-agent: *
11
+ Allow: /
12
+ Disallow: /submit
13
+
14
+ # LLM/AI crawlers — explicitly welcome. The curated per-app metadata
15
+ # is the primary audience for the /llms.txt and /llms-full.txt files.
16
+ User-agent: GPTBot
17
+ Allow: /
18
+
19
+ User-agent: ChatGPT-User
20
+ Allow: /
21
+
22
+ User-agent: ClaudeBot
23
+ Allow: /
24
+
25
+ User-agent: Claude-Web
26
+ Allow: /
27
+
28
+ User-agent: anthropic-ai
29
+ Allow: /
30
+
31
+ User-agent: PerplexityBot
32
+ Allow: /
33
+
34
+ User-agent: Google-Extended
35
+ Allow: /
36
+
37
+ User-agent: Applebot-Extended
38
+ Allow: /
39
+
40
+ User-agent: cohere-ai
41
+ Allow: /
42
+
43
+ User-agent: CCBot
44
+ Allow: /
45
+
46
+ User-agent: Amazonbot
47
+ Allow: /
48
+
49
+ # Sitemaps
50
+ Sitemap: https://example.com/sitemap.xml
51
+
52
+ # LLM context
53
+ LLM-Content: https://example.com/llms.txt
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://example.com/</loc>
5
+ <lastmod>2026-06-11</lastmod>
6
+ <changefreq>daily</changefreq>
7
+ <priority>1.0</priority>
8
+ </url>
9
+ <url>
10
+ <loc>https://example.com/about</loc>
11
+ <lastmod>2026-06-11</lastmod>
12
+ <changefreq>monthly</changefreq>
13
+ <priority>0.5</priority>
14
+ </url>
15
+ <url>
16
+ <loc>https://example.com/submit</loc>
17
+ <lastmod>2026-06-11</lastmod>
18
+ <changefreq>yearly</changefreq>
19
+ <priority>0.3</priority>
20
+ </url>
21
+ </urlset>
@@ -0,0 +1,69 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v6.4.5"><meta name="theme-color" content="#0a0a0c" media="(prefers-color-scheme: dark)"><meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)"><link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%2318181b'/%3E%3C/svg%3E"><link rel="sitemap" href="/sitemap.xml"><link rel="alternate" type="text/plain" href="/llms.txt" title="LLM usage guidance"><!-- Primary meta --><title>Submit a project — Grove Directory</title><meta name="description" content="Submit a new project to Grove Directory."><link rel="canonical" href="https://example.com/submit/"><meta name="robots" content="noindex,nofollow"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://example.com/submit/"><meta property="og:title" content="Submit a project — Grove Directory"><meta property="og:description" content="Submit a new project to Grove Directory."><meta property="og:image" content="https://example.com/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><meta property="og:site_name" content="Grove Directory"><meta property="og:locale" content="en"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Submit a project — Grove Directory"><meta name="twitter:description" content="Submit a new project to Grove Directory."><meta name="twitter:image" content="https://example.com/og-image.svg"><meta name="twitter:image:alt" content="Grove Directory — A curated, health-aware developer directory powered by Grove."><!-- JSON-LD: site-wide identity --><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Grove Directory","description":"A curated, health-aware developer directory powered by Grove.","url":"https://example.com","inLanguage":"en","potentialAction":{"@type":"SearchAction","target":"https://example.com/projects?q={search_term_string}","query-input":"required name=search_term_string"}}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Grove Directory","url":"https://example.com","logo":"https://example.com/og-image.svg","sameAs":["https://github.com/tortuvshin/grove"]}</script><!-- JSON-LD: per-page (SoftwareSourceCode for [slug], etc.) --><script>
2
+ // THEME_INIT — runs before paint so the user never sees a
3
+ // flash of the wrong theme. State is persisted in localStorage
4
+ // under the key "grove-theme" (matching ThemeToggle.astro).
5
+ (function () {
6
+ var STORAGE_KEY = "grove-theme";
7
+ function getMode() {
8
+ try {
9
+ var stored = localStorage.getItem(STORAGE_KEY);
10
+ if (stored === "light" || stored === "dark" || stored === "system")
11
+ return stored;
12
+ } catch (e) {
13
+ // localStorage may be blocked (private mode, etc.) —
14
+ // fall through to the system default.
15
+ }
16
+ return "system";
17
+ }
18
+ function apply(mode) {
19
+ var resolved =
20
+ mode === "system"
21
+ ? (window.matchMedia("(prefers-color-scheme: dark)").matches
22
+ ? "dark"
23
+ : "light")
24
+ : mode;
25
+ var root = document.documentElement;
26
+ if (resolved === "dark") root.classList.add("dark");
27
+ else root.classList.remove("dark");
28
+ root.dataset.theme = mode;
29
+ root.dataset.resolvedTheme = resolved;
30
+ }
31
+ apply(getMode());
32
+ window.addEventListener("theme:set", function (e) {
33
+ apply(e.detail);
34
+ });
35
+ var mq = window.matchMedia("(prefers-color-scheme: dark)");
36
+ mq.addEventListener("change", function () {
37
+ if (getMode() === "system") apply("system");
38
+ });
39
+ })();
40
+ </script><link rel="stylesheet" href="/_astro/BaseLayout.Dz_HR-68.css">
41
+ <style>.grove-container[data-astro-cid-nj4gdmks]{max-width:var(--container-container, 1140px)}.grove-container-wide[data-astro-cid-nj4gdmks]{max-width:var(--container-wide, 1400px)}.grove-container-narrow[data-astro-cid-nj4gdmks]{max-width:var(--container-narrow, 720px)}
42
+ </style></head> <body class="min-h-screen bg-white text-ink-900 dark:bg-ink-950 dark:text-ink-100"> <header class="sticky top-0 z-50 border-b border-ink-200 bg-white/85 backdrop-blur dark:border-ink-800 dark:bg-ink-950/85"> <div class="mx-auto flex max-w-wide items-center gap-6 px-5 py-3 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <a href="/" class="inline-flex items-center gap-2 text-[0.95rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-[18px] w-[18px] rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </a> <nav class="hidden flex-1 md:block" aria-label="Primary"> <ul class="m-0 flex list-none gap-5 p-0"> <li> <a href="/" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Home </a> </li><li> <a href="/projects" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> Browse </a> </li><li> <a href="/about" class="text-[0.875rem] font-medium text-ink-500 transition-colors hover:text-ink-900 dark:text-ink-400 dark:hover:text-ink-100"> About </a> </li> </ul> </nav> <div class="ml-auto flex items-center gap-2"> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" aria-label="Star" title="Star" class="grove-btn grove-btn-outline"> <svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38v-1.33c-2.22.48-2.69-1.07-2.69-1.07-.36-.92-.89-1.17-.89-1.17-.73-.5.05-.49.05-.49.8.06 1.23.83 1.23.83.72 1.22 1.87.87 2.33.67.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48v2.19c0 .21.15.46.55.38A8 8 0 0 0 8 0Z"></path> </svg> <span>Star</span> </a> <button type="button" data-theme-toggle aria-label="Toggle theme" title="Toggle theme" class="relative inline-flex h-8 w-8 items-center justify-center rounded-md border border-ink-200 bg-white text-ink-700 transition-colors hover:border-ink-300 hover:bg-ink-50 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-200 dark:hover:border-ink-700 dark:hover:bg-ink-900/40"> <svg class="hidden h-4 w-4 dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="4"></circle> <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"></path> </svg> <svg class="block h-4 w-4 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"></path> </svg> </button> <script type="module">const c="grove-theme";function o(){try{const e=localStorage.getItem(c);return e==="light"||e==="dark"||e==="system"?e:"system"}catch{return"system"}}function s(){const e=["light","dark","system"],n=o(),r=e[(e.indexOf(n)+1)%e.length];try{localStorage.setItem(c,r)}catch{}return window.dispatchEvent(new CustomEvent("theme:set",{detail:r})),r}function t(e){e.title=`Theme: ${o()} (click to switch)`}document.querySelectorAll("[data-theme-toggle]").forEach(e=>{t(e),e.addEventListener("click",()=>{s(),t(e)}),e.addEventListener("mouseenter",()=>t(e)),e.addEventListener("focus",()=>t(e))});</script> </div> </div> </header> <script type="module">document.addEventListener("click",t=>{if(t.defaultPrevented||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.button!==0)return;const r=t.target.closest('a[href^="#"]');if(!r)return;const e=r.getAttribute("href");if(e.length<=1)return;const n=document.querySelector(e);n&&(t.preventDefault(),n.scrollIntoView({behavior:"smooth",block:"start"}),history.replaceState(null,"",e))});</script> <main> <div class="mx-auto grove-container px-5 sm:px-7" data-astro-cid-nj4gdmks> <article class="py-12 sm:py-16"> <span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
43
+ Submit
44
+ </span> <h1 class="mt-1 text-[1.75rem] sm:text-[2rem] font-semibold tracking-tight text-ink-900 dark:text-ink-100 m-0">
45
+ Submit a project </h1> <p class="mt-4 max-w-[62ch] text-sm text-ink-700 dark:text-ink-200 m-0"> Grove Directory is a community knowledge site. Adding a new project is a two-step process — open a submission issue,
46
+ then open a pull request that adds a new YAML file under <code class="font-mono text-ink-900 dark:text-ink-100">data/records/</code>.
47
+ </p> <div class="mt-6 flex flex-wrap gap-2"> <a href="https://github.com/tortuvshin/grove/issues/new?template=record_submission.md" target="_blank" rel="noopener noreferrer" class="grove-btn grove-btn-primary">
48
+ Open a submission issue ↗
49
+ </a> <a href="https://github.com/tortuvshin/grove/blob/main/.github/ISSUE_TEMPLATE/record_submission.md" target="_blank" rel="noopener noreferrer" class="grove-btn grove-btn-outline">
50
+ See the issue template
51
+ </a> </div> <section class="mt-12 max-w-[68ch"> <h2 class="m-0 text-lg font-semibold tracking-tight text-ink-900 dark:text-ink-100">
52
+ Manual record (alternative to the issue form)
53
+ </h2> <p class="mt-2 text-sm text-ink-700 dark:text-ink-200 m-0">
54
+ Prefer to write a record by hand? Here's the minimum shape for a <code class="font-mono">project-directory</code> record.
55
+ The schema is validated automatically on every PR.
56
+ </p> <pre class="mt-4 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"><code>kind: project
57
+ slug: my-project
58
+ name: My Project
59
+ description: One-line description of what this project does
60
+ category: tools
61
+ tags:
62
+ - open-source
63
+ links:
64
+ github: https://github.com/owner/repo
65
+ website: https://example.com</code></pre> </section> <section class="mt-12 max-w-[68ch"> <h2 class="m-0 text-lg font-semibold tracking-tight text-ink-900 dark:text-ink-100">
66
+ What happens after you submit
67
+ </h2> <ol class="mt-3 m-0 flex list-decimal flex-col gap-2 pl-5 text-sm text-ink-700 dark:text-ink-200"> <li>A maintainer reviews the issue and tags it as <code class="font-mono">accepted</code> or <code class="font-mono">needs-info</code>.</li> <li>You open a PR with the new <code class="font-mono">data/records/&lt;slug&gt;.yml</code> file.</li> <li>CI runs <code class="font-mono">grove validate</code> and previews the site with your record.</li> <li>A maintainer merges. The next <code class="font-mono">grove build</code> deploys it.</li> </ol> </section> </article> </div> </main> <footer class="mt-16 border-t border-ink-200 bg-white text-ink-500 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-400"> <div class="mx-auto grid max-w-wide grid-cols-2 gap-8 px-5 py-12 md:grid-cols-4 sm:px-7" style="max-width: var(--container-wide, 1400px);"> <div class="col-span-2 md:col-span-1"> <div class="mb-2 inline-flex items-center gap-2 text-[0.95rem] font-semibold text-ink-900 dark:text-ink-100"> <span aria-hidden="true" class="inline-block h-3.5 w-3.5 rounded bg-ink-900 dark:bg-ink-100"></span> <span>Grove Directory</span> </div> <p class="m-0 max-w-[36ch] text-[0.8125rem] leading-relaxed text-ink-500 dark:text-ink-400"> A curated, health-aware developer directory. </p> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Discover </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Source on GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/releases" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Latest release </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Contribute </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Submit via GitHub </a> </li><li> <a href="https://github.com/tortuvshin/grove/issues" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Report an issue </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CONTRIBUTING.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Contributing guide </a> </li> </ul> </div> <div> <h4 class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"> Project </h4> <ul class="m-0 flex list-none flex-col gap-2 p-0"> <li> <a href="https://github.com/tortuvshin/grove/blob/main/README.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> README </a> </li><li> <a href="https://github.com/tortuvshin/grove/blob/main/CHANGELOG.md" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100" target="_blank" rel="noopener noreferrer"> Changelog </a> </li> </ul> </div> </div> <div class="border-t border-ink-200 dark:border-ink-800"> <div class="mx-auto flex max-w-wide flex-wrap items-center gap-3 px-5 py-4 text-2xs text-ink-500 sm:px-7 dark:text-ink-400" style="max-width: var(--container-wide, 1400px);"> <span>© 2026 Grove Directory.</span> <span class="text-ink-300 dark:text-ink-700">·</span> <a href="https://github.com/tortuvshin/grove" target="_blank" rel="noopener noreferrer" class="transition-colors hover:text-ink-900 dark:hover:text-ink-100">
68
+ View source on GitHub
69
+ </a> </div> </div> </footer> </body> </html>
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/bin/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/bin/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/bin/astro.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/bin/astro.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/bin/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/bin/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../../../node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/bin/astro-check.js" "$@"
19
+ else
20
+ exec node "$basedir/../../../../../../node_modules/.pnpm/@astrojs+check@0.9.9_prettier@3.8.3_typescript@6.0.3/node_modules/@astrojs/check/bin/astro-check.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/packages/cli/dist/node_modules:/Users/turuu/Projects/Personal/grove/packages/cli/node_modules:/Users/turuu/Projects/Personal/grove/packages/node_modules:/Users/turuu/Projects/Personal/grove/node_modules:/Users/turuu/Projects/Personal/node_modules:/Users/turuu/Projects/node_modules:/Users/turuu/node_modules:/Users/node_modules:/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/turuu/Projects/Personal/grove/packages/cli/dist/node_modules:/Users/turuu/Projects/Personal/grove/packages/cli/node_modules:/Users/turuu/Projects/Personal/grove/packages/node_modules:/Users/turuu/Projects/Personal/grove/node_modules:/Users/turuu/Projects/Personal/node_modules:/Users/turuu/Projects/node_modules:/Users/turuu/node_modules:/Users/node_modules:/node_modules:/Users/turuu/Projects/Personal/grove/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../../cli/dist/index.js" "$@"
19
+ else
20
+ exec node "$basedir/../../../../../cli/dist/index.js" "$@"
21
+ fi