Activity

ChiChi

Shipped this project!

Hours: 6.23
Cookies: 🍪 66
Multiplier: 8.77 cookies/hr

I built Flavortown Food Battle, a live community food-voting web app where users can submit dish ideas, vote on them, comment on them, and compete on a leaderboard. I started with a very simple React/Vite prototype, but gradually expanded it into a more complete app with Firebase Firestore, anonymous authentication, live database updates, category filtering, a top-three podium, comment sections and various stuff

The hardest part was connecting the frontend to Firebase properly and making the app work like a real shared website rather than just a local prototype. I had to handle user identity, environment variables, and deployment issues. I also had to change my moderation approach when the Perspective API became too awkward to set up, so I replaced it with a simpler banned-word filter that works reliably for the prototype.

I am most proud that the app feels complete and usable. Other people can open the live website, submit food ideas, vote, comment, and see the leaderboard update. It also has practical moderation features, such as admin deletion and basic language filtering, so it feels more like a real community platform than just a small demo.

ChiChi

what’s new???

dish comment system

added a comment section under each food card so users can leave short reactions or feedback on dishes
comments are saved with each dish in Firebase, which means they stay visible after refreshing and can be seen by other users on the live website

comment input and display

each dish now has a comment input box and a post button
users can write short comments up to 100 characters, making the app feel more interactive and community-focused instead of only being a voting leaderboard

admin comment moderation

added admin controls for comments so inappropriate comments can be deleted directly from the food card
this improves moderation because the admin can manage content from the app interface instead of manually editing the Firebase database

basic banned-word filter

replaced the external Perspective API moderation system with a simple built-in banned-word filter
this makes the project easier to deploy because it no longer depends on a separate API key, while still blocking inappropriate language before it is saved

post and comment moderation

the banned-word filter now checks both dish submissions and comments
if inappropriate language is detected, the app blocks the submission and shows an alert to the user

comment visibility fix

improved the comment styling so posted comments, empty comment text, and typed comment input text are easier to read
the comment text is now darker, which makes the comment section clearer and more usable

bi-parrot-2

Changelog

Attachment
0
ChiChi

whats’s new???

Vercel deployment

deployed Flavortown Food Battle using Vercel so the app can stay online without needing to run from my own computer
connected the GitHub repository to Vercel, which means the website automatically rebuilds and updates whenever I push new commits

live public website

the project now has a real public website link that other people can open and use
this makes the app feel much more complete because users can submit dishes and vote from their own devices instead of only testing it locally

environment variables on Vercel

added the Firebase and app environment variables into Vercel so the deployed version can connect to the correct Firebase project
this allows the live site to use Firestore, anonymous authentication, admin mode, and the moderation API without hardcoding the values directly into the source code

Firebase hosting compatibility

checked the live deployment with Firebase so the app can still load dishes, submit new dishes, update votes, and display the leaderboard correctly
this confirms that the database features work outside of the local development environment

deployment settings

used the Vite preset on Vercel and kept the default build settings, including the build command, install command, and output directory
this made the deployment process simpler because Vercel could automatically detect the correct setup for the React/Vite app
yayayayayay-67-spedup

Changelog

Attachment
0
ChiChi

what’s new???

Firebase database system

connected Flavortown Food Battle to Firebase Firestore, so food ideas are now stored online instead of only inside the browser. The app uses a live database listener, so the feed updates automatically whenever the database changes.

online dish submission

updated the submit system so new dishes are saved to Firestore with a name, description, category, vote counts, and creation time. After submitting, the form clears automatically so users can add another dish quickly.

live voting system

changed the upvote and downvote buttons so votes are saved online using Firebase. When a user votes, the database updates and the app refreshes the score in real time.

leaderboard upgrade

the leaderboard now ranks dishes using shared Firebase data instead of temporary local data. Scores are calculated using upvotes minus downvotes, so the highest-rated dishes move to the top automatically.

new visual design

added a food banner image, a cleaner hero section, the Fredoka font, rounded cards, category pills, hover effects, and a three-column layout. This makes the app feel more polished and more like a finished food-voting web app.

