Public
LikePhotoFrame
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.
Viewing readonly version of main branch: v97View latest version
A no-build photo frame web app built for a Val Town/Deno deployment model.
The app uses Hono for the HTTP server, Hono JSX for the HTML shell, and a plain browser JavaScript file for client-side interactivity.
The current implementation supports:
- selecting multiple photos from the local device
- previewing them in a setup screen
- naming the current collection
- removing photos from the collection
- adding a caption to each photo
- saving collection data and image files locally in the browser
- starting a fullscreen-style slideshow player
- showing captions over presented photos
- auto-hiding slideshow controls when the mouse is idle
- changing slideshow settings like interval, fit mode, shuffle, loop, and crossfade
This project is in active MVP development.
What works now:
- Deno/Hono server entrypoint
- local upload flow
- local collection persistence with
IndexedDB - lightweight settings persistence with
localStorage - slideshow playback with next, previous, and exit controls
- photo captions
- optional crossfade transitions
What is planned next:
- Val Town blob storage integration
- remote collection metadata persistence
- image compression/resizing on upload
- support for multiple collections
- Deno
- Hono
- Hono JSX for the server-rendered page shell
- Plain browser JavaScript for client-side behavior
- CSS served directly by Hono
- IndexedDB for local photo storage
- localStorage for simple UI preferences
docs/ plan.md static/ app.js styles.css deno.json main.tsx
Check the app:
deno task check
Start the development server:
deno task dev
Start the server without watch mode:
deno task start
Then open:
http://localhost:8000
The app intentionally does not store image data in localStorage. That storage
is too small for real photo usage.
Instead:
- image files are stored in
IndexedDB - collection metadata is stored in
IndexedDB - slideshow preferences are stored in
localStorage
The remote Val Town blob persistence layer has not been wired yet.
The target product shape is:
- Val Town-friendly no-build app structure
- local-first slideshow setup
- simple fullscreen-style playback
- optional remote persistence via Val Town blob storage
- later support for cross-device saved collections
The current planning document lives in docs/plan.md.
- There is no Vite build step.
- There is no Preact runtime.
- The browser app logic lives in
static/app.js. - The server entrypoint is
main.tsx.