skip to content
cowsay.farm

Twitter bot

@cowsay_farm posts developer quotes as cowsay images. The content is automated end-to-end: we pick a random quote, render it through cowsay, turn it into an image, and post to Twitter. All of that is driven by our tweeter and GitHub Actions cron jobs.

The tweeter pipeline

The tweeter is a Node/Bun script that runs in CI. For each run it:

  1. Picks a random quote from a community-specific text file (e.g. quotes_general.txt, quotes_js.txt, quotes_rust.txt).
  2. Renders cowsay ASCII using the classic cowsay program, then applies lolcat-style rainbow coloring.
  3. Converts to an image (PNG) via headless browser (Puppeteer) and image conversion.
  4. Posts to Twitter via the Twitter API: image-only tweet on the main timeline and/or in a specific Twitter Community, depending on which workflow ran.

Build in Public runs use the same pipeline but prepend Day X of building the cowsay ecosystem in public: to the tweet. Each workflow is wired to a quotes file and a target (timeline or community).

Cron jobs (GitHub Actions)

We use 15 GitHub Actions workflows, each on a schedule (cron). All times are in CET. In total we post 15–21 tweets per day.

Workflows live under .github/workflows/ and can be triggered manually via Actions β†’ [workflow name] β†’ Run workflow. The schedule, community IDs, and quote-file mapping are documented in docs/TWEET_SCHEDULE.md.

Communities we post on

We actively post developer quotes and cowsay content across these Twitter/X communities:

Want us to post on your community?

Hit us up and we'll setup the bot to add some energy and engagement in your community πŸ€—

Why it matters for the ecosystem

The bot is the content engine for Cowsay: it keeps @cowsay_farm active, attracts developers into the community, and feeds the same quote culture that shows up in our NFTs and shop. Revenue from NFTs and merch goes to token buybacks and burns; the bot helps grow the audience that benefits from that loop.