EagleChirp.com

From GoodWikiRead.com
Jump to navigation Jump to search
EagleChirp.com
Type of siteMicroblogging and social networking
Created byStan Switaj
URLeaglechirp.com
Written inPython 3, JavaScript
DatabasePostgreSQL
Web servernginx + fcgiwrap
Created2026
Current statusActive

EagleChirp.com is a microblogging and social networking website created and programmed by Stan Switaj, carrying the tagline Find your flock. Members post short messages — chirps — that can mix text with images, video and animated stickers, follow one another, reply, like, bookmark, search and exchange direct messages. It is written in Python 3 with a PostgreSQL database, and is structured as a JSON API behind a single-page front end written in plain JavaScript.

EagleChirp is a sibling of Switaj's EaglePress content management system and follows the same conventions — the same database class, the same replacement for Python's removed CGI library, the same session and authentication pattern — but where EaglePress renders pages on the server through a theme system, EagleChirp serves one shell and does its rendering in the browser.

Features

An account is created with at least three interest categories, which the platform uses to assemble a personalised feed. Three feeds are offered: For You, which draws posts whose categories overlap the viewer's declared interests; Following, which draws from accounts the viewer follows; and News, which carries posts flagged as news.

Posts are composed in a multi-block editor: rather than a single text field with attachments bolted on, a post is an ordered list of blocks, so text can be written before and after each image, video or animated sticker. The composer includes an emoji picker and a sticker picker that is entirely self-contained — the animated stickers are shipped with the site and indexed by its own manifest, so no third-party service such as Giphy or Tenor is involved and no API key is required.

Around the posts sit the ordinary furniture of a social network: likes, replies — themselves posts, linked to what they answer — private bookmarks, member profiles, search, a notifications panel, and direct messages with blocking. Following is instant in the manner of a public network rather than request-and-approve, and following someone notifies them.

Visitors who are not signed in can browse: the feed, the News tab, profiles, search and individual threads are all readable without an account, with the site prompting for sign-in only where an action requires one. That boundary is enforced on the server rather than by hiding buttons, with the endpoints that require a session refusing unauthenticated calls outright.

Authors can delete their own posts at any time, but editing is restricted to the first hour after a post is created, enforced by the server. Account settings allow a display name, private first and last names never exposed by the API, an email change subject to a thirty-day cooldown, and a password change that requires the current password and signs out the account's other sessions. Settings also list the accounts a member has blocked with a way to unblock them — a deliberate addition, since blocking otherwise could only be undone from the blocked account's own profile or a message thread.

Architecture

A single script serves one static HTML shell for every path that is not an API call or an asset; it does no routing at all. The client does the routing, using the browser's history API for paths such as the home feed, search, news, bookmarks, message threads, profiles and individual posts, with the web server sending every such path to the shell so that deep links work.

The front end is one immediately-invoked function with no build step, and it is written to deliberate constraints: no promises and no async/await, with every network call going through a small set of helpers built on jQuery's AJAX function and a plain callback, and a failed request reported to the callback rather than thrown. The document object model is built with a small element helper rather than by assembling HTML strings.

On the server, each API endpoint is a small script that returns JSON and never renders HTML. A shared backbone module supplies the request bootstrap, the login requirement, the canonical projection of a post joined to its author, and a serializer that batches the block, like and bookmark lookups for a page of posts so that endpoints stay small and avoid issuing a query per row.

Feeds page by timestamp cursor rather than by offset: a request asks for posts newer than a cursor, for pull-to-refresh and the new chirps pill, or older than one, for infinite scrolling, and responses come back newest-first with the newest and oldest timestamps and a flag for whether more remain. The batch size is fifty.

The data model is deliberately explicit. Tables cover accounts, sessions, categories and each member's interests, posts and their blocks, media, follows, likes, bookmarks, notifications, messages, blocks and settings. There is no single content column on a post — the ordered blocks are the content, with a denormalised copy of the text kept only for search. Counters such as post, comment, like, reply and follower totals are maintained by the endpoints themselves rather than by database triggers.

Authentication uses PBKDF2 password hashing and 64-character hexadecimal session tokens held in a cookie and looked up in the database. Because Python 3.13 removed the standard library's CGI module, the project carries the same drop-in replacement used across Switaj's other sites, and every endpoint imports it rather than the standard library.

The site is deployed on nginx with fcgiwrap: static assets and uploads are served directly from disk, the API scripts run as CGI, and every other path falls through to the shell.

See also