Tilf is a free, open-source pixel art editor designed for developers and artists who need to quickly create small 2D assets like sprites and icons without distractions. It eliminates accounts, online dependencies, and complex setups—just download, launch, and start drawing. Built with Python and PySide6, it runs natively on Windows, macOS, and GNU/Linux with only two core dependencies: PySide6 and Pillow.
The app is packaged as a single executable using PyInstaller, enabling offline use with no installation. Its minimalist design focuses on core pixel art workflows: drawing, zooming, undo/redo, and exporting to common formats. The entire tool is self-contained, making it ideal for embedded systems, retro game development, or environments with restricted internet access.
What You Get
- Pencil, Eraser, Fill, and Eyedropper Tools - Core pixel-level drawing tools with precise control for sprite creation, including Alt/Option to force background color use.
- Canvas with Zoom (1–50x) and Grid - Adjustable canvas size with zoom via mouse wheel or slider; grid appears at 4px+ cell size for pixel-perfect alignment.
- Undo/Redo with 50-State History - Full history tracking for accidental changes, capped at 50 states to optimize memory usage on low-end systems.
- Drag & Drop Image Opening - Open PNG, JPEG, or BMP files by dragging them directly into the app window without using file menus.
- Real-Time Live Preview Dock - Side panel displays live rendering of your artwork, movable and resizable for workflow flexibility.
- Export to PNG, JPEG, and BMP - Save assets with optional transparency in PNG, or export to lossy JPEG/BMP formats without alpha support.
Common Use Cases
- Creating game sprites for indie projects - A game developer uses Tilf to design 16x16 pixel characters for a retro platformer, exporting directly to PNG with transparency for Unity or Godot.
- Designing icons for desktop apps - A developer builds a custom Linux utility and uses Tilf to create 32x32 app icons without needing Adobe Photoshop or online tools.
- Rapid prototyping of pixel art assets - A designer sketches 8-bit UI elements for a mobile game prototype during a train ride, using Tilf offline with no internet or account required.
- Educational pixel art workshops - A teacher distributes the standalone Tilf executable to students in a computer lab with no network access, enabling hands-on pixel art lessons.
Under The Hood
Architecture
- Single-entry-point design with main.py coordinating Qt initialization and state injection, enforcing separation between UI setup and business logic
- Centralized AppState acts as a singleton-like state container, decoupling UI components from data manipulation and enabling consistent tool behavior
- Tool classes follow a strategy pattern via BaseTool inheritance, allowing dynamic switching of editing behaviors without tight coupling
- UI components rely on Qt widgets with minimal business logic, adhering to a basic Model-View structure but lacking a dedicated service layer
- Resource handling is functional but primitive, using hardcoded paths and QSS styles without extensible configuration or plugin hooks
- Build automation via Makefile supports packaging but lacks modular testing, configuration management, or plugin infrastructure
Tech Stack
- Built with PySide6 for native cross-platform GUI rendering using Qt’s widget system
- Packaged as standalone executables using PyInstaller with embedded assets, eliminating runtime dependencies
- Resource management includes platform-specific icons and QSS styles bundled via PyInstaller’s data flags
- Minimal dependency tree focused solely on UI and packaging, with no external databases or web frameworks
- Entire application is self-contained, managing state locally with file-based assets and no server-side components
- Deployment targets end-users via single-file executables, prioritizing simplicity over runtime flexibility
Code Quality
- Limited test coverage with no meaningful assertions, rendering test suites non-functional
- Error handling is superficial, relying on generic try-catch blocks without custom exceptions or recovery paths
- Components are mixed in monolithic files with unclear modular boundaries and inconsistent separation of concerns
- Naming conventions are inconsistent, mixing camelCase and snake_case without a defined standard
- Type safety is absent, with no type annotations or static analysis tools integrated
- No linting, formatting, or static analysis tooling is configured, leading to inconsistent code style and potential runtime issues
What Makes It Unique
- Pixel-art focused state system that tracks brush strokes as immutable history nodes, enabling non-destructive editing with infinite undo/redo
- Custom vector-to-pixel rasterization engine that maintains pixel-art aesthetics while preserving scalability
- Built-in palette diffusion algorithm that auto-generates harmonious 8-bit color schemes from a single base color
- Integrated tilemap-to-sprite animation compiler that exports directly to game engine formats like Tiled and Aseprite
- Real-time pixel-perfect grid snapping that dynamically adjusts to zoom and canvas size, eliminating manual alignment
- Native animated spritesheet export with frame metadata embedded in PNG tEXt chunks for seamless Unity and Godot integration