on master help sign in
Merge pull request #1851 from urbit/mp/nested-grants
38b0692~sarlev-sarsen
content/grants/bitcoin-node-json-rpc-api-part-1.md → content/grants/2019/bitcoin-node-json-rpc-api-part-1.mdrenamed

The content is the same.

content/grants/bitcoin-node-json-rpc-api-part-2.md → content/grants/2019/bitcoin-node-json-rpc-api-part-2.mdrenamed

The content is the same.

content/grants/bitcoin-node-json-rpc-api-part-3.md → content/grants/2019/bitcoin-node-json-rpc-api-part-3.mdrenamed

The content is the same.

content/grants/bitcoin-node-json-rpc-api-part-4.md → content/grants/2019/bitcoin-node-json-rpc-api-part-4.mdrenamed

The content is the same.

content/grants/bitcoin-wallet-on-bridge.md → content/grants/2019/bitcoin-wallet-on-bridge.mdrenamed

The content is the same.

content/grants/escape.md → content/grants/2019/escape.mdrenamed

The content is the same.

content/grants/gall-api-documentation.md → content/grants/2019/gall-api-documentation.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-1.md → content/grants/2019/host-two-urbit-meetups-1.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-10.md → content/grants/2019/host-two-urbit-meetups-10.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-2.md → content/grants/2019/host-two-urbit-meetups-2.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-3.md → content/grants/2019/host-two-urbit-meetups-3.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-4.md → content/grants/2019/host-two-urbit-meetups-4.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-5.md → content/grants/2019/host-two-urbit-meetups-5.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-6.md → content/grants/2019/host-two-urbit-meetups-6.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-7.md → content/grants/2019/host-two-urbit-meetups-7.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-8.md → content/grants/2019/host-two-urbit-meetups-8.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-9.md → content/grants/2019/host-two-urbit-meetups-9.mdrenamed

The content is the same.

content/grants/ragnarok-online-on-urbit.md → content/grants/2019/ragnarok-online-on-urbit.mdrenamed

The content is the same.

content/grants/udon-syntax-highlighter.md → content/grants/2019/udon-syntax-highlighter.mdrenamed

The content is the same.

content/grants/unit-tests-for-json-parsing.md → content/grants/2019/unit-tests-for-json-parsing.mdrenamed

The content is the same.

content/grants/unit-tests-for-pure-algorithms.md → content/grants/2019/unit-tests-for-pure-algorithms.mdrenamed

The content is the same.

content/grants/unit-tests-for-sha-functions.md → content/grants/2019/unit-tests-for-sha-functions.mdrenamed

The content is the same.

content/grants/unit-tests-for-zuse-cryptographic-functions.md → content/grants/2019/unit-tests-for-zuse-cryptographic-functions.mdrenamed

The content is the same.

content/grants/a-book-about-urbit.md → content/grants/2020/a-book-about-urbit.mdrenamed

The content is the same.

content/grants/a-network-enabled-spatial-database-and-demonstration-app.md → content/grants/2020/a-network-enabled-spatial-database-and-demonstration-app.mdrenamed

The content is the same.

content/grants/antechamber.md → content/grants/2020/antechamber.mdrenamed

The content is the same.

content/grants/art-by-urbit.md → content/grants/2020/art-by-urbit.mdrenamed

The content is the same.

content/grants/bart-train-tracker-landscape-tile.md → content/grants/2020/bart-train-tracker-landscape-tile.mdrenamed

The content is the same.

content/grants/bitcoin-full-node-provider-and-wallet.md → content/grants/2020/bitcoin-full-node-provider-and-wallet.mdrenamed

The content is the same.

content/grants/bitcoin-key-derivation.md → content/grants/2020/bitcoin-key-derivation.mdrenamed

The content is the same.

content/grants/boston-t-train-tracker-landscape-tile.md → content/grants/2020/boston-t-train-tracker-landscape-tile.mdrenamed

The content is the same.

content/grants/calendar-ui.md → content/grants/2020/calendar-ui.mdrenamed

The content is the same.

content/grants/calendar.md → content/grants/2020/calendar.mdrenamed

The content is the same.

content/grants/content-saver.md → content/grants/2020/content-saver.mdrenamed

The content is the same.

content/grants/cta-train-tracker-landscape-tile.md → content/grants/2020/cta-train-tracker-landscape-tile.mdrenamed

The content is the same.

content/grants/display-eth-data.md → content/grants/2020/display-eth-data.mdrenamed

The content is the same.

content/grants/docker-image-for-cloud-container-orchestration.md → content/grants/2020/docker-image-for-cloud-container-orchestration.mdrenamed

