Postr banner

Postr

13 devlogs
24h 19m 34s

Postr is a terminal-based blog/forum app

Ever thought about being able to post blogs about random stuff straight in the terminal with other people or even host your own blog with your own server? You probably didn't but I made it anyway.

Enj…

Postr is a terminal-based blog/forum app

Ever thought about being able to post blogs about random stuff straight in the terminal with other people or even host your own blog with your own server? You probably didn’t but I made it anyway.

Enjoy!

Demo Repository

Loading README...

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 4 days ago

blud even used the same emoji

ChiChi
ChiChi 4 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