Reedr is an alternative reader for Hacker News that is designed to be used on mobile, tablets as well as laptops / desktops.
Specifically designed for quick reading, it makes use of a side feed and reader view to allow users to quickly browse through articles. Furthermore, cascading comments allow readers to skip over filler comments and dive deeper into insightful discussion.
Frontend built using Typescript, React and Redux.
Backend built using Typescript, Express and Axios.
CI/CD pipeline built using Github Actions.
Deployed using Docker, AWS Elastic Container Registry (ECR) and AWS App Runner.
You can directly access Reedr through the following link: reedr.joshfung.dev
- Make sure you have Docker installed
- Open a terminal in the root directory and run the following command to build the images:
docker compose -f ./compose.yaml build --build-arg API_URL="http://host.docker.internal:8000"- In the same terminal, after the prior command is done running, run the following command to start the containers:
docker compose up -d- To stop the containers when you're done, you can run the following in the terminal:
docker compose downThe following are extra features I have considered implementing next:
- Lockdown the backend
- Rather than leaving it publicly accessible, I would like to make it such that only the frontend can access the backend (opted to skip for now as there is no sensitive data nor authentication)
- Make use of VPCs and Security Groups to restrict access to the backend
- Reverse proxy so client goes through frontend to access backend
- Improve styling
- More nitpicking that anything, but I would like to improve the styling of the app
- Comments that make use of markdown COULD be styled better to show it's markdown
- Links within a comment should be aggregated somewhere in the comment for easier access and organization
- Clean up CSS 😔
- Improve fetching / render times
- Currently, the app fetches each story and comment individually (due to Hacker News' current API design) -- Could investigate more into this

