---
title: "Deploy atproto-tap-example"
description: "Template for backfilling on atproto"
category: "Other"
url: https://railway.com/deploy/atproto-tap-example
---

# Deploy atproto-tap-example

Template for backfilling on atproto

**[Deploy atproto-tap-example on Railway](https://railway.com/template/atproto-tap-example)**

- **Creator:** Bailey Townsend's Projects
- **Category:** Other
- **Total deploys:** 3

## Template content

### tap

- **Image:** ghcr.io/bluesky-social/indigo/tap:latest
- **Public domain:** Yes

### Postgres https://devicons.railway.app/i/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:17

## Documentation

# Deploy and Host atproto-tap-example on Railway

Backfill atproto records made easy

## About Hosting atproto-tap-example

Set configs and deploy your atproto-tap-example backfiller on Railway.

## Common Use Cases

- Backfilling atproto records
- Listening for new atproto records

## Dependencies for atproto-tap-example Hosting

- [tap](https://github.com/bluesky-social/indigo/blob/main/cmd/tap/README.md)
- postgresql


### Deployment Dependencies

- [tap](https://github.com/bluesky-social/indigo/blob/main/cmd/tap/README.md)
- [@atproto/tap](https://github.com/bluesky-social/atproto/blob/main/packages/tap/README.md) - TypeScript SDK for interacting with tap

### Implementation Details 
Example consuming tap

```javascript
import { Tap, SimpleIndexer } from '@atproto/tap'

const tap = new Tap('https://{your tap service public domain}', {adminPassword: 'topsecret'})

const indexer = new SimpleIndexer()

indexer.identity(async (evt) =&gt; {
    console.log(`${evt.did} updated identity: ${evt.handle} (${evt.status})`)
})


indexer.record(async (evt, opts) =&gt; {

    const uri = `at://${evt.did}/${evt.collection}/${evt.rkey}`
    if (evt.action === 'create' || evt.action === 'update') {
        console.log(`${evt.action}: ${uri}`)
    } else {
        console.log(`deleted: ${uri}`)
    }
    //Uncomment to NOT acknowledge the event from the tap server so you can re run the script during development
    // opts.ack = () =&gt; console.log('"acknowledged"')
})


indexer.error((err) =&gt; console.error(err))

const channel = tap.channel(indexer)
channel.start()
```

## Why Deploy atproto-tap-example on Railway?


Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying atproto-tap-example on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — [Jul'26] Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/atproto-tap-example
