• Blog
  • Docs
  • Pricing
  • We’re hiring!
Log inSign up
fwfben

fwfben

live-talk

Public
Like
live-talk
Home
Code
17
backend
5
frontend
4
scripts
2
shared
1
.dev-server.log
.dev-server.pid
.gitignore
.vtignore
AGENTS.md
Makefile
README.md
H
app.http.ts
deno.json
H
hello.http.ts
package.json
plan.md
server.ts
Branches
1
Pull requests
Remixes
History
Environment variables
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
Code
/
Search
https://fwfben--8ad50288c51711f0932842dde27851f2.web.val.run
README.md

Live Talk - Interactive Presentation Tool

An interactive presentation tool for Last Conference that allows presenters to embed real-time 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.

Features

  • Real-time Interaction: Participants join via QR code and respond to activities
  • Session Persistence: Participant sessions are stored in localStorage for consistent experience
  • Multiple Steps: Presentations can have multiple steps/activities
  • Poll Widget: Built-in poll widget with real-time results visualization
  • Presenter & Participant Modes: Separate views for presenter and audience
  • Modern UI: Clean, responsive design with TailwindCSS

Tech Stack

  • Backend: Hono (Deno-compatible web framework)
  • Database: SQLite (Val Town standard library)
  • Frontend: React 18.2.0 with TypeScript
  • Styling: TailwindCSS
  • Platform: Val Town / Deno

Project Structure

β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ 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 participant view
β”‚   β”‚       └── PollPresenter.tsx    # Poll presenter view
β”‚   └── utils/
β”‚       β”œβ”€β”€ session.ts        # Session management (localStorage)
β”‚       └── api.ts            # API client functions
β”œβ”€β”€ shared/
β”‚   └── types.ts              # TypeScript types/interfaces
└── server.ts                 # Local development server

Local Development

The app automatically detects the environment and uses:

  • Local SQLite (./live_talk.db) when running locally (using sql.js)
  • Val Town SQLite when deployed to Val Town (detected via valtown environment variable)

Quick Start

Use the development script to manage the server:

# Start the server ./scripts/dev.sh start # or make dev # or npm run dev # Check server status ./scripts/dev.sh status # or make dev-status # or npm run dev:status # Stop the server ./scripts/dev.sh stop # or make dev-stop # or npm run dev:stop # Restart the server ./scripts/dev.sh restart # or make dev-restart # or npm run dev:restart

The script handles:

  • Starting the server with all required Deno permissions
  • Process management (PID tracking)
  • Proper cleanup of all child processes when stopping
  • Logging to .dev-server.log

Manual Start (Alternative)

If you prefer to start manually:

deno run --allow-net --allow-read --allow-write --allow-import --allow-env --watch server.ts

Access the App

  • Open http://localhost:8000 in your browser
  • The server will automatically reload on file changes
  • A local SQLite database file (live_talk.db) will be created automatically
  • Database operations work fully locally without Val Town credentials

Note: The local SQLite uses sql.js (pure JavaScript SQLite) which loads WASM files. The first request might take a moment to initialize.

Usage

Creating a Presentation

Use the API to create a presentation:

curl -X POST http://localhost:8000/api/presentations \ -H "Content-Type: application/json" \ -d '{ "name": "My Awesome Talk", "presenter": "John Doe", "talk_deck_link": "https://example.com/slides" }'

Adding Steps

Create steps (activities) for your presentation:

curl -X POST http://localhost:8000/api/steps/presentation/1 \ -H "Content-Type: application/json" \ -d '{ "widget_type": "poll", "widget_config": { "question": "What is your favourite programming language?", "options": ["JavaScript", "Python", "Rust", "Go"] } }'

Presenter View

Navigate to /present/:presentationId to access the presenter view:

  • See QR code for participants to join
  • View real-time responses
  • Activate/deactivate steps
  • Navigate between steps

Example: http://localhost:8000/present/1

Participant View

Participants navigate to /join/:presentationId:

  • Automatically assigned a session ID (stored in localStorage)
  • See the currently active step
  • Submit responses
  • Page auto-updates when presenter changes steps

Example: http://localhost:8000/join/1

API Endpoints

Presentations

  • GET /api/presentations - List all presentations
  • POST /api/presentations - Create new presentation
  • GET /api/presentations/:id - Get presentation details
  • PUT /api/presentations/:id - Update presentation

Steps

  • GET /api/steps/presentation/:id - Get all steps for a presentation
  • POST /api/steps/presentation/:id - Create new step
  • GET /api/steps/:id - Get step details
  • PUT /api/steps/:id - Update step
  • PUT /api/steps/:id/activate - Activate a step
  • GET /api/steps/presentation/:id/active - Get active step

Sessions

  • POST /api/sessions - Create or get existing session
  • GET /api/sessions/:id - Get session details

Responses

  • POST /api/responses - Submit a response
  • GET /api/responses/step/:id - Get all responses for a step

Widget System

The system is designed to be extensible. Currently supports:

  • Poll Widget: Multiple choice questions with real-time results

Future widgets can be added by:

  1. Creating participant component in frontend/components/widgets/
  2. Creating presenter component in frontend/components/widgets/
  3. Adding widget type handling in ParticipantMode.tsx and PresenterMode.tsx

Database Schema

  • presentations: Presentation metadata
  • steps: Steps/activities within presentations
  • sessions: Participant sessions
  • responses: Participant responses to steps

See backend/database/migrations.ts for full schema details.

Deployment to Val Town

  1. Upload all files to a Val Town project
  2. The HTTP trigger file is app.http.ts - this is the main entry point for Val Town
  3. Val Town will automatically detect app.http.ts as an HTTP trigger (because it has http in the filename)
  4. Ensure all dependencies are available via esm.sh or Val Town standard libraries
  5. The app will automatically run migrations on startup
  6. Your app will be accessible at the URL provided by Val Town

Note: For local development, use server.ts which imports from backend/index.ts. For Val Town deployment, use app.http.ts directly.

License

Built for Last Conference

HTTP
  • app.http.ts
    fwfben--8ad50288c51711f0932842dde27851f2.web.val.run
  • hello.http.ts
    fwfben--8a…f2.web.val.run
Code
backendfrontendscriptsshared.dev-server.log.dev-server.pid.gitignore.vtignoreAGENTS.mdMakefileREADME.md
H
app.http.ts
deno.json
H
hello.http.ts
package.jsonplan.mdserver.ts
FeaturesVersion controlCode intelligenceCLIMCP
Use cases
TeamsAI agentsSlackGTM
DocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareers
We’re hiring!
Brandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Open Source Pledge
Terms of usePrivacy policyAbuse contact
Β© 2025 Val Town, Inc.