Pager banner

Pager

9 devlogs
9h 25m 16s

WebUI / MCP server wrapper for Pagem.com so I don’t have to pay their subscription fee to use their API

This project uses AI

Used cursor for debugging the pager code/handling auth states on pagem. Also used for gramatical fixes on the readme

Demo Repository

Loading README...

Evan Yu

Shipped this project!

Hours: 9.42
Cookies: 🍪 77
Multiplier: 6.84 cookies/hr

I’ve built a wrapper around a pager app “Pagem” so I can give Poke (an AI assistant) and some friends the ability to get ahold of me in emergencies. It’s built with Next.js and Convex. Additionally, I’ve managed to get a MCP server running on Convex HTTP actions using Hono + Muppet.dev

Evan Yu

Voters please read this

This is essentially a website that allows some people (and an AI assistant) to ring my phone. Pagers are old, antequated devices from the mid-1990s that ring and display messages. I have an app installed on my phone called Pagem that does exactly that, since I always have my phone in DND mode, and it’s near impossible for some people to get ahold of me.

However, I’m only allowed to have 3 contacts on their free plan. This project allows me to give access to as many people as I want. (in addition to exposing a MCP server too). There’s not really a way for you to test it (I value the little sleep I get :p), however there is a video that hopefully will suffice. I built this using Next.js and Convex as it’s the stack I’m most used to, and Convex is just goated lol


I’ve finally finished it, and have it deployed on https://pager.evanyu.dev/
Unfortunately, I can’t give out credentials to demo this as it rings my phone extremely loudly lmao

I’ve written detailed instructions on how to deploy this yourself on the repo https://github.com/Badbird5907/pageme

Watch the demo video: https://youtube.com/watch?v=zYOWyxfwU_M

Attachment
Attachment
Attachment
0
Evan Yu

Added an audit log, MCP info, and also a last used at field for API tokens and users.
Most of this was just some UI changes, since the data was already in the database. I just needed to add a Card with some (disabled) Input components for the MCP info, and pretty much copy over the page history datatable and add some columns.

The only thing I added was a lastUsedAt field for API tokens and users. This is updated when the token is used/when the JWT is minted

Attachment
Attachment
Attachment
0
Evan Yu

I just hooked up a MCP to it using Hono running on Convex HTTP Actions + Muppet. Poke seems to be able to send me a page, so this project is nearly done
Most of this was pretty straightforward. Muppet already supports serving over Hono, so I just needed to set up Hono for Convex HTTP actions and pipe the request to Muppet with pretty much the demo code they supply

Attachment
Attachment
0
Evan Yu

I’ve implemented most of the admin dashboard, including a user list, and API key management.
Pretty straightforward stuff with datatables, etc… Convex makes this stuff super easy with their react hooks. The best part of using convex is that if data updates (mutates) on one browser, all connected clients update too

Attachment
Attachment
Attachment
0
Evan Yu

I’ve set up a history page using Tanstack tables and shadcn. Pretty simple; just needed to add a by_createdAt_fromUser index to the convex table and using that index, filter by the user, sorted by creation time.

Attachment
0
Evan Yu

I’ve implemented a ui for paging, and also reworked auth (again) to still mint custom JWTs, and use convex’s Custom JWT Provider. It’s quite jank, but I don’t care, it works lol. Convex exposes an /auth/login http endpoint that validates the login, and mints a JWT token for that user. I then have some jank code on the client that sets the token returned in the browser’s cookies. I then implement a useAuth hook that’s then passed to Convex’s react <ConvexProviderWithAuth> component

Attachment
0
Evan Yu

No idea why i’ve decided to roll my own auth. I’ve reworked the JWT signing and have also implemented enforcing the JWT/admin role on the next server

Attachment
0
Evan Yu

Bootstrapped the next project, and set up auth with convex. Didn’t feel like setting up better-auth (and it wouldn’t fit with the scope of my project), so I’ve decided to instead roll my own “fake-ish” auth. Users log in with a username and PIN I give them, and my convex server just mints a JWT and authenticates agains that. It’s janky but I don’t care

Attachment
0
Evan Yu

I’ve reverse engineered how the Pagem API works, and i’ve reimplemented it in convex. So now i’m able to page my phone. Next i’ll build a webui around it, and also run a MCP server and give it to poke

Attachment
Attachment
0