Bookmark Shelf
Bookmark manager API that derives domains and tag counts as computed columns, served with FastAPI
One app.py with 1 table, 4 computed columns, 5 HTTP routes. Needs pixeltable[serve]>=0.7.14. Updated 2026-09-22.
app.py
"""Bookmark Shelf API built with Pixeltable.pxt schema update app.py shelfpxt service run app.py shelf"""import pixeltable as pxtimport pixeltable.functions as pxtffrom pixeltable.serving import FastAPIRouterfrom udfs import extract_domain, tag_count, title_blurb# ---- tables ----TableModel = pxt.model_base()class Bookmarks(TableModel, name='bookmarks'):id = pxt.Column(value=pxtf.uuid.uuid7(), primary_key=True)url: pxt.Stringtitle: pxt.Stringtags: pxt.String | Nonenotes: pxt.String | Nonedomain = extract_domain(url)title_upper = pxtf.string.upper(title)n_tags = tag_count(tags)blurb = title_blurb(title)# ---- queries ----@pxt.querydef shelf(domain: str):"""Everything saved from one domain."""return Bookmarks.where(Bookmarks.domain == domain).select(Bookmarks.id, Bookmarks.blurb, Bookmarks.url, Bookmarks.n_tags).order_by(Bookmarks.title)# ---- routes ----bookmarks_api = FastAPIRouter(name='bookmarks_api')bookmarks_api.add_insert_route(Bookmarks, path='/bookmarks',inputs=[Bookmarks.url, Bookmarks.title, Bookmarks.tags, Bookmarks.notes],outputs=[Bookmarks.id, Bookmarks.domain, Bookmarks.title_upper, Bookmarks.n_tags, Bookmarks.blurb],)bookmarks_api.add_update_route(Bookmarks, path='/bookmarks/update',inputs=[Bookmarks.title, Bookmarks.tags],outputs=[Bookmarks.id, Bookmarks.n_tags, Bookmarks.blurb],)bookmarks_api.add_delete_route(Bookmarks, path='/bookmarks/delete')bookmarks_api.add_compute_route(Bookmarks, path='/domain', inputs=[Bookmarks.url], outputs=[Bookmarks.domain])bookmarks_api.add_query_route(path='/shelf', query=shelf, method='get')
What app.py declares
Each row links to its line.
- runs on insert
- stored
- index
- route
serves bookmarks_api
- POST/bookmarksinsert, bookmarkstakes url, title, tags, notes; returns id, domain, title_upper, n_tags, blurbL40
- POST/bookmarks/updateupdate, bookmarkstakes title, tags; returns id, n_tags, blurbL45
- POST/bookmarks/deletedelete, bookmarksL50
- POST/domaincompute, bookmarkstakes url; returns domainL51
- GET/shelfquery, shelftakes domainL52
Run it
Needs uv. The routes then answer on port 8000.
terminal
git clone https://github.com/pierrebrunelle/pixeltable-bookmark-shelfcd pixeltable-bookmark-shelfuv syncuv run pxt schema update app.py shelfuv run python seed.py shelfuv run pxt service run app.py shelf --port 8000
Related apps
- Forge Heat CyclesForge heat-cycle registry API: B-tree indexes, chained risk UDFs, and parallel shop-floor writersShares: UDFs
- Climbing Route ToposClimbing-route topo registry API: photo uploads with thumbnails, grayscale copies, grade bands and index-backed crag lookupsShares: UDFs
- Warehouse Pick ListsWarehouse pick-list REST API: units, pick zones, waves and tote labels as incremental computed columns over Json order linesShares: UDFs