The content is the same.

content/grants/ethereum-abi-parser.md → content/grants/2020/ethereum-abi-parser.mdrenamed

The content is the same.

content/grants/go-airlock-library.md → content/grants/2020/go-airlock-library.mdrenamed

The content is the same.

content/grants/haskell-airlock-library.md → content/grants/2020/haskell-airlock-library.mdrenamed

The content is the same.

content/grants/hoon-001-learner-efficiency-and-early-learner-resources.md → content/grants/2020/hoon-001-learner-efficiency-and-early-learner-resources.mdrenamed

The content is the same.

content/grants/host-three-college-university-urbit-meetups-1.md → content/grants/2020/host-three-college-university-urbit-meetups-1.mdrenamed

The content is the same.

content/grants/host-three-college-university-urbit-meetups-2.md → content/grants/2020/host-three-college-university-urbit-meetups-2.mdrenamed

The content is the same.

content/grants/host-three-college-university-urbit-meetups-3.md → content/grants/2020/host-three-college-university-urbit-meetups-3.mdrenamed

The content is the same.

content/grants/host-three-virtual-urbit-meetups.md → content/grants/2020/host-three-virtual-urbit-meetups.mdrenamed

The content is the same.

content/grants/links-in-urbit-reference-docs.md → content/grants/2020/links-in-urbit-reference-docs.mdrenamed

The content is the same.

content/grants/llelogram.md → content/grants/2020/llelogram.mdrenamed

The content is the same.

content/grants/matrices-in-hoon.md → content/grants/2020/matrices-in-hoon.mdrenamed

The content is the same.

content/grants/matrixriotim-bridge-bot.md → content/grants/2020/matrixriotim-bridge-bot.mdrenamed

The content is the same.

content/grants/open-street-maps-data-importation.md → content/grants/2020/open-street-maps-data-importation.mdrenamed

The content is the same.

content/grants/staff-the-urbit-help-desk-1.md → content/grants/2020/staff-the-urbit-help-desk-1.mdrenamed

The content is the same.

content/grants/staff-the-urbit-help-desk-2.md → content/grants/2020/staff-the-urbit-help-desk-2.mdrenamed

The content is the same.

content/grants/staff-the-urbit-helpdesk-west.md → content/grants/2020/staff-the-urbit-helpdesk-west.mdrenamed

The content is the same.

content/grants/the-complete-guide-to-gall-and-landscape.md → content/grants/2020/the-complete-guide-to-gall-and-landscape.mdrenamed

The content is the same.

content/grants/tor-nodes-relay-search-tile.md → content/grants/2020/tor-nodes-relay-search-tile.mdrenamed

The content is the same.

content/grants/typescript-airlock-library.md → content/grants/2020/typescript-airlock-library.mdrenamed

The content is the same.

content/grants/up-to-date-hoon-reference-card.md → content/grants/2020/up-to-date-hoon-reference-card.mdrenamed

The content is the same.

content/grants/urbian-a-customized-linux-distribution-for-urbit-appliances.md → content/grants/2020/urbian-a-customized-linux-distribution-for-urbit-appliances.mdrenamed

The content is the same.

content/grants/urbit-event-series.md → content/grants/2020/urbit-event-series.mdrenamed

The content is the same.

content/grants/urbit-explainer-video.md → content/grants/2020/urbit-explainer-video.mdrenamed

The content is the same.

content/grants/urbit-http-api-for-kotlin.md → content/grants/2020/urbit-http-api-for-kotlin.mdrenamed

The content is the same.

content/grants/urbit-http-api-for-rust.md → content/grants/2020/urbit-http-api-for-rust.mdrenamed

The content is the same.

content/grants/urbit-http-interface-java-edition.md → content/grants/2020/urbit-http-interface-java-edition.mdrenamed

The content is the same.

content/grants/urbit-http-library-for-ruby.md → content/grants/2020/urbit-http-library-for-ruby.mdrenamed

The content is the same.

content/grants/urbit-online-meetup.md → content/grants/2020/urbit-online-meetup.mdrenamed

The content is the same.

content/grants/urbit-ship-and-star-hosting-and-troubleshooting-docs.md → content/grants/2020/urbit-ship-and-star-hosting-and-troubleshooting-docs.mdrenamed

The content is the same.

content/grants/verifying-urbit-id-on-keybase.md → content/grants/2020/verifying-urbit-id-on-keybase.mdrenamed

The content is the same.

content/grants/web-scraper.md → content/grants/2020/web-scraper.mdrenamed

The content is the same.

content/grants/analytics-script.md → content/grants/2021/analytics-script.mdrenamed

