DEV Community

Cover image for I Asked AI to Design a Hackathon App. 5 Minutes Later It Was in Production.
Jbee - codehooks.io
Jbee - codehooks.io

Posted on

I Asked AI to Design a Hackathon App. 5 Minutes Later It Was in Production.

Hackathon season is here and you've volunteered to organize one. Now you need a system to track events, teams, participants, submissions, judges, and scores. You could spend a week building it. Or you could describe it to an AI, paste some JSON, and have a production app running in five minutes.

I chose five minutes. Here's how.

What We're Building

Hackathon HQ — a complete hackathon management platform with six interconnected collections:

  • Events — hackathon details, dates, tracks, and banner images
  • Participants — hackers with skills, experience level, GitHub handle, and T-shirt size
  • Teams — linked to an event, with multi-select member assignment
  • Submissions — projects linked to teams and events, with demo URLs, screenshots, and status tracking (Draft through Winner)
  • Judges — assigned to events, with expertise areas and bios
  • Scores — judges rate submissions on innovation, execution, impact, and presentation

An event's detail page shows its teams, submissions (with "Winners" and "Finalists" filter buttons), and assigned judges. A submission shows all its judge scores. Everything is cross-linked, searchable, and sortable.

react admin panel dashboard

Se the above screenshot of the finished hackathon admin dashboard.

The react-admin-dashboard template for Codehooks.io lets you spin up a complete admin panel for any domain — CRM, project management, inventory, ticketing, you name it. Describe your data to an AI, paste the JSON datamodel, and you get a production app with authentication, role-based access, dynamic forms, file uploads, related collections, and auto-generated REST API docs. One JSON file drives the entire stack: React frontend, serverless backend, NoSQL database.

Prerequisites

  • Node.js 18+
  • A free Codehooks.io account
  • Any AI assistant (ChatGPT, Claude, Gemini — they all work)

Step 1: Scaffold the Project (2 minutes)

Install the Codehooks CLI and create a new project from the template:

npm i -g codehooks
coho login
coho create hackathonhq --template react-admin-dashboard
cd hackathonhq
mv config.json backend
Enter fullscreen mode Exit fullscreen mode

Set the JWT secrets (used for authentication):

coho set-env JWT_ACCESS_TOKEN_SECRET $(openssl rand -hex 32)
coho set-env JWT_REFRESH_TOKEN_SECRET $(openssl rand -hex 32)
Enter fullscreen mode Exit fullscreen mode

Install dependencies:

npm run install:all
Enter fullscreen mode Exit fullscreen mode

Update frontend/vite.config.js with your project URL (run coho info to find it):

const BACKEND_URL = 'https://YOUR_PROJECT.api.codehooks.io/dev';
Enter fullscreen mode Exit fullscreen mode

Deploy the template with the default datamodel:

npm run deploy
Enter fullscreen mode Exit fullscreen mode

Get your project URL from your YOUR_PROJECTe.g. hackathonhq-jvel

coho info --projectname hackathonhq-jvel --space dev
Enter fullscreen mode Exit fullscreen mode

In my project I see these endpoints:

API endpoints: 

https://serendipitous-canyon-61e2.codehooks.io
https://hackathonhq-jvel.api.codehooks.io/dev
Enter fullscreen mode Exit fullscreen mode

You now have a working admin dashboard at your project syntetic URL (serendipitous-canyon-61e2). Log in with admin / admin.

The name: Project Management is just the default template that is installed when starting a new project.

Step 2: Ask AI to Design Your Hackathon App (1 minute)

This is the magic part.

Open your deployed app, navigate to the Datamodel page (admin only), and click the "Copy Prompt" button. This copies a detailed prompt to your clipboard that describes the entire datamodel format — field types, relationships, validation rules, everything the AI needs to generate valid output.

Now open your favorite AI assistant and paste the prompt. Add your request:

Design a hackathon management system. I need: Events (name, description, status pipeline from Planning to Completed, dates, location, max teams, prizes as markdown, banner image). Participants (name, email, GitHub username, primary skill enum, experience level, photo, t-shirt size). Teams belong to an event with multi-select members from participants, a track enum (Web, Mobile, AI/ML, DevTools, Open Innovation, Social Impact), repo URL, and project description. Submissions belong to an event and team, with project title, description, demo/repo/video URLs, screenshot upload, submitted timestamp, and status (Draft through Winner). Judges belong to an event with expertise area and bio. Scores link a judge to a submission with 1-10 ratings for innovation, execution, impact, presentation, plus a total and notes. Events should show related teams, submissions (with Winner and Finalist filter buttons), and judges. Submissions should show their judge scores. Make the json string easy to copy to clipboard.

The AI returns a complete JSON datamodel. Here's the key part — look at how relationships are defined:

{
  "app":  {
    "title":  "Hackathon Management",
    "subtitle":  "Manage events, participants, teams, submissions, judges and scoring",
    "icon":  "trophy"},
  "collections":  {
    "events":  {
      "label":  "Events",
      "icon":  "calendar",
      "schema":  {
        "type":  "object",
        "required":  [
          "name",
          "status",
          "startDate",
          "endDate"],
        "properties":  {
          "name":  {
            "type":  "string",
            "title":  "Event Name",
            "minLength":  1
          },
          "description":  {
            "type":  "string",
            "title":  "Description",
            "format":  "textarea"},
          "status":  {
            "type":  "string",
            "title":  "Status",
            "enum":  [
              "Planning",
              "Open for Registration",
              "In Progress",
              "Judging",
              "Completed"],
            "default":  "Planning"},
          "startDate":  {
            "type":  "string",
            "title":  "Start Date",
            "format":  "date"},
          "endDate":  {
            "type":  "string",
            "title":  "End Date",
            "format":  "date"},
          "location":  {
            "type":  "string",
            "title":  "Location"},
          "maxTeams":  {
            "type":  "integer",
            "title":  "Max Teams",
            "minimum":  1,
            "default":  50
          },
          "prizes":  {
            "type":  "string",
            "title":  "Prizes (Markdown)",
            "format":  "textarea"},
          "banner":  {
            "type":  "string",
            "title":  "Banner Image",
            "format":  "image",
            "x-accept":  ".jpg,.jpeg,.png,.webp"}
        }
      },
      "listFields":  [
        "name",
        "status",
        "startDate",
        "endDate",
        "location",
        "maxTeams"],
      "searchFields":  [
        "name",
        "description",
        "location"],
      "defaultSort":  {
        "startDate":  -1
      },
      "relatedCollections":  [
        {
          "collection":  "teams",
          "foreignKey":  "event._id",
          "title":  "Teams",
          "displayFields":  [
            "name",
            "track",
            "repoUrl"],
          "sort":  {
            "name":  1
          },
          "allowCreate":  true
        },
        {
          "collection":  "submissions",
          "foreignKey":  "event._id",
          "title":  "Submissions",
          "displayFields":  [
            "projectTitle",
            "team",
            "status",
            "submittedAt"],
          "sort":  {
            "submittedAt":  -1
          },
          "allowCreate":  true,
          "filters":  [
            {
              "field":  "status",
              "value":  "Finalist",
              "label":  "Finalists",
              "active":  false
            },
            {
              "field":  "status",
              "value":  "Winner",
              "label":  "Winners",
              "active":  false
            }
          ]
        },
        {
          "collection":  "judges",
          "foreignKey":  "event._id",
          "title":  "Judges",
          "displayFields":  [
            "name",
            "expertiseArea",
            "email"],
          "sort":  {
            "name":  1
          },
          "allowCreate":  true
        }
      ]
    },
    # CLIPPED JSON CONTENT HERE
}
Enter fullscreen mode Exit fullscreen mode

Three things to notice:

  1. x-lookup on the event field creates a searchable dropdown linking teams to events
  2. members as an array with x-lookup creates a multi-select — search participants by name or email, add multiple to a team
  3. relatedCollections with filters on the event gives you toggle buttons to show only Winners or Finalists

Switch to the JSON tab in the datamodel editor, paste the AI-generated JSON, and click Save.

That's it. Your hackathon organizer is live. No redeployment. No backend changes. Just JSON.

Step 3: Explore What You Got

Refresh the page. The sidebar now shows six collections — Events, Teams, Participants, Submissions, Judges, Scores — each with its own icon.

Let's walk through what the template auto-generated from that JSON.

Dynamic Forms with Validation

Click "+ New" on Events. You get a full form: text inputs, an enum dropdown for status, date pickers, a markdown textarea for prizes, and an image uploader for the event banner. Required fields are marked, validation runs on save.

Multi-Select Team Members

Open a team form. The Members field lets you search participants (add some here first) by name or email and add multiple people. Each member shows as a tag with their name and primary skill. This comes from defining members as an array with x-lookup — the template handles the rest.

Searchable Lookups

On the submission form, the Event and Team fields are searchable dropdowns. Start typing and it live-searches the target collection. This comes from x-lookup in the schema — zero extra code.

Related Collections with Filters

Open an event's detail page. Below the event details, you see three sections: Teams, Submissions, and Judges. Submissions has toggle buttons for "Winners" and "Finalists" — click one to filter instantly. Each section has a "+ New" button that pre-fills the event reference.

Judge Scores on Submissions

Open a submission. Below the project details, you see Judge Scores — every score entry from every judge, with their individual ratings and totals. This is another relatedCollections definition, and it required zero code to set up.

Activity Log

Every action across all collections is automatically logged. Navigate to the Activity page to see who created which teams, when submissions were updated, and who assigned scores.

Auto-Generated API Documentation

Navigate to https://your-app-url.codehooks.io/docs to get a full Swagger UI with interactive API docs — generated automatically from your datamodel. Every collection has documented CRUD endpoints. Need to build a public submission form or a participant registration page? The API is already there.

Dark Mode

Toggle the theme in the sidebar. Because every hackathon needs a dark mode.

How It Works

The architecture is straightforward: one JSON drives everything.

Your datamodel defines collections, field schemas, relationships, and UI configuration. The backend validates all writes against the schema. The frontend fetches the datamodel at runtime and renders forms, lists, and relationships dynamically.

The datamodel lives in the database — not in a file. The initial datamodel.json seeds the first deployment. After that, every change goes through the visual editor or API, with full version history and one-click rollback. Schema changes never require redeployment.

datamodel.json (seed) ──> Database (versioned)
                              │
                    ┌─────────┴─────────┐
                    ▼                   ▼
              Backend               Frontend
         (validates writes)    (renders UI dynamically)
Enter fullscreen mode Exit fullscreen mode

Tech stack: React 18, Tailwind v4, and shadcn/ui on the frontend. Codehooks.io serverless Node.js with a NoSQL datastore on the backend. JWT auth with httpOnly cookie sessions. One command deploys everything.

Ready-Made Examples

The template ships with example datamodels:

Example Collections Highlights
Hackathon Events, Teams, Participants, Submissions, Judges, Scores Multi-lookup, filters, cross-references
CRM Companies, Contacts, Deals, Activities Lookups, related lists, stage filters
Project Management Members, Projects, Milestones, Tasks Tree view, multi-lookup teams
Product Catalog Categories, Suppliers, Products, Parts Nested tree views, bill of materials
Product CMS Pages, Products, Features Page hierarchy, content management

Copy any JSON into your datamodel.json, deploy, and you have a working app.

Get Started

The full template is open source:

GitHub: react-admin-dashboard

npm i -g codehooks
coho create myapp --template react-admin-dashboard
Enter fullscreen mode Exit fullscreen mode

Five minutes from now, you could have a production admin dashboard running. No CRUD boilerplate. No auth plumbing. No form builders.

Describe what you need. Let AI write the JSON. Ship it.


What would you build with this? I'm curious what datamodels people come up with. Drop your ideas in the comments.

Top comments (0)