ASCII City: An Open-Source Project Building Dynamic City Simulations with Keyboard Characters

ASCII City builds dynamic city simulations using only keyboard characters, blending minimalism with engineering.
ASCII City is an open-source project that simulates a living city entirely with ASCII characters. Its latest update introduces a traffic system with pathfinding and collision logic, plus enhanced visual detail through creative character palette usage. The project showcases core concepts like rendering pipelines, entity scheduling, and double buffering, offering a minimalist yet powerful lens into simulation system design and retro computing aesthetics.
When a City Awakens Between Characters
In an era where graphics rendering technology strives for ever-greater realism, a seemingly "back-to-basics" project has sparked considerable discussion in the tech community — ASCII City. This is a virtual city simulation built entirely with ASCII characters (the visible characters on your keyboard). The latest update focuses on two core improvements: Traffic and Detail.
ASCII (American Standard Code for Information Interchange) is a character encoding standard published in 1963 that defines 128 characters, 95 of which are printable. In the early days of computing, display devices could only output text characters, so developers invented techniques for combining characters to represent graphics — this is the origin of ASCII art. The core principle of terminal rendering involves manipulating a character buffer (typically an 80×24 or larger grid) and using ANSI escape sequences to control cursor position, character color, and styling. Modern terminal emulators support 256 colors or even 24-bit true color, and combined with the Unicode extended character set, terminal graphics are far more expressive than they were on early CRT terminals. Libraries like ncurses provide a cross-platform abstraction layer for terminal graphics programming, while GPU-accelerated modern terminals (such as Alacritty and Kitty) make high-frame-rate character animations possible.
Unlike modern game engines that pursue ray tracing and 4K textures, ASCII City takes a path that combines minimalism with hardcore engineering. It compresses the complexity of a city ecosystem — traffic flow, buildings, streets — into a 2D/pseudo-3D grid made of characters, producing a surprisingly vivid result with severely limited means of expression.
![hackernews source: ASCII City: Traffic and Detail Update [video]](/media/screenshots/source/22572_0.png)
ASCII City Traffic System Update: Making Characters Flow
The most eye-catching part of this update is the introduction of a traffic system. In a world composed of ASCII characters, a "vehicle" might be just a few combined symbols, and "movement" relies on refreshing character positions frame by frame to create the animation effect.
Technical Challenges of Dynamic Traffic Simulation
Implementing character-level traffic flow is far from simple. Developers need to address several key issues:
- Pathfinding: Vehicles need to move along predefined road grids, avoiding buildings and staying within boundaries. In city traffic simulation, pathfinding is typically based on graph theory algorithms. The road grid is modeled as a directed graph, with nodes representing intersections and edges representing road segments. Classic algorithms like A* or Dijkstra are used to calculate shortest paths, while more complex systems introduce flow-based weights to simulate driver route-choice behavior.
- Collision and Yielding: When multiple "character cars" meet at intersections, how do you simulate basic traffic rules and yielding logic?
- Rendering Frame Rate: ASCII rendering essentially involves continuously redrawing the entire character buffer. Maintaining smoothness while avoiding flickering is a classic challenge in terminal graphics.
The flickering problem in terminal graphics animation stems from the latency of character-by-character redrawing. When a program clears the screen and re-outputs all characters, the human eye catches a brief blank frame, producing a flicker. Solutions include double buffering — maintaining two character buffers in memory and only outputting the differences (dirty regions) between frames to the terminal, drastically reducing I/O volume. Another approach uses ANSI escape sequences to position the cursor directly at locations that need updating, rather than clearing and redrawing the entire screen. Additionally, modern terminals support Synchronized Output mode, which allows programs to mark a group of output operations as atomic — the terminal waits until all content is ready and renders everything at once, fundamentally eliminating tearing and flickering.
Judging from the project's demo videos, vehicles flow in an orderly fashion along streets, which implies a relatively complete entity scheduling mechanism behind the scenes — not just random character jumps. Entity Scheduling is a core component of simulation systems, responsible for managing the state update order of all active objects. In a project like ASCII City, each frame requires iterating through all vehicle entities, calculating their next position, detecting collisions, handling priorities (such as traffic light logic), and then committing everything to the render buffer. This is similar to the ECS (Entity Component System) architecture in modern game engines — ECS decomposes game objects into Entities, Components, and Systems, efficiently managing state updates for large numbers of entities through a data-driven approach — except that in ASCII City, the presentation layer is drastically simplified.
Detail Enhancement: Pursuing Visual Richness Within a Limited Character Set
The second update focuses on improving "Detail." The charm of ASCII art lies precisely in "dancing in chains" — using an extremely limited character set to express rich visual depth.
The Rendering Principle of Characters as Pixels
In ASCII rendering, different characters serve different roles for "brightness" and "texture." For example:
- Dense characters like
#,@, and%are used for dark or solid areas; - Sparse characters like
.,,, and`represent light-colored or open spaces; - Character combinations are used to outline building contours, windows, road markings, and other structures.
The detail update means developers have further enriched the use of this "character palette," giving the city's buildings and street textures greater recognizability and depth. This approach is essentially a retro yet elegant form of graphical compression art, reminiscent of the classics from the early computing era when game visuals were rendered entirely through character terminals.
Why Projects Like ASCII City Deserve Attention
Some might ask: in an age of abundant GPU power and unlimited real-time rendering capabilities, why build a city out of characters?
Value for Technical Learning
Projects like ASCII City are essentially a minimalist experiment in rendering pipelines, entity simulation, and performance optimization. When you compress visual expressiveness down to the character level, you can actually see the underlying logic of a city simulation system more clearly: scheduling, state updates, coordinate transformations, and frame loops. For developers learning game engine principles or simulation system design, this is an excellent teaching example.
The "constraints breed creativity" philosophy embodied by ASCII City has deep roots in computer science history. In the early demo scene culture, programmers created breathtaking 3D animations and music within 64KB or even 4KB space limits. Twitter's 140-character limit spawned the Code Golf and one-tweet game movements. In modern software engineering, this philosophy manifests as extreme optimization of computing resources — as seen in embedded systems development, WebAssembly performance tuning, and similar scenarios. Deliberately imposing constraints forces developers to deeply understand underlying principles, often producing more elegant solutions than unconstrained conditions would allow. This is why many senior engineers view such projects as an excellent path for technical growth.
Value in Aesthetics and Computer Culture
ASCII art is a unique lineage in computer culture. From early BBS systems to Roguelike games (such as NetHack and Dwarf Fortress), character-based visuals have always had a devoted following.
The Roguelike genre gets its name from the 1980 game Rogue, which used ASCII characters to depict dungeon exploration on Unix terminals. This tradition gave rise to profoundly influential works: NetHack (1987, still receiving updates to this day) uses letters and symbols to build an extraordinarily complex interaction system; Dwarf Fortress (2006) uses an ASCII interface to simulate a complete world encompassing geology, hydrology, and social structures, with a simulation depth that puts many AAA games to shame. After Dwarf Fortress launched its graphical version on Steam in 2022, the ASCII original still maintains an active player community. This aesthetic preference isn't purely nostalgic — character interfaces force players to invest more imagination, creating a uniquely immersive experience.
ASCII City sits squarely within this cultural lineage, continuing and expanding the tradition. It uses modern programming techniques to bring static character art to life, giving it a temporal dimension and vitality, pushing the static Roguelike-style map into the new territory of dynamic city simulation.
Conclusion
Although ASCII City is still in the early stages of community discussion, the technical curiosity and creative spirit it represents are highly noteworthy. It's a project that reminds us that "constraints breed creativity" — within the confines of mere characters, an entire bustling city can come to life.
For developers who enjoy terminal graphics, retro aesthetics, or simulation systems, ASCII City is undoubtedly worth following. As its traffic and detail systems continue to mature, there's every reason to expect it will evolve into an even more complex urban ecosystem in the future.
Related articles

Getting Started with Claude Code: Why It's the Most Powerful AI Coding Assistant
Deep dive into Claude Code's core advantages vs Cursor, Trae, and Copilot. Learn how its full-project context understanding and auto-debugging make it the top AI coding assistant.

OpenCode Tutorial: A Complete Guide from Installation and Configuration to Hands-On Practice
Complete guide to OpenCode AI coding tool: two installation methods, model configuration, Agent types, custom commands, MCP extensions, Agent SQL, with practical examples.

Getting Started with Claude Code: Complete Guide to Terminal AI Coding Tool Installation and Selection
Complete guide to Claude Code terminal AI coding tool: installation, setup, Terminal vs Device Agent comparison, and the practical Claude Code + DeepSeek combo.