Hack for Humanity is a global hackathon. This year it ran across up to 130 communities in 52 countries, and more than 20,000 builders joined with one brief: build what humanity needs next. On September 19, 199 of them signed up for the San Francisco room at Entrepreneurs First, and I spent the day there as the host, speaker and judge.

Four hours is not much time to learn a new database, but FalkorDB starts with one Docker command and the first Cypher query is minutes away. So I expected teams to get it running and use it for one lookup. What I saw instead surprised me. Team after team put FalkorDB at the center of the problem they were solving, not as a place to store data but as the part that made the solution work: the record of how a city votes, the map of where you can legally leave your car, the reason a visitor should walk to the next street over. It makes sense once you look at what they were building. Most of these projects were agents, and an agent needs a memory that answers in milliseconds and keeps each user's data apart. FalkorDB gives every agent its own graph on one instance, so the fit was natural. After the demos I read every repo, because a claim like that deserves the code behind it. Below are the three projects that changed my mind, each with the query that did the work, then the rest of the FalkorDB projects from the room.

The room
This was not a student crowd. Founders and executives sat next to working engineers, the teams behind more than 25 startups were represented, and I talked to people who build at Google, Oracle, Meta, and the European Space Agency. These are people who pick infrastructure for a living, and they had come to spend a Saturday on problems that do not usually get engineering attention: city hall transparency, street parking, an endangered language, a neighbor who needs a hand.

Three problems, three graphs

Board of SuperVision: the city's record as a graph
Kieran Batchelli-Hennessey · GitHub
Every city makes decisions in public and then buries them in hours of meeting video that almost nobody watches. San Francisco's Board of Supervisors is no exception. Kieran pointed the pipeline at 66 of those meetings and turned them into one graph of 7,553 nodes: meetings, agenda items, legislation, supervisors, speakers, quotes, topics, and 6,961 recorded votes. Ask it how much the city approved in lawsuit settlements on September 15 and it answers with the dollar figures, the names, and the timestamp in the meeting video where the vote happened.
Gemini does the extraction. It reads each meeting and writes structured items, quotes, and votes into FalkorDB. On the way back out, an agent chooses between three tools: full-text search over item titles and summaries, a set of parameterized Cypher templates, and free-form text-to-Cypher that is locked to read-only. Every answer carries a citation into the video, which is the part a city clerk would care about.
The query I keep coming back to is the one that asks who dissents together. It only works because votes are edges:
MATCH (a:Supervisor)-[:VOTED {vote: 'no'}]->(i:Item)
<-[:VOTED {vote: 'no'}]-(b:Supervisor)
WHERE a.name < b.name
MATCH (m:Meeting)-[:HAS_ITEM]->(i)
WITH DISTINCT a, b, m, i
...
No vector index answers that, because "who dissents together" is not a matter of similar text. It is a pattern across many meetings, and a pattern is what a graph is for. Kieran's README says it better than I can: the answers are "traversals over the record, not guesses from similar-looking text." For a resident trying to understand their own city government, that difference is the whole product. A guess with a confident tone is worse than no answer. A traversal with a video timestamp is something you can take to a public comment period.
ro_query with a 3 second timeout, a regex blocks write keywords, and a guard caps LIMIT at 100. The UI has a panel that shows the exact Cypher it just ran. There is an eval set, and it passes 30 of 30. That is the mark of someone who has shipped things before, building under a clock.The stack. Python and FastAPI on the back end, with Pydantic models and the falkordb Python client. Gemini through OpenRouter for extraction, webvtt for the transcripts, and a React front end built with Vite. He created the full-text index with db.idx.fulltext.createNodeIndex and left a CONTAINS fallback for older deployments.
Can I park here? The winner, and a geospatial graph
Henry Gardner · Winner, Best Use of Photon · GitHub
A street-sweeping ticket in San Francisco usually goes to someone who could not work out the sign in time. Henry's answer fits in Messages. Text a pin to an iMessage bot and it tells you whether you can stay, when you have to move, and sets a reminder, all without leaving the thread. Photon runs the bot. His clever call was to keep the simple check on local data and give the graph the harder job: when the spot you are in is blocked, find the curbs nearby that are not.
He loaded the city's open data into FalkorDB, roughly 22,500 curb segments and 37,700 street-sweeping schedule entries, and sampled each curb at its ends and every 20 meters so that a point lookup lands on something. The alternatives search is one query:
WITH point({latitude: $lat, longitude: $lng}) AS origin
MATCH (sample:Sample)-[:ON_CURB]->(curb:Curb)
WHERE distance(sample.location, origin) <= $radius
WITH curb, min(distance(sample.location, origin)) AS approximateDistance
ORDER BY approximateDistance LIMIT 200
MATCH (curb)-[:HAS_SWEEP]->(sweep:Sweep)
RETURN curb.key AS key, collect(sweep.json) AS schedules
That is a radius search and a join in one pass, with the schedules coming back attached to the curbs they belong to, which is the shape the bot needs to write a reply.
UNWIND ... MERGE in batches of 300, and the README tells you to pin the Docker image version. He also left a comment I want to put in our docs: collect() comes back as a JSON array string when you talk to FalkorDB over a raw Redis client.The stack. TypeScript and Next.js for the web side, a Node.js bot on Photon, and a graph layer that sends GRAPH.QUERY and GRAPH.RO_QUERY through the redis client rather than an SDK. Python for the data prep, a vision model to read parking-sign photos, and FalkorDB in Docker Compose.

LOCAL GACHA: a recommendation that shows its reason
Ryotaro Mizuno · GitHub
Overtourism is a community problem too. The same ten streets in Tokyo absorb the crowds while the family-run shops a few blocks away get nothing. Ryotaro's answer is a 3D capsule machine, the kind you find outside every convenience store in Japan, that sends visitors to real local spots instead of the crowded ones. Turn the handle and a capsule opens with a photo, a map link, and a short guide from Gemini. Then you ask where to go next, and that is where the graph comes in.
"Next" is a two-hop traversal. Find the other spots that share a neighborhood or an experience with this one, and rank them by how much they share:
MATCH (s:Spot {id:$id})-[:IN_AREA|OFFERS]->(shared)
<-[:IN_AREA|OFFERS]-(other:Spot)
WHERE other.id <> s.id
RETURN other.id AS id, collect(shared.name) AS via, count(shared) AS score
ORDER BY score DESC, id LIMIT 3
The via column is the whole point. The card does not just say "try this next," it says why, because the shared neighborhood or experience came back with the row. Gemini writes the guide text, but it only ever sees rows the graph returned. From the README: "The model receives no database credentials and cannot execute Cypher." The dataset is five venues. The instinct is exactly right, and it scales.
The stack. Next.js and React for the machine, a Node.js server that talks to FalkorDB through the falkordb npm client, the Gemini SDK for the guide text, and a Docker image pinned by digest. Reads go through roQuery, the seed runs lazily on first connect with MERGE, and the graph tests only run when you set TEST_GRAPH=1.
Other Projects
SF Civic Lens · Jessie Cui · GitHub · Live demo. Gemini turns a street photo of a pothole or a blocked curb ramp into a structured 311 ticket, and FalkorDB Cloud keeps the audit trail of who did what to which incident in which district. Python with the falkordb client on the back end, a Leaflet map and a vis-network graph panel on the front.
Postscript · Aspen Ma and Anup Mantri · GitHub. A patient's after-visit summary from MyChart, modeled as a graph around the patient: conditions, medications, vitals, recommendations, appointments. A second graph on the same instance logs the chat sessions. Next.js and TypeScript with the falkordb npm client, seeded from FHIR-style records.
WildSignal · Sunny Rodrigues · GitHub · Demo on Loom. An iMessage agent for wildlife encounters in the city. Send a photo of the coyote, Gemini reads the scene as structured JSON, a rule file picks the right agency, and every report becomes Species, Area, Agency, and Encounter nodes. Locations are blurred to the neighborhood before anything is stored. Next.js, TypeScript, Tailwind CSS, Leaflet, Photon.
Rimai · William Santos · GitHub. A translator between Inga and Spanish that shows the source behind every word and improves when speakers correct it. Inga has about 18,000 speakers and few written resources, so the tool is built to learn the language from people. Python, FastAPI, JavaScript, Gemini, FalkorDB.
What the builds had in common

Each team chose its own problem and its own stack. I still found the same pipeline in almost every repo. Raw material goes in first, a photo of a curb, a text message, 66 hours of meeting video. Gemini reads it and writes out typed facts. Those facts become nodes and edges through MERGE, which means the import can run twice and the graph looks the same after. A Cypher query on a read-only connection, with a timeout, walks the relationships. Whatever comes back brings its evidence with it. For the parking bot that is the sweep schedule on the curb. For the vote tracker it is the timestamp in the video.
Some of the habits inside that pipeline are the ones we recommend for agents on FalkorDB, and these teams got there on their own inside four hours. Several teams had Gemini write typed facts straight into the graph, checked against a schema first. Most seeded with MERGE, so re-running the import at 4 PM cost them nothing. Kieran was the one person who tried text-to-Cypher, and he put a read-only guard and a timeout around it. Across the room the model got to suggest and a read-only query got to decide. Two teams sent graph rows back to Gemini before it answered, so the reply stayed tied to real data. And the parking bot and the capsule machine both tell the user, in plain words, when the database is out of reach. The person on the other end is a renter or a tourist who will act on the reply. Telling them the truth about what the system knows is the feature.
Build what these teams built
The get started guide takes you from a running FalkorDB to your first query in a few minutes. Then write one query that crosses two relationships. That is where a graph starts to pay.
Get started with FalkorDBThank you
To our partners at Google Gemini and Photon, to Entrepreneurs First for the room, to the 130 communities that hosted a room of their own, and to everyone who gave up a Saturday to build for someone else. Build what humanity needs next.
