WebUI / MCP server wrapper for Pagem.com so I don’t have to pay their subscription fee to use their API
Used cursor for debugging the pager code/handling auth states on pagem. Also used for gramatical fixes on the readme
WebUI / MCP server wrapper for Pagem.com so I don’t have to pay their subscription fee to use their API
Used cursor for debugging the pager code/handling auth states on pagem. Also used for gramatical fixes on the readme
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
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
Log in to leave a comment
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
Log in to leave a comment
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
Log in to leave a comment
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
Log in to leave a comment
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.
Log in to leave a comment
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
Log in to leave a comment
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
Log in to leave a comment
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
Log in to leave a comment
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
Log in to leave a comment