The :web: protocol fetches data from APIs and turns it into
Alap links. The config maps keys to endpoints — the handler does the rest.
Results cache locally, so menus open instantly after the first fetch.
These use allLinks — no API calls.
Photography links
— all items tagged .photography
My bookmarks — macro expanding to three saved photographers
Recent NYC landmarks — tags + time filter
These fetch from the Open Library API via :web:.
Photography books
— search alias: "street photography film"
Douglas Adams books
— search alias: "douglas adams hitchhiker"
Gardening books
— search alias: "vegetable garden organic"
Same :web: protocol, different API. GitHub search repos.
Top JavaScript repos — sorted by stars
Top Rust repos — sorted by stars
CSS frameworks — sorted by stars
Fake REST API — always available, good for testing.
Recent posts — first 8 posts
protocols: {
web: {
generate: webHandler,
keys: {
books: {
url: "https://openlibrary.org/search.json",
linkBase: "https://openlibrary.org",
searches: {
photography: { q: "street photography film", limit: 8 },
adams: { q: "douglas adams hitchhiker", limit: 8 },
gardening: { q: "vegetable garden organic", limit: 8 },
},
map: { label: "title", url: "key", meta: { author: "author_name.0" } }
}
}
}
}
data-alap-linkitems=":web:books:photography:"
data-alap-linkitems=":web:books:adams:"
Local bookmarks merged with API results. Refiners scoped by parentheses.
Bookmarks + top 3 photography books — macro union with scoped external results
NYC landmarks, then architecture books — comma-separated local and external, each with own scope
All photography — local photography links + photography books from the API
@my_bookmarks | (:web:books:photography: *sort:label* *limit:3*)
(.nyc + .landmark *sort:label*), (:web:books:architecture: *limit:5*)
.photography | :web:books:photography:
Parentheses control where refiners apply.
Bookmarks + Adams (limit 10 total) — limit applies to the whole result
Bookmarks + top 3 Adams books — sort and limit scoped to the books only
@my_bookmarks | :web:books:adams: *limit:10* — limit the whole result
@my_bookmarks | (:web:books:adams: *sort:label* *limit:3*) — only the books are sorted and limited