Gabriella439/simple-twitter
A bare-bones Twitter clone implemented in a single file
{ "createdAt": "2019-10-12T20:56:39Z", "defaultBranch": "main", "description": "A bare-bones Twitter clone implemented in a single file", "fullName": "Gabriella439/simple-twitter", "homepage": null, "language": "Nix", "name": "simple-twitter", "pushedAt": "2025-04-09T22:33:34Z", "stargazersCount": 730, "topics": [], "updatedAt": "2025-10-29T08:40:02Z", "url": "https://github.com/Gabriella439/simple-twitter"}simple-twitter
Section titled “simple-twitter”This is a project which has corresponding talk slides
This is a bare bones “Twitter clone” implemented in [a single file]!(./simple-twitter.nix) that you can deploy to EC2
This uses:
- HTML + CSS for the front-end (No JavaScript)
- Bootstrap for some minimal styling
- A Haskell service for server-side rendering
- A Postgres database for application state
- NixOps for deployment
- AWS EC2 for hosting
The result looks like this:

Instructions
Section titled “Instructions”-
Create an AWS account
… by following these instructions
-
Install Nix:
Terminal window $ curl https://nixos.org/nix/install | sh -
Install the AWS command-line interface:
Terminal window $ nix-env --install awscli -
Configure your AWS credentials
… by following these instructions
If you did this correctly you should have an
~/.aws/credentialsfile that looks similar to this:[default]aws_access_key_id = …aws_secret_access_key = … -
Install NixOps:
Terminal window $ nix-env --install nixops -
Build and redeploy the web application
Terminal window $ nixops create --deployment simple-twitter simple-twitter.nix$ nixops deploy --deployment simple-twitter --allow-reboot
If you make changes you can redeploy the application by re-running the last step:
$ nixops deploy --deployment simple-twitter --allow-rebootTo destroy the machine and clean up everything, run:
$ nixops destroy --deployment simple-twitter$ nixops delete --deployment simple-twitterHave fun! 🙂
Split files
Section titled “Split files”You can also view the files split out by language:
- [
./split.nix]!(./split.nix) - Only the Nix code - [
./Main.hs]!(./Main.hs) - Only the Haskell code - [
./initialScript.sql]!(./initialScript.sql) - Only the SQL code