loading and empty states

added messages for when dishes are loading, when the feed is empty, and when the leaderboard has no dishes yet. This stops the app from looking broken while waiting for data or when there are no submissions.

yay-anya

Changelog

Attachment
0
ChiChi

what’s new???

first working prototype

built the first version of Flavortown Food Battle as a React/Vite web app
the app now has a complete basic layout with a title, description, food submission area, food feed, and leaderboard
this gives the project a proper usable structure instead of just being an empty starter page

food submission system

added a form that lets users create their own food ideas by entering a food name, description, and category
when the form is submitted, the new food is added directly to the food feed
also added simple validation so empty food names or descriptions cannot be submitted

voting system

added upvote and downvote buttons to each food card
when a user votes, the vote count updates immediately on the page
each food now has a score calculated from its votes, using upvotes minus downvotes

leaderboard system

added a leaderboard that ranks all food submissions by their score
the leaderboard updates automatically when users vote, so the highest-rated food ideas move to the top
this makes the app feel more like a proper food competition instead of just a list of submissions

basic visual design

added a warm food-themed colour scheme with cream and orange tones
used card-style panels, rounded corners, shadows, and spacing to make the app feel more polished
the layout is split into Create a Food, Food Feed, and Leaderboard sections so users can understand the app quickly

GitHub setup

connected the local project folder to the existing GitHub repository
pushed the first working version to the main branch

Changelog

Attachment
0
ChiChi

Shipped this project!

Hours: 24.33
Cookies: 🍪 841
Multiplier: 28.8 cookies/hr

I started building Postr for basically no reason. My friend told me to do Flavortown because “it’ll be fun” and “there might be a reward”, and I was like yeah “for sure”, absolutely not believing that this can into anything serious but ts was kinda really fun.

Postr started as a tiny terminal posting thing, and then it slowly became a full on public/private blog and forum app. It now has login/register, posts, replies, editing, deleting, search, remembered accounts, admin moderation, a public Railway server, private local hosting, SQLite/PostgreSQL support, and it is even installable from PyPI with pip install postr-tui, which still feels insane imo.

The hardest part was definitely making everything actually work outside my own computer. Local code is one thing. Making it survive hosting, databases, packaging, public users, broken CSS paths, refresh bugs, and my own terrible decisions of pushing private info onto my public github forgetting about .gitignore
was actaully a brick move.

I’m proud of Postr because it went from “what if I make a random terminal forum” to something people can actually install, run, post on, and self-host. It is a bit chaotic, but it works, and honestly that is very much on me being such a messy programmer and I should of put more comment lol.

P.S. Special Shoutout to Dennis for inspiring me to do this project. W

ChiChi

what’s new???

search system

added post search so users can press / and filter posts by title, author, or content
the search now works live while typing, and pressing Esc clears and closes the search box
also fixed the search focus behaviour so it appears properly after login and does not stop the app from quitting

reply submit shortcut

changed reply submission from Ctrl + S to Shift + Enter
this feels more natural because Enter can still be used for writing multiline replies, while Shift + Enter sends the reply

editable replies

added support for editing selected replies
the E key is now context-awared: if a reply is selected, it edits the reply; if no reply is selected, it edits the selected post,
reply editing also follows permissions, so users can only edit their own replies unless they are running with admin access

public server refresh improvements

improved refresh behaviour so post changes update more smoothly without requiring manual reloads
auto-refresh now respects the current search filter and avoids interrupting users while they are typing replies
Lastly, guess what, its:

Shipping time

yayayayayay yayayayayay yipee yipee

Changelog

Attachment
0
ChiChi

what’s new???

admin owner mode

added a local owner/admin file system so the app can detect when the user is running Postr as the owner
the admin key is stored locally in an ignored file instead of being typed manually every time, and the client can automatically send the admin key when editing or deleting content
this makes moderation much easier because the owner can delete posts or replies directly from the TUI rather than using PowerShell commands

package fix

fixed the installed PyPI version not being able to find postr.tcss
the app now resolves the CSS path relative to main.py, which means it works properly when launched using the postr-tui command after installation

public server refresh fixes

fixed an issue where deleted posts were removed from the server but still appeared in the sidebar until pressing reload
the delete flow now refreshes the post list immediately after deletion
also added auto-refresh so the public server view can stay more up to date without constant manual reloading

reply composer polish

improved the reply flow so the write-reply box can stay hidden until needed, keeping the reading layout cleaner
the composer can be shown when replying and hidden again after submitting

holy

Changelog

0
ChiChi

what’s new???

PyPI release

published Postr-TUI properly so other people can now install it with pip install postr-tui
also set up GitHub Actions with PyPI Trusted Publishing, so future versions can be released through GitHub Releases instead of manually uploading with tokens

admin moderation

added an admin delete system before public release
the server now supports an admin key through POSTR_ADMIN_KEY, allowing inappropriate posts or replies to be removed even if the admin is not the original author
also made sure the key stays in Railway environment variables instead of being hardcoded into the codebase

security and release cleanup

checked the project for release safety by making sure .env, local databases, config files, build folders, and secrets are ignored by Git
also changed Flask debug mode so it is not hardcoded as enabled in production

README update

rewrote the README so it explains the project properly instead of being too basic
it now covers installation, server modes, local hosting, database support, admin moderation, controls, remember-me behaviour, development commands, publishing workflow, and security notes
also added Markdown links so users can easily find the PyPI package and project resources
vibepartycat

Changelog

Attachment
0
ChiChi

what’s new???

selectable replies

changed replies from plain preview text into a proper selectable reply list
this means individual replies can now be highlighted and interacted with, instead of just being shown as static markdown under the post

delete own replies

added the ability to delete a specific selected reply by pressing X
this follows the same ownership rule as posts, so users can only delete replies that they wrote themselves
the backend was updated with a proper DELETE /replies/ route and matching database functions for both SQLite and Postgres

reply layout improvements

reworked the post page layout so the post preview, replies, and write-reply area feel more separated
the replies section now has more space and clearer spacing between items, while the write-reply box is smaller and no longer dominates the screen
also added the idea that the reply composer can be hidden/shown with a keybind, making the interface cleaner when users are just reading

scrolling and preview consistency

fixed the post preview so long posts can scroll instead of being cut off
also changed the preview formatting so the text keeps a similar structure to the editor, making posts look more consistent between editing and reading

bug fixes

fixed routing and database issues around reply deletion, including the difference between SQLite and Postgres placeholder syntax
also fixed several UI layout problems where the reply box or replies list took up too much space

overall

this update makes the forum side of Postr feel much more complete: replies are selectable, individually deletable, better spaced, and easier to read so a huge W in the chat!

yayayayayay

Changelog

Attachment
Attachment
0
ChiChi

what’s new???

selectable replies

changed the reply system so replies are no longer just plain markdown text under a post
they now appear in their own selectable replies list, which makes the app feel much more like a real forum thread
when a post is selected, Postr loads the post preview at the top and then shows the replies separately underneath, so each reply can be interacted with properly

delete own replies

added support for deleting individual replies
users can now select a specific reply and press X to delete it, instead of only being able to delete a whole post
this also respects ownership, so users can only delete replies that they wrote themselves
backend reply deletion
added proper backend support for deleting replies through a new DELETE /replies/ route
also added database helpers for finding a reply by ID and deleting it in both the Postgres and SQLite versions of the database layer
this keeps public Railway hosting and private local hosting working consistently

bug fixes

fixed a few route and database bugs while adding reply deletion
the client was trying to call /replies/, but the server route was not set up correctly at first, which caused a 404 error
also corrected the database placeholder differences between Postgres and SQLite, so reply deletion works in both environments

overall

this update makes the reply system much more complete
Postr now supports posts, replies, author-only post editing/deleting, and author-only reply deletion, which makes the public/private forum workflow feel much more finished

yayayayayay

Changelog

Attachment
0
ChiChi

what’s new???

faster loading

refactored the client so the heavier network requests now run through async worker-style methods instead of blocking the whole interface
this makes loading posts, rendering replies, creating posts, editing, deleting, and submitting replies feel smoother and less frozen
also fixed the threading issue by using asyncio.to_thread(…), so the app can keep the TUI responsive while still using normal requests calls

local hosting fix

added SQLite support back for private local servers
the backend can now use Postgres when DATABASE_URL exists, like on Railway, but automatically falls back to SQLite when running locally
this means public hosting and private self-hosting both work from the same codebase, which fits postr’s public/private server idea much better

remember me system

added a remember system so users do not have to type their login details every time
the app can remember the last username and server, while storing the password more safely through the system credential store instead of just dumping it into a normal config file
this makes postr feel much more like a real app rather than a prototype that forgets everything after closing

better login/register ui

reworked the login screen so login and register are now separate tabs instead of relying on Ctrl+R
users can switch between login and register with the arrow keys, then submit using Enter or the button at the bottom
registration now automatically logs the user in, which makes the first-time user flow much cleaner
also improved the remember-me checkbox.

Changelog

Attachment
0
ChiChi

what’s new???

async client refactor

cleaned up main.py quite a lot and moved the main request-heavy actions into async worker-backed methods
loading posts, rendering replies, creating posts, editing, deleting, and submitting replies now run through a cleaner async flow instead of lots of repeated direct request handling
also replaced the broken thread helper approach with asyncio.to_thread(…), which fixed the runtime error and made the network calls behave properly

code cleanup

added shared helpers for formatting posts/replies, validation, and common checks like whether a post is selected, whether a server is connected, and whether the logged-in user is the author
this removed a lot of repeated code and made the client much easier to read and maintain

author-only protections

finished tightening up author permissions so edit/delete now properly respect ownership
the client checks whether the current user is the author before allowing those actions, and the server also enforces the same rule, so it is no longer just a frontend restriction
also improved how the user identity is sent with requests, which helped fix the hosted edit/delete failures

forum-style reply box

changed the reply flow so the reply area sits directly below the post preview instead of forcing a separate popup
you can now still see the post and existing replies
bi-parrot-2

Changelog

Attachment
0
ChiChi

what’s new???

public hosting

got the postr server deployed on railway and confirmed the live public api worked properly
also checked persistence so posts survive deployment instead of disappearing, which means public mode is now genuinely usable

server selection

finished the public / private / custom server flow at startup
the client now lets users choose whether to connect to the hosted public server, their own local private server, or a custom compatible url before login

client cleanup

cleaned up repeated logic in main.py, especially around preview rendering and server/post checks
this made the client less messy and easier to work with while keeping the same functionality

repo / readme cleanup

sorted out .gitignore so build artefacts, db files, and other junk are ignored properly
also worked on updating the README so it matches the real client/server version of postr instead of the old local markdown version

replies

added replies/comments support to the backend with a sqlite replies table and routes for getting and creating replies
then wired the client to fetch replies when a post is selected and display them underneath the main post
also added a reply popup so users can now reply directly inside postr

yayayayayay yayayayayay yayayayayay

Changelog

Attachment
Attachment
Attachment
0
ChiChi

what’s new???

server-backed posting

finished moving the main post flow over to the backend, so postr is no longer half local notebook and half server experiment
the client can now load, create, edit, and delete posts through the flask api, which means the full post lifecycle is now properly server-driven

edit + delete fixes

fixed the old edit and delete logic so it stopped relying on local file paths and started using server post ids instead
also fixed the edit save flow, response handling, and preview updates so editing now works properly end to end

server selection

added a server selection flow at startup so users can choose between a public server, a private local server, or a custom server url before logging in
this is the foundation for making postr work both as a shared public app and a self-hosted private one

package progress

got the package working locally under the new name postr-tui, then built and uploaded it to testpypi successfully
that means the package structure, build process, and upload flow are now working, which is a big step towards letting other people install it

other stuff

fixed a lot of migration bugs during the move from local-file logic to proper client/server behaviour, including bad assumptions, broken attributes, and indentation issues
overall this devlog was mainly about finishing the move from local blog tool into a real networked post system
yayayayayay

Changelog

Attachment
Attachment
2

Comments

eee
eee 17 days ago

blud even used the same emoji

ChiChi
ChiChi 17 days ago

Hmm I have no idea what u mean

ChiChi

What’s new???

full screen edit view

fixed the bug where the edit screen wasn’t properly filling the whole screen and still looked like a popup
changed the styling so it behaves more like a proper full-page editor now, which makes editing feel way cleaner and more intentional

client / server split

started moving postr from a local notebook-style app into a clearer client/server structure
split the project so the client and server are separate, which made the code easier to manage and debug
also fixed the package/module setup so the client can run properly from the project root

flask + sqlite backend

set up the real backend using flask and connected it to sqlite instead of fake hardcoded data
added a proper posts table so post data is now stored on the server with title, author, content, and creation time

server CRUD routes

implemented the main post routes: GET /posts, POST /posts, PUT /posts/, and DELETE /posts/
tested each one in powershell to make sure the database was actually updating correctly

client now reads from server

replaced the old local-file loading system with requests to the flask server
the sidebar now loads posts from GET /posts and previews server-backed data instead of markdown files on disk

other stuff

fixed a lot of transition bugs during the move from local files to client/server
yayayayayay

Changelog

Attachment
0
ChiChi

what’s new?

login + user system

added a login screen and a current-user system so the app now knows who is using it during that session
posts now store an author field based on the logged-in user, so content is tied to an identity instead of just being anonymous local text files
this is the first real step toward making it feel more like a forum / shared posting system rather than just a straight up notepad –

password hashing + auth backend

added a proper auth backend using sqlite + bcrypt, so accounts can actually exist instead of usernames just being vibes typed into a popup
created the users table, added register and login functions, and made password storage use hashing instead of storing raw passwords like a maniac
also tested the auth functions separately in the python shell first to make sure registration and password checking actually worked before trying to wire it into the ui
so now the foundation is there for actual accounts, even if the frontend side is still being refined

validation / anti-breakage checks

started hardening the app so random input can’t just break everything
added username validation, password validation, post title validation, and post content validation so stuff like empty inputs, absurdly long titles, or giant pasted walls of text get rejected immediately
also added safer file handling around reading, writing, saving, and deleting so postr throws notifications instead of crashing if a file is missing / broken / unreadable
so a lot of the recent work was basically making postr less fragile and way more sendable

ui theme changes

reworked the styling into a much darker and cleaner theme so it looks more modern and less default-terminal-core. yay

Changelog

Attachment
Attachment
Attachment
Attachment
0
ChiChi

Since the last update, I have:

  • Added a delete post feature so a selected post can be removed from inside Postr
  • Implemented logic to keep track of the currently selected post path for deletion and editing
  • Added a delete confirmation popup to prevent posts from being removed immediately by accident
  • Set up confirmation controls so the user can press Y or Enter to confirm deletion, or N / Esc to cancel
  • Updated the app so that after deleting a post, the sidebar refreshes automatically
  • Reset the preview panel to the welcome message after a post is deleted
  • Improved the app structure by separating UI into different screens, including a New Post screen and a Delete Post confirmation screen
  • Added an Edit Post screen
  • implemented the save edited post so changes can be just written back
  • The shortcut for all of the feature are at the bottom of the screen for a fast and effective workflow
Attachment
Attachment
Attachment
0
ChiChi

So I worked a bit on the Postr today, I didn’t know devlog existed at least until my friend told me and I decide to post it. Its a a terminal-based blog application built with Python and Textual.

I have:

  • Set up the main text UI with a sidebar for posts and a preview panel for markdown content
  • Added styling with a separate Textual CSS file to improve the layout and appearance
  • Implemented logic to load markdown files from the posts folder and display the selected post in the preview area
  • Reached a stage where Postr now somewhat works as a basic post viewer (hopefully)
  • Started building a new-post feature using a modal input screen inside the app
Attachment
Attachment
0