Find it, Kip it. Save and organize bookmarks using the AT Protocol community bookmark lexicon.
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
Create these in your Val.town environment:
BASE_URL=https://your-val.val.town COOKIE_SECRET=your-random-secret-string-at-least-32-chars
Val.town provides SQLite automatically. The COOKIE_SECRET is required for
encrypting OAuth session cookies.
# 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.
/login?handle=user.bsky.socialGET /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 callbackBookmarks 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.
service.ts → service.test.tsMIT