A real-time interactive presentation tool for Last Conference that allows presenters to embed activities (polls, questions, etc.) throughout their talks. Audience members scan a QR code to participate, and responses are displayed in real-time to the presenter.
id (INTEGER PRIMARY KEY)name (TEXT) - Name of the talkpresenter (TEXT) - Presenter nametalk_deck_link (TEXT) - Link to presentation slidescreated_at (TEXT) - Timestampid (INTEGER PRIMARY KEY)presentation_id (INTEGER) - Foreign key to presentationsstep_number (INTEGER) - Order within presentationwidget_type (TEXT) - Type of widget (poll, question, etc.)widget_config (TEXT) - JSON configuration for the widgetis_active (INTEGER) - Whether this step is currently active (0 or 1)id (TEXT PRIMARY KEY) - Session ID (UUID)presentation_id (INTEGER) - Which presentation they're increated_at (TEXT) - Timestampid (INTEGER PRIMARY KEY)session_id (TEXT) - Foreign key to sessionsstep_id (INTEGER) - Foreign key to stepsresponse_data (TEXT) - JSON data of the responsecreated_at (TEXT) - Timestampbackend/
├── index.ts # Main Hono app entry point
├── database/
│ ├── migrations.ts # Database schema setup
│ └── queries.ts # Database query functions
└── routes/
├── presentations.ts # Presentation CRUD
├── steps.ts # Step management
├── sessions.ts # Session handling
├── responses.ts # Response handling
└── admin.ts # Admin/presenter endpoints
frontend/
├── index.html # Main HTML template
├── index.tsx # Frontend entry point
├── components/
│ ├── App.tsx # Main app component
│ ├── PresenterMode.tsx # Presenter view
│ ├── ParticipantMode.tsx # Participant view
│ ├── QRCode.tsx # QR code display
│ └── widgets/
│ ├── PollWidget.tsx # Poll widget
│ ├── PollPresenter.tsx # Poll presenter view
│ └── [OtherWidgets].tsx # Future widgets
└── utils/
├── session.ts # Session management (localStorage)
└── api.ts # API client functions
shared/
└── types.ts # TypeScript types/interfaces
Each widget has:
GET /api/presentations - List all presentationsPOST /api/presentations - Create new presentationGET /api/presentations/:id - Get presentation detailsPUT /api/presentations/:id - Update presentationGET /api/presentations/:id/steps - Get all steps for a presentationPOST /api/presentations/:id/steps - Create new stepPUT /api/steps/:id - Update stepPUT /api/steps/:id/activate - Activate a step (deactivates others)GET /api/steps/active - Get currently active stepPOST /api/sessions - Create or get existing sessionGET /api/sessions/:id - Get session detailsPOST /api/responses - Submit a responseGET /api/steps/:id/responses - Get all responses for a stepGET /present/:presentationId/step/:stepNumber - Presenter view for a stepGET /join/:presentationId - Participant view (redirects to active step)qrcode via esm.sh/join/:presentationIdwidget_config column