Public
Like
kipclip-appview
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.
Bookmark your web with a friendly chicken. Save and organize bookmarks using the AT Protocol community bookmark lexicon.
- AT Protocol OAuth authentication
- Save bookmarks to your personal data server (PDS)
- Automatic URL enrichment (title extraction)
- View and manage your bookmarks
- Uses community.lexicon.bookmarks.bookmark schema
- Frontend: React + TypeScript + Tailwind CSS
- Backend: Hono + AT Protocol OAuth
- Database: Val.town SQLite for OAuth session storage
- Bookmark Storage: User's PDS (not in appview database)
kipclip-appview/
βββ backend/
β βββ database/ # Drizzle schema & migrations
β βββ routes/ # API & static routes
β βββ services/ # URL enrichment
β βββ index.ts # Main Hono app
βββ frontend/
β βββ components/ # React components
β βββ index.html # Bootstrap
β βββ index.tsx # React entry
β βββ style.css # Custom styles
βββ shared/
βββ types.ts # Shared TypeScript types
- Deno installed
- Val Town account
Create these in your Val.town environment:
BASE_URL=https://your-val.val.town
That's it! Val.town provides SQLite automatically.
# Type check deno task check # Run quality checks (format, lint, type check, test) deno task quality # Deploy to Val.town deno task deploy
The kipclip mascot is a friendly chicken carrying a bookmark bag. Replace the
placeholder image URL in frontend/components/Login.tsx
with your
Cloudinary-hosted mascot image.
- User enters their AT Protocol handle
- App redirects to
/login?handle=user.bsky.social
- OAuth package handles authentication with user's PDS
- Session stored in Val.town SQLite (30 days)
- User can now view/add bookmarks
GET /api/bookmarks
- List user's bookmarks from PDSPOST /api/bookmarks
- Add new bookmark with URL enrichmentDELETE /api/bookmarks/:rkey
- Delete a bookmark/api/auth/session
- Check current session/api/auth/logout
- Logout/login
- OAuth login flow/oauth/callback
- OAuth callback
Bookmarks are stored using the community lexicon:
{
subject: string; // URL being bookmarked
createdAt: string; // ISO 8601 datetime
tags?: string[]; // Optional tags
}
The app enriches bookmarks with page titles by fetching and parsing HTML metadata.
- Keep code files under 500 lines
- Write testable code with dependency injection
- Test files go next to code:
service.ts
βservice.test.ts
- Follow SOLID principles
- Use TypeScript for all code
MIT