Cyclic.sh shut down. Here is the closest thing.
Cyclic was free, deployed from GitHub and gave every app a public address, which made it the default home for a first Express app or Discord bot. It closed in 2024. The same shape exists here: a repository, a free always-on app, an https address.
Moving a Cyclic app
- The repository is still on GitHub: connect it.
- Cyclic wrapped Express apps in a serverless handler; here the app is a normal long-running process, so
app.listen(process.env.PORT || 8080, "0.0.0.0")is all it needs. Remove any Cyclic-specific adapter. - Move environment variables across.
- Deploy; give the app an address; point your domain at it.
The differences that matter
Cyclic was serverless: no persistent files, cold starts, a DynamoDB add-on. Here the app is a process with a persistent /data folder, so SQLite works, long-lived WebSocket connections work, and a Discord bot runs as itself rather than through a keep-alive trick. Databases are managed MySQL, PostgreSQL, MongoDB or Redis on a private network.
Cost
The first app is free once the email is verified. More apps or more memory start at $2 a month; there is no usage meter.
Frequently asked questions
Does the Cyclic DynamoDB data come along?
Not automatically. Export it from AWS and load it into a managed database or a file under /data.
Will the app cold start like on Cyclic?
A bot or worker never sleeps. A web app's free address sleeps when idle and wakes on the next request; a paid tier keeps it awake at no extra cost.
How does the public address work?
Give the app a web address in the panel and it is served at https://name.fadehost.app behind the Cloudflare proxy with a certificate. It comes with the plan on every tier. On the free tier the address sleeps when nobody has used it for a while and wakes on the next request; on a paid tier it stays awake. Your own domain can point at it.
What happens on a deploy?
The repository is cloned at your branch, dependencies install, the build runs when there is one, the app starts. With auto-deploy on, every push does the same. The live console shows each step; a failed one is explained in plain words.