Skip to content

Algolia Sync

Push records to an Algolia search index whenever they are created, updated, or deleted on the network.

Script type: record event (e.g. record.index:<nsid>)

local json = require("internal.json")
local http = require("happyview.http")
function handle(input, ctx)
local headers = {
["X-Algolia-API-Key"] = "your-api-key",
["X-Algolia-Application-Id"] = "your-app-id",
["Content-Type"] = "application/json",
}
if input.action == "delete" then
http.delete("https://YOUR-APP.algolia.net/1/indexes/records/" .. input.uri, {
headers = headers,
})
else
http.put("https://YOUR-APP.algolia.net/1/indexes/records/" .. input.uri, {
headers = headers,
body = json.encode({
objectID = input.uri,
collection = input.collection,
did = input.did,
record = input.record,
}),
})
end
return input.record or true -- `record` is nil on delete; `true` lets it proceed
end
  1. On create or update: sends a PUT request to Algolia’s index API with the record data, using the AT URI as the objectID. Algolia upserts the object — if it already exists, it’s replaced.
  2. On delete: sends a DELETE request to remove the object from the index by its AT URI.

input is the record event. json.encode converts the Lua table into a JSON string for the request body. See JSON.

Replace the placeholder values:

PlaceholderValue
your-api-keyYour Algolia Admin API key (with write permissions)
your-app-idYour Algolia Application ID
YOUR-APPYour Algolia application subdomain (same as the Application ID)
recordsThe Algolia index name (choose any name you like)

This record script keeps an external search index in sync with your indexed records in real time. Users searching through Algolia get results that reflect the latest state of the network without polling or scheduled jobs.

Combine this with a query script that searches Algolia instead of the local database for a full-text search experience that goes beyond what happyview.db’s search offers.