← Examples Gallery

Alap v3 — External Data

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.

Local Only

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

External Only

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"

External Only (GitHub API)

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

External Only (JSONPlaceholder)

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:"

Mixed: Local + External

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:

Scoping

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