The content is the same.

content/grants/authenticate-with-urbit.md → content/grants/2021/authenticate-with-urbit.mdrenamed

The content is the same.

content/grants/azimuth-cli.md → content/grants/2021/azimuth-cli.mdrenamed

The content is the same.

content/grants/bitcoin-wallet-maintenance.md → content/grants/2021/bitcoin-wallet-maintenance.mdrenamed

The content is the same.

content/grants/bridge-l2-revamp.md → content/grants/2021/bridge-l2-revamp.mdrenamed

The content is the same.

content/grants/clojure-urbit-client.md → content/grants/2021/clojure-urbit-client.mdrenamed

The content is the same.

content/grants/comprehensive-local-server-and-mum-explanation-video.md → content/grants/2021/comprehensive-local-server-and-mum-explanation-video.mdrenamed

The content is the same.

content/grants/contacts.md → content/grants/2021/contacts.mdrenamed

The content is the same.

content/grants/content-producer.md → content/grants/2021/content-producer.mdrenamed

The content is the same.

content/grants/cross-platform-desktop-urbit-app.md → content/grants/2021/cross-platform-desktop-urbit-app.mdrenamed

The content is the same.

content/grants/cypherscope-bot.md → content/grants/2021/cypherscope-bot.mdrenamed

The content is the same.

content/grants/educational-guide-todomvc-urbit-edition.md → content/grants/2021/educational-guide-todomvc-urbit-edition.mdrenamed

The content is the same.

content/grants/feed-aggregator.md → content/grants/2021/feed-aggregator.mdrenamed

The content is the same.

content/grants/graph-store-documentation-guide.md → content/grants/2021/graph-store-documentation-guide.mdrenamed

The content is the same.

content/grants/guide-to-s3.md → content/grants/2021/guide-to-s3.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-11.md → content/grants/2021/host-two-urbit-meetups-11.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-12.md → content/grants/2021/host-two-urbit-meetups-12.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-13.md → content/grants/2021/host-two-urbit-meetups-13.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-14.md → content/grants/2021/host-two-urbit-meetups-14.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-15.md → content/grants/2021/host-two-urbit-meetups-15.mdrenamed

The content is the same.

content/grants/host-two-urbit-meetups-16.md → content/grants/2021/host-two-urbit-meetups-16.mdrenamed

The content is the same.

content/grants/json-jet.md → content/grants/2021/json-jet.mdrenamed

The content is the same.

content/grants/login-with-urbit.md → content/grants/2021/login-with-urbit.mdrenamed

The content is the same.

content/grants/machine-learning.md → content/grants/2021/machine-learning.mdrenamed

The content is the same.

content/grants/market-interface.md → content/grants/2021/market-interface.mdrenamed

The content is the same.

content/grants/meetup-bom.md → content/grants/2021/meetup-bom.mdrenamed

The content is the same.

content/grants/minimal-urbit-os.md → content/grants/2021/minimal-urbit-os.mdrenamed

The content is the same.

content/grants/native-urbit.md → content/grants/2021/native-urbit.mdrenamed

The content is the same.

content/grants/network-explorer-data-pipeline-http-api.md → content/grants/2021/network-explorer-data-pipeline-http-api.mdrenamed

The content is the same.

content/grants/nuck-jet.md → content/grants/2021/nuck-jet.mdrenamed

The content is the same.

content/grants/overhaul-the-urbitorg-website.md → content/grants/2021/overhaul-the-urbitorg-website.mdrenamed

The content is the same.

content/grants/planet-sales.md → content/grants/2021/planet-sales.mdrenamed

The content is the same.

content/grants/pokur.md → content/grants/2021/pokur.mdrenamed

The content is the same.

content/grants/ra-debugging-tools.md → content/grants/2021/ra-debugging-tools.mdrenamed

The content is the same.

content/grants/ra-page-tracking.md → content/grants/2021/ra-page-tracking.mdrenamed

The content is the same.

content/grants/ra-segfaults.md → content/grants/2021/ra-segfaults.mdrenamed

The content is the same.

content/grants/ra-stack-overflow.md → content/grants/2021/ra-stack-overflow.mdrenamed

The content is the same.

content/grants/search-in-groups.md → content/grants/2021/search-in-groups.mdrenamed

The content is the same.

content/grants/send-emails-to-a-mailing-list.md → content/grants/2021/send-emails-to-a-mailing-list.mdrenamed

The content is the same.

content/grants/smol-future-sustained-knowledge-sharing-and-marketing.md → content/grants/2021/smol-future-sustained-knowledge-sharing-and-marketing.mdrenamed

The content is the same.

content/grants/speech-recognition.md → content/grants/2021/speech-recognition.mdrenamed

The content is the same.

content/grants/staff-the-urbit-helpdesk-east.md → content/grants/2021/staff-the-urbit-helpdesk-east.mdrenamed

The content is the same.

content/grants/static-site-generation.md → content/grants/2021/static-site-generation.mdrenamed

The content is the same.

content/grants/thread-documentation.md → content/grants/2021/thread-documentation.mdrenamed

The content is the same.

content/grants/translate-key-parts-of-urbitorg-into-german.md → content/grants/2021/translate-key-parts-of-urbitorg-into-german.mdrenamed

The content is the same.

content/grants/translate-key-parts-of-urbitorg-into-korean.md → content/grants/2021/translate-key-parts-of-urbitorg-into-korean.mdrenamed

The content is the same.

content/grants/translate-key-parts-of-urbitorg-into-norwegian.md → content/grants/2021/translate-key-parts-of-urbitorg-into-norwegian.mdrenamed

The content is the same.

content/grants/translate-key-parts-of-urbitorg-into-spanish.md → content/grants/2021/translate-key-parts-of-urbitorg-into-spanish.mdrenamed

The content is the same.

content/grants/try-urbit-website.md → content/grants/2021/try-urbit-website.mdrenamed

The content is the same.

content/grants/twitter-uv-extension.md → content/grants/2021/twitter-uv-extension.mdrenamed

The content is the same.

content/grants/ua-collaborative-text-editor.md → content/grants/2021/ua-collaborative-text-editor.mdrenamed

The content is the same.

content/grants/ua-filesharer.md → content/grants/2021/ua-filesharer.mdrenamed

The content is the same.

content/grants/ua-heads-up-poker.md → content/grants/2021/ua-heads-up-poker.mdrenamed

The content is the same.

content/grants/ua-invoice-system.md → content/grants/2021/ua-invoice-system.mdrenamed

The content is the same.

content/grants/ua-marketplace.md → content/grants/2021/ua-marketplace.mdrenamed

The content is the same.

content/grants/ucal-google-and-outlook-integration.md → content/grants/2021/ucal-google-and-outlook-integration.mdrenamed

The content is the same.

content/grants/urbit-api-for-elixir.md → content/grants/2021/urbit-api-for-elixir.mdrenamed

The content is the same.

content/grants/urbit-community-concierge-east-coast-2q2021.md → content/grants/2021/urbit-community-concierge-east-coast-2q2021.mdrenamed

The content is the same.

content/grants/urbit-community-concierge-east-coast.md → content/grants/2021/urbit-community-concierge-east-coast.mdrenamed

The content is the same.

content/grants/urbit-community-concierge-west-coast-2q2021.md → content/grants/2021/urbit-community-concierge-west-coast-2q2021.mdrenamed

The content is the same.

content/grants/urbit-community-concierge-west-coast.md → content/grants/2021/urbit-community-concierge-west-coast.mdrenamed

The content is the same.

content/grants/urbit-http-api-for-emacs-elisp.md → content/grants/2021/urbit-http-api-for-emacs-elisp.mdrenamed

The content is the same.

content/grants/urbit-http-api-for-python.md → content/grants/2021/urbit-http-api-for-python.mdrenamed

The content is the same.

content/grants/urbit-irc-bridge.md → content/grants/2021/urbit-irc-bridge.mdrenamed

The content is the same.

content/grants/urbit-lfs-filehosting.md → content/grants/2021/urbit-lfs-filehosting.mdrenamed

The content is the same.

content/grants/urbit-notes.md → content/grants/2021/urbit-notes.mdrenamed

The content is the same.

content/grants/urbit-react-cookbook.md → content/grants/2021/urbit-react-cookbook.mdrenamed

The content is the same.

content/grants/uturn.md → content/grants/2021/uturn.mdrenamed

The content is the same.

content/grants/uv-extension-library.md → content/grants/2021/uv-extension-library.mdrenamed

The content is the same.

content/grants/video-content-manager.md → content/grants/2021/video-content-manager.mdrenamed

The content is the same.

content/grants/volt-lightning-on-urbit.md → content/grants/2021/volt-lightning-on-urbit.mdrenamed

The content is the same.

content/grants/webrtc-gall-agent-and-external-app.md → content/grants/2021/webrtc-gall-agent-and-external-app.mdrenamed

The content is the same.

content/grants/~home-urbit.md → content/grants/2021/~home-urbit.mdrenamed

The content is the same.

content/grants/abacus.md → content/grants/2022/abacus.mdrenamed

The content is the same.

content/grants/app-engram.md → content/grants/2022/app-engram.mdrenamed

The content is the same.

content/grants/app-openbsd.md → content/grants/2022/app-openbsd.mdrenamed

The content is the same.

content/grants/app-store.md → content/grants/2022/app-store.mdrenamed

The content is the same.

content/grants/app-urvault.md → content/grants/2022/app-urvault.mdrenamed

The content is the same.

content/grants/app-uv-native-notificatons.md → content/grants/2022/app-uv-native-notificatons.mdrenamed

The content is the same.

content/grants/apprenticeship-extending-bitcoin.md → content/grants/2022/apprenticeship-extending-bitcoin.mdrenamed

The content is the same.

content/grants/apprenticeship-studio-collections.md → content/grants/2022/apprenticeship-studio-collections.mdrenamed

The content is the same.

content/grants/apprenticeship-studio-email.md → content/grants/2022/apprenticeship-studio-email.mdrenamed

The content is the same.

content/grants/astrolabe.md → content/grants/2022/astrolabe.mdrenamed

The content is the same.

content/grants/books-development.md → content/grants/2022/books-development.mdrenamed

The content is the same.

content/grants/books.md → content/grants/2022/books.mdrenamed

The content is the same.

content/grants/calendar-holium.md → content/grants/2022/calendar-holium.mdrenamed

The content is the same.

content/grants/chess-bounty.md → content/grants/2022/chess-bounty.mdrenamed

The content is the same.

content/grants/chronicle.md → content/grants/2022/chronicle.mdrenamed

The content is the same.

content/grants/communal-computing.md → content/grants/2022/communal-computing.mdrenamed

The content is the same.

content/grants/community-meetups.md → content/grants/2022/community-meetups.mdrenamed

The content is the same.

content/grants/cue.md → content/grants/2022/cue.mdrenamed

The content is the same.

content/grants/desk-import-export.md → content/grants/2022/desk-import-export.mdrenamed

The content is the same.

content/grants/digital-editor-MROB.md → content/grants/2022/digital-editor-MROB.mdrenamed

The content is the same.

content/grants/digital-storefront.md → content/grants/2022/digital-storefront.mdrenamed

The content is the same.

content/grants/dusko-valve.md → content/grants/2022/dusko-valve.mdrenamed

The content is the same.

content/grants/eth-provider.md → content/grants/2022/eth-provider.mdrenamed

The content is the same.

content/grants/eth-wallet.md → content/grants/2022/eth-wallet.mdrenamed

The content is the same.

content/grants/eyre-scry.md → content/grants/2022/eyre-scry.mdrenamed

The content is the same.

content/grants/faux.md → content/grants/2022/faux.mdrenamed

The content is the same.

content/grants/filesharer.md → content/grants/2022/filesharer.mdrenamed

The content is the same.

content/grants/full-stop.md → content/grants/2022/full-stop.mdrenamed

The content is the same.

content/grants/gather.md → content/grants/2022/gather.mdrenamed

The content is the same.

content/grants/general-web-permissions.md → content/grants/2022/general-web-permissions.mdrenamed

The content is the same.

content/grants/gnosis-safe.md → content/grants/2022/gnosis-safe.mdrenamed

The content is the same.

content/grants/go-urbit.md → content/grants/2022/go-urbit.mdrenamed

The content is the same.

content/grants/gora-apprentice.md → content/grants/2022/gora-apprentice.mdrenamed

The content is the same.

content/grants/herd.md → content/grants/2022/herd.mdrenamed

The content is the same.

content/grants/hoon-eval.md → content/grants/2022/hoon-eval.mdrenamed

The content is the same.

content/grants/hoon-markdown-library.md → content/grants/2022/hoon-markdown-library.mdrenamed

The content is the same.

content/grants/lexicon.md → content/grants/2022/lexicon.mdrenamed

The content is the same.

content/grants/loom-pointer-compression.md → content/grants/2022/loom-pointer-compression.mdrenamed

The content is the same.

content/grants/meld-memory.md → content/grants/2022/meld-memory.mdrenamed

The content is the same.

content/grants/membrane.md → content/grants/2022/membrane.mdrenamed

The content is the same.

content/grants/middleware-apprentice.md → content/grants/2022/middleware-apprentice.mdrenamed

The content is the same.

content/grants/minesweeper.md → content/grants/2022/minesweeper.mdrenamed

The content is the same.

content/grants/native-planet-2.md → content/grants/2022/native-planet-2.mdrenamed

The content is the same.

content/grants/nested-goals.md → content/grants/2022/nested-goals.mdrenamed

The content is the same.

content/grants/notifications-protocol.md → content/grants/2022/notifications-protocol.mdrenamed

The content is the same.

content/grants/olif.md → content/grants/2022/olif.mdrenamed

The content is the same.

content/grants/peat.md → content/grants/2022/peat.mdrenamed

The content is the same.

content/grants/persistent-memory.md → content/grants/2022/persistent-memory.mdrenamed

The content is the same.

content/grants/plug.md → content/grants/2022/plug.mdrenamed

The content is the same.

content/grants/pony-bounty.md → content/grants/2022/pony-bounty.mdrenamed

The content is the same.

content/grants/port-maintenance.md → content/grants/2022/port-maintenance.mdrenamed

The content is the same.

content/grants/port-to-hosting.md → content/grants/2022/port-to-hosting.mdrenamed

The content is the same.

content/grants/profiling.md → content/grants/2022/profiling.mdrenamed

The content is the same.

content/grants/qr-login.md → content/grants/2022/qr-login.mdrenamed

The content is the same.

content/grants/quorum.md → content/grants/2022/quorum.mdrenamed

The content is the same.

content/grants/regex-library.md → content/grants/2022/regex-library.mdrenamed

The content is the same.

content/grants/seguro-phase-2.md → content/grants/2022/seguro-phase-2.mdrenamed

The content is the same.

content/grants/seguro-prototype.md → content/grants/2022/seguro-prototype.mdrenamed

The content is the same.

content/grants/slam.md → content/grants/2022/slam.mdrenamed

The content is the same.

content/grants/slaw-scot-jets.md → content/grants/2022/slaw-scot-jets.mdrenamed

The content is the same.

content/grants/symmetric-routing.md → content/grants/2022/symmetric-routing.mdrenamed

The content is the same.

content/grants/trill-ufa.md → content/grants/2022/trill-ufa.mdrenamed

The content is the same.

content/grants/trove.md → content/grants/2022/trove.mdrenamed

The content is the same.

content/grants/urbit-forms.md → content/grants/2022/urbit-forms.mdrenamed

The content is the same.

content/grants/urbit-interface-framework.md → content/grants/2022/urbit-interface-framework.mdrenamed

The content is the same.

content/grants/urbitswap.md → content/grants/2022/urbitswap.mdrenamed

The content is the same.

content/grants/value-articles.md → content/grants/2022/value-articles.mdrenamed

The content is the same.

content/grants/volt-ui.md → content/grants/2022/volt-ui.mdrenamed

The content is the same.

content/grants/whom.md → content/grants/2022/whom.mdrenamed

The content is the same.

lib/lib.js+21−62
@@ -97,76 +97,35 @@ export function formatDateAndTime(dateTimeObject) {
97
97
98// Returns an array of unique grants categories
98// Returns an array of unique grants categories
99export function getGrantsCategories() {
99export function getGrantsCategories() {
100− const paths = fs.readdirSync(directories("grants"));
100+ const years = fs.readdirSync(directories("grants"), { withFileTypes: true }).filter((f) => f.isDirectory());
101− const uniqueCategories = paths
101+ const uniqueCategories = Array.from(new Set(years.map((yearDir) => {
102− // Get only markdown files
102+ return fs.readdirSync(join(directories("grants"), yearDir.name), { withFileTypes: true })
103− .filter((path) => parse(path).ext === ".md")
103+ .filter((path) => parse(path.name).ext === ".md")
104− // Parse frontmatter
105− .map((path) =>
106− matter(fs.readFileSync(join(directories("grants"), path)), options)
104+ .map((path) => matter(fs.readFileSync(join(directories("grants"), yearDir.name, path.name)), options))
107− )
105+ .flat()
108− // Each markdown file has an array of categories. Collapse these arrays into one array.
109− .reduce((acc, metadata) => {
106+ .reduce((acc, metadata) => {
110− return [...acc, ...metadata.data.taxonomies.grant_category];
107+ return [...acc, ...metadata.data.taxonomies.grant_category]
111− }, [])
108+ }, [])
112− // Deduplicate single array of categories such that the output is an array where each category is represented only once.
109+ }).flat()));
113− .reduce((acc, uniqueItem) => {
114− if (acc.includes(uniqueItem)) {
115− return acc;
116− }
117− return [...acc, uniqueItem];
118− }, []);
119 return uniqueCategories;
110 return uniqueCategories;
120}
111}
121
112
122// Returns an array of unique grants types
113// Returns an array of unique grants types
114+
123export function getGrantsTypes() {
115export function getGrantsTypes() {
124− const paths = fs.readdirSync(directories("grants"));
116+ const years = fs.readdirSync(directories("grants"), { withFileTypes: true }).filter((f) => f.isDirectory());
125− const uniqueTypes = paths
117+ const uniqueTypes = Array.from(new Set(years.map((yearDir) => {
126− // Get only markdown files
118+ return fs.readdirSync(join(directories("grants"), yearDir.name), { withFileTypes: true })
127− .filter((path) => parse(path).ext === ".md")
119+ .filter((path) => parse(path.name).ext === ".md")
128− // Parse frontmatter to JSON
129− .map((path) =>
130− matter(fs.readFileSync(join(directories("grants"), path)), options)
120+ .map((path) => matter(fs.readFileSync(join(directories("grants"), yearDir.name, path.name)), options))
131− )
121+ .flat()
132− // Each markdown file has an array of types. Collapse these arrays into one array.
133− .reduce((acc, metadata) => {
122+ .reduce((acc, metadata) => {
134− return [...acc, ...metadata.data.taxonomies.grant_type];
123+ return [...acc, ...metadata.data.taxonomies.grant_type]
135− }, [])
124+ }, [])
136− // Deduplicate single array of types such that the output is an array where each type is represented only once.
125+ }).flat()));
137− .reduce((acc, uniqueItem) => {
138− if (acc.includes(uniqueItem)) {
139− return acc;
140− }
141− return [...acc, uniqueItem];
142− }, []);
143 return uniqueTypes;
126 return uniqueTypes;
144}
127}
145
128
146−// Returns a number which represents how many grants are open, or uncompleted
147−export function getOpenGrantsCount() {
148− const paths = fs.readdirSync(directories("grants"));
149− const count = paths
150− // Get only markdown files
151− .filter((path) => parse(path).ext === ".md")
152− // Parse frontmatter to JSON
153− .map((path) =>
154− matter(fs.readFileSync(join(directories("grants"), path)), options)
155− )
156− // Count grants which are both uncompleted and not assigned
157− .reduce((acc, metadata) => {
158− if (
159− !metadata.data.extra.completed &&
160− !metadata.data.extra.canceled &&
161− metadata.data.extra.assignee?.[0] === ""
162− ) {
163− return acc + 1;
164− }
165− return acc;
166− }, 0);
167− return count;
168−}
169−
170// Groups arrays into an array of arrays with 2 members
129// Groups arrays into an array of arrays with 2 members
171export const pair = (arr) =>
130export const pair = (arr) =>
172 arr.reduce(function (rows, key, index) {
131 arr.reduce(function (rows, key, index) {
pages/grants.js+20−13
@@ -15,6 +15,8 @@ import GrantPreview from "../components/GrantPreview";
15import JoinGroup from "../components/JoinGroup";
15import JoinGroup from "../components/JoinGroup";
16import omit from "lodash.omit";
16import omit from "lodash.omit";
17import { getGrantsCategories, getGrantsTypes } from "../lib/lib";
17import { getGrantsCategories, getGrantsTypes } from "../lib/lib";
18+import fs from 'fs';
19+import { join } from 'path';
18
20
19function isArray(arr) {
21function isArray(arr) {
20 return Array.isArray(arr);
22 return Array.isArray(arr);
@@ -264,9 +266,8 @@ export default function Grants({ posts, categories, types, search }) {
264 <h5 className="text-wall-600 font-semibold my-2">Programs</h5>
266 <h5 className="text-wall-600 font-semibold my-2">Programs</h5>
265 <div className="flex flex-wrap items-center pb-2">
267 <div className="flex flex-wrap items-center pb-2">
266 <a
268 <a
267− className={`badge-lg mr-2 ${
268− !type ? "bg-black text-white" : "bg-wall-100 text-wall-500"
269+ className={`badge-lg mr-2 ${!type ? "bg-black text-white" : "bg-wall-100 text-wall-500"
269− }`}
270+ }`}
270 onClick={() => push((({ type, ...obj }) => obj)(router.query))}
271 onClick={() => push((({ type, ...obj }) => obj)(router.query))}
271 >
272 >
272 All <div className="opacity-50 ml-2">{allCount}</div>
273 All <div className="opacity-50 ml-2">{allCount}</div>
@@ -288,11 +289,10 @@ export default function Grants({ posts, categories, types, search }) {
288 }
289 }
289 return (
290 return (
290 <a
291 <a
291− className={`badge-lg mr-2 ${
292+ className={`badge-lg mr-2 ${isOrIsIn(each, type)
292− isOrIsIn(each, type)
293− ? activeBg
293+ ? activeBg
294− : "bg-wall-100 text-wall-500"
294+ : "bg-wall-100 text-wall-500"
295− }`}
295+ }`}
296 onClick={() => push({ ...router.query, type: each })}
296 onClick={() => push({ ...router.query, type: each })}
297 >
297 >
298 {each}
298 {each}
@@ -365,11 +365,18 @@ export default function Grants({ posts, categories, types, search }) {
365export async function getStaticProps() {
365export async function getStaticProps() {
366 const categories = getGrantsCategories();
366 const categories = getGrantsCategories();
367 const types = getGrantsTypes();
367 const types = getGrantsTypes();
368+ const basePath = join(process.cwd(), 'content/grants')
369+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
370+ const posts = years.map((year) => {
368− const posts = getAllPosts(
371+ return getAllPosts(
369− ["title", "slug", "date", "description", "extra", "taxonomies"],
372+ ["title", "slug", "date", "description", "extra", "taxonomies"],
370− "grants",
373+ `grants/${year.name}`,
371− "date"
374+ "date"
375+ )
376+ }).flat().sort((a, b) => {
377+ return a.title.toLowerCase().localeCompare(b.title.toLowerCase())
372− );
378+ });
379+
373 return {
380 return {
374 props: {
381 props: {
375 posts: posts,
382 posts: posts,
pages/grants/[slug].js+17−5
@@ -18,6 +18,8 @@ import Header from "../../components/Header";
18import Footer from "../../components/Footer";
18import Footer from "../../components/Footer";
19import ob from "urbit-ob";
19import ob from "urbit-ob";
20import { DateTime } from "luxon";
20import { DateTime } from "luxon";
21+import fs from 'fs';
22+import { join } from 'path';
21
23
22export default function Grant({ post, markdown, search }) {
24export default function Grant({ post, markdown, search }) {
23 const router = useRouter();
25 const router = useRouter();
@@ -146,13 +148,18 @@ export default function Grant({ post, markdown, search }) {
146 );
148 );
147}
149}
148
150
149−//
150export async function getStaticProps({ params }) {
151export async function getStaticProps({ params }) {
152+ const basePath = join(process.cwd(), 'content/grants')
153+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
154+ const dir = years.find((year) => {
155+ const yearDir = fs.readdirSync(join(basePath, year.name), { 'withFileTypes': true });
156+ return yearDir.some((file) => file.name === `${params.slug}.md`)
157+ });
151 const post = getPostBySlug(
158 const post = getPostBySlug(
152 params.slug,
159 params.slug,
153 ["title", "slug", "date", "description", "content", "extra", "taxonomies"],
160 ["title", "slug", "date", "description", "content", "extra", "taxonomies"],
154− "grants"
161+ `grants/${dir.name}`
155− );
162+ )
156
163
157 const markdown = JSON.stringify(Markdown.parse({ post }));
164 const markdown = JSON.stringify(Markdown.parse({ post }));
158 return {
165 return {
@@ -161,13 +168,18 @@ export async function getStaticProps({ params }) {
161}
168}
162
169
163export async function getStaticPaths() {
170export async function getStaticPaths() {
164− const posts = getAllPosts(["slug", "date"], "grants", "date");
171+ const basePath = join(process.cwd(), 'content/grants')
172+ const years = fs.readdirSync(basePath, { 'withFileTypes': true });
173+ const posts = years.filter((year) => year.isDirectory()).map((year) => {
174+ const yearDir = fs.readdirSync(join(basePath, year.name), { 'withFileTypes': true });
175+ return yearDir.filter((entry) => entry.isFile()).map((entry) => entry.name.replace(/\.md$/, ""))
176+ }).flat()
165
177
166 return {
178 return {
167 paths: posts.map((post) => {
179 paths: posts.map((post) => {
168 return {
180 return {
169 params: {
181 params: {
170− slug: post.slug,
182+ slug: post,
171 },
183 },
172 };
184 };
173 }),
185 }),
pages/index.js+9−1
@@ -376,7 +376,15 @@ export async function getStaticProps() {
376 });
376 });
377
377
378 // Latest grants
378 // Latest grants
379− const grants = getAllPosts(["extra", "taxonomies"], "grants", "date");
379+ const basePath = path.join(process.cwd(), 'content/grants')
380+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
381+ const grants = years.map((year) => {
382+ return getAllPosts(
383+ ["title", "slug", "date", "description", "extra", "taxonomies"],
384+ `grants/${year.name}`,
385+ "date"
386+ )
387+ }).flat();
380
388
381 const grantNumbers = {
389 const grantNumbers = {
382 starsAwarded: Math.floor(
390 starsAwarded: Math.floor(