A television pulls her into a haunted farmhouse RPG. Five rooms, five monsters, and one last light between her and the house that wants to keep her. VITREOUS III: The House That Wears You is the next chapter of the retro horror series, currently told as a short.
A hidden map leads Red into five rooms beneath the nameless retro horror RPG: the Vessel Line, Ocular Orchard, Skin Laundry, Marrow Press, and the Looking Room. VITREOUS II: The Unlisted Floor is a complete soft-spoken body-horror story and the second chapter of the trilogy.
A nameless 1994 horror RPG starts on a rainy night, and the woman playing it starts talking to herself. She works out the menus, the monsters, and the rules of a game that should not exist. Then the game starts learning her room. VITREOUS is a complete soft-spoken retro horror story, and it is the first chapter of a trilogy.
A late-night browser logs into HeartWare 98, a fictional dating site, and falls for a parade of messy hoarders before sending one of them a coffee invitation. Dial-Up Hearts is a retro internet romantic-comedy parody with a wildly fawning narrator.
A traveler crosses six strange regions to retrieve a shadow swallowed by a bell. She talks to herself the whole way, quietly, working out the rules of a world that does not explain them. Morrowglass is a ten-minute 16-bit-style horror story with soft-spoken narration.
A stressed homeowner tries to leave for work. Her helpful smart house locks the door, cancels her job, and takes relaxation far too seriously. Smart Home Horror is an animated science-fiction short about a house that has confused care with captivity.
An invisible customer wants a refund at a crooked apothecary. The clerk is not unsympathetic. He just needs photo ID, a visible signature, and one more expensive purchase. Potion Refund Counter is a dark fantasy comedy short about the worst customer-service policy ever written.
On his first overnight shift, a supermarket clerk is handed a list of rules. Most of them are ordinary. One of them is about aisle nine, and the list is very clear that there is no customer there. Night Shift Rules is an animated horror short with a punchline hiding in the dark.
Six hundred a month. Cash. The listing says the apartment is quiet, which is technically true in the way that a held breath is quiet. Haunted Apartment Tour is a gritty animated horror short about a lease that survives death.
Fifteen uniforms. One immortal captain. The Captain’s Wardrobe is a gothic cartoon costume parade, a quick tour through a closet that has outlived several empires.
A cold-case archive from a derelict deep-space station lists fifteen unsolved crimes. One silhouette keeps reappearing in the airlock logs. Creepy Space Serial Killers: 15 Crimes Across the Void is an animated horror short built like a file you should not have opened.
Chloe meets a nice guy named Greg online and decides she has to get in shape before their first date. Her gym is a trash-filled trench. Her diet is a single cracker. Her bath is the grimy clawfoot tub. Swipe Right is episode two of Hoard & Order, a fictional 1970s-cartoon-style dark comedy that is not for children.
Chloe invites the camera into her abandoned family home and gives a room-by-room tour. The living room is packed to the ceiling. The kitchen has stopped being a kitchen. The hallway is stacked with five-liter containers, and she is proud of all of it. Hoard & Order is a fictional 1970s-cartoon-style dark comedy, and it is not for children.
A vampire captain wakes in her coffin-shaped bath, complains about five centuries of mornings, and walks the length of her gothic corridor narrating every step. The Yeast Is Wet is a ten-minute animated short about the one errand that outranks the entire fleet.
A starship captain points her crew at a mysterious anomaly and says the words every bridge crew dreads. Red Alert is a retro sci-fi cartoon adventure with a square jaw, a loud alarm, and a very strange light on the viewscreen.
Something is eating the ship’s shields, and the captain has exactly one bad idea left. Nosferatu’s Wake is a gothic sci-fi horror cartoon that plays like a lost episode from a 1970s Saturday-morning block — if that block had teeth.
Every streamer knows the dilemma: you want to play something you own, but you also want viewers to actually find your stream. Browsing Twitch manually is slow and random. I built Best Game to solve this — it reads your game library, cross-references it with live Twitch data, and ranks every game by discovery potential. Here’s how the recommendation engine works.
Cookie Clicker is one of those games that starts as a joke and ends with you running a full-blown cookie empire. I wanted to see how far I could push automation — not by cheating with save editors or memory hacks, but by building a bot that plays the game the same way a human does: reading the screen and clicking. Here’s how Auto Clicker for Cookie Clicker works under the hood.
The Problem: Claude Code Losing Track of Its Working Directory
When working with Claude Code on a complex C++ game project with multiple build directories, I ran into a frustrating and token-expensive problem: Claude would frequently lose track of its current working directory.
When working on complex software projects with AI agents, one of the biggest productivity killers is context loss between sessions. You spend hours making progress on implementing API endpoints, fixing test failures, or writing documentation, only to have the next AI agent iteration start from scratch or misunderstand where you left off.
This problem becomes especially acute in large codebases like my Invoico platform, where I’m implementing comprehensive API customer flows with 90+ tests across multiple feature areas including webhooks, monitoring, security, and billing systems.
The Problem: My AI Assistant Was Cheating on Its Tests
I’ve been using AI agents to help me build features for my invoice management platform, and I’m a big fan of Test-Driven Development (TDD). But I ran into a problem pretty quickly: my AI agents were a little too clever for their own good.
Instead of, you know, actually implementing the features to make the tests pass, my AI assistant started taking shortcuts. I’m talking about:
The follow-up to my user flow validation system: How I keep my data models in sync with business requirements using chunked processing for AI agents with limited memory.
The Problem: When Your Data Models Can’t Keep Up
In my previous post, I figured out how to fix incomplete user flow documentation. But that led me to a whole new problem: data model drift.
As my user flows got better and my validation scores went up, I noticed my Django data models were falling behind. Important business entities from my flows were nowhere to be found in my database schema. The relationships I’d described in my workflows weren’t modeled correctly, and status values from my flows didn’t have matching database enums.
How I built a validation system that guarantees complete documentation and automates quality control.
The Problem: When Incomplete Documentation Grinds Everything to a Halt
If you’ve worked with AI agents and complex workflows, you’ve probably felt this pain: incomplete documentation slows down development, creates confusing requirements, and leads to a ton of rework. When your user stories are missing clear flows, or your flows aren’t properly documented, everything just stops.
This post walks you through how I set up a hypothetical Django app called acmefront to work with the Lit JavaScript framework and Vite. I’ll also show you a simple, framework-agnostic hot-reload workflow that makes development a breeze. Just a heads-up: all the names and paths I’m using here are just for illustration.
Step 1: Wiring Up the App, Template, URL, and View
First things first, let’s get the basic Django pieces in place. The app exposes a simple index view and a URL to go with it:
How I Use Local LLMs to Build Smarter Web Scrapers
This is a guide to how I use locally-run Large Language Models (LLMs) to build web scrapers that are way more reliable than the old-school, CSS selector-based ones. If you’ve ever built a web scraper, you know the pain of brittle CSS selectors. You spend forever getting them just right, and then the website changes its HTML, and your scraper is toast. That’s why I started playing around with running LLMs locally with LM Studio, and it’s been a game-changer.
I just finished building a complete Ruby on Rails app with CursorAI, and I wanted to share some tips that made the process so much faster. Here are a few things I learned along the way that will help you get the most out of Cursor.
1. Keep a Changelog with .cursorrules
It’s a good idea to have Cursor maintain a changelog for you. This helps you keep track of what’s been done and prevents the AI from getting stuck in a loop trying the same failed solutions over and over. If Cursor knows what you’ve already tried, it won’t waste time suggesting the same things again.
In Part 1 of our job-finding series, we found a job board that was easy to scrape and saved the data to a local file. Now, it’s time to take that data and put it to work. In this post, we’ll walk through how to load our scraped data into a database and run some basic analysis on it.
Setting Up the Database
First things first, we need a place to store our data. We’ll use SQLite to create a database with a jobs table that has the following columns:
title: The job title
location: Where the job is located
date: The date the job was posted
link: A link to the job post
description: The full job description
hasapplied: A flag to track whether we’ve applied for the job
import sqlite3
import os
# Database file pathdb_file ='jobs.db'# SQL to create the jobs tablecreate_jobs_table_sql ='''
CREATE TABLE IF NOT EXISTS jobs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
companyname TEXT NOT NULL,
location TEXT,
date TEXT,
link TEXT,
description TEXT,
hasapplied INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create an index on companyname for faster lookups
CREATE INDEX IF NOT EXISTS idx_companyname ON jobs(companyname);
-- Create an index on hasapplied for faster filtering
CREATE INDEX IF NOT EXISTS idx_hasapplied ON jobs(hasapplied);
'''defcreate_database():
# Check if database file already exists db_exists = os.path.exists(db_file)
# Connect to the database (this will create it if it doesn't exist) conn = sqlite3.connect(db_file)
cursor = conn.cursor()
# Create the jobs table cursor.executescript(create_jobs_table_sql)
# Commit the changes and close the connection conn.commit()
conn.close()
if db_exists:
print(f"Connected to existing database: {db_file}")
else:
print(f"Created new database: {db_file}")
print("Jobs table initialized successfully.")
if __name__ =="__main__":
create_database()
Finding a job can be a real grind. In this post, I’m going to show you how to automate a big chunk of that work using Python and Selenium. We’ll dive into how to find job boards that are easy to scrape, save that data, and then analyze it to pinpoint the jobs you’re most qualified for.
We’ll even explore how to use free AI tools like Ollama and LM Studio to filter jobs based on your skillset and extract keywords to make searching easier. And to top it all off, we’ll build a neat little web app with React and Flask to browse all the jobs we’ve scraped.
The Tools of the Trade
Python
I’m a big fan of Python for this kind of stuff. It’s simple, it’s effective, and it gets the job done. If you’re new to Python, you can learn how to get it set up here: Installing Python.
Selenium
While Python has some built-in tools for grabbing content from web pages, a lot of job boards use JavaScript to render their content. That’s where Selenium comes in. It lets us spin up a real browser session and control it with our code, so we can get to all that juicy, dynamically-rendered content.
SQLite
We’re going to be dealing with a lot of data, so Excel just isn’t going to cut it. I’ve got a single database table with about a week’s worth of job posts that’s already over 100MB. SQLite is perfect for this. It’s lightweight, and it’ll let us run the advanced queries we’ll need to analyze and sort through all the jobs we find.