Not in one place.
On one layer.
Web3 funding doesn't need another portal. It needs a shared substrate — one signed schema that every aggregator, dashboard, and agent can read from. This site is a reference view. The layer is the product.
What's open right now
Click a card for the full brief, deadline and contact.
Why a layer
A sixth portal does not fix five portals. The fix is underneath — a shared schema, a signed log, and public projections anyone can read. Six properties that make this a substrate, not a site.
One vocabulary
A DAOIP-5 superset with the process fields the spec doesn't cover — submitter identity, verification state, dispute history. Same fields whether the grant comes from Gitcoin, Optimism, or Stellar. CC0, so it's not ours to keep.
One source, many surfaces
The same signed data is projected to DAOIP-5 JSON-LD, schema.org/MonetaryGrant, GraphQL, RSS, webhooks, nightly JSON, and IPFS mirrors. When upstream specs drift, the projection updates — not the source.
Signed by construction
Every mutation is a signed, ordered, append-only operation. You can audit who added what and replay the log from zero. Three layers of dedupe mean one round does not arrive three times from three sources.
No ranking, no gatekeeper
Results come back deterministically — by deadline, then timestamp. No featured slots, no recommendation engine, no hidden weights. If that ever changes, it takes a public RFC.
Forkable by design
Schema is CC0. Code is AGPL. Run your own hub, ship a different frontend, sit on top as an aggregator — the layer is meant to be built on, not owned.
Multiple hubs, one query
Every hub speaks the same schema, so an aggregator can hit ten of them and stitch the results. Ethereum first, but Solana and Cosmos funders fit without a schema change.
One source, many projections
These are not separate endpoints — they are projections of the same signed operation log. GraphQL for queries, JSON-LD for linked-data consumers, RSS for feeds, nightly JSON for archival. Pick the surface that fits.
# GraphQL — live, filtered, paginated
query OpenRFPs {
rfps(filter: { status: OPEN }, pagination: { limit: 10 }) {
items {
id slug title funder
categories deadline fundingAmount
provenance { verificationStatus sourceHash }
}
nextCursor
total
}
}
# OR pull the full dataset
curl https://rfp-hub.example/snapshots/latest.json
curl https://rfp-hub.example/rss.xml
curl https://rfp-hub.example/rfps/<id>/daoip-5.jsonld
curl https://rfp-hub.example/rfps/<id>/schema-org.jsonld