CameronFoxly/Ascii-Motion

A modern web application for creating and animating ASCII art

TypeScript

927

1,112 commits

updated Oct 17, 2026

See the code

README

ASCII Motion

ASCII Motion License - Dual

A web app for creating and animating ASCII/ANSI art.

Current deployed version: https://ascii-motion.app

See what people are making in the community gallery: https://ascii-motion.app/community

Learn more on the landing page: https://ascii-motion.com

Check the usage documentation at: https://docs.ascii-motion.com

Screenshot 2026-02-17 at 4 26 14β€―PM

🎨 Current Features

  • Grid-based ASCII Art Editor with full drawing toolset (pencil, eraser, fill, rectangle, ellipse, bezier pen, text, gradient, and more)
  • Convert images or video assets to ASCII art with fine-tuned rendering control and frame rate matching
  • Custom Color and Character Palettes including presets and import/export
  • Apply effects and filters to existing animations
  • Generate animations using procedural animation tools
  • Layer-Based Timeline with keyframe interpolation for position, scale, rotation, and anchor point
  • Multi-Layer Compositing with z-order, visibility, solo, lock, and layer groups
  • Keyframe Animation with cubic bezier easing editor and presets
  • Export Formats: Images (PNG, JPEG, SVG), Videos (MP4, WebM), React Components, CLI Components (Ink, OpenTUI, BubbleTea), Text, HTML, and session files
  • Publish to community gallery and explore what people are making
  • MCP Server (ascii-motion-mcp) for AI-assisted animation creation

πŸš€ Quick Start

Prerequisites

  • Node.js 18+
  • npm or yarn

Installation

git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install

Development

npm run dev

Build

npm run build

πŸš€ Deployment

This monorepo contains three separate deployable apps, each with its own Vercel project:

AppDomainDeploy FromCommand
Main Appascii-motion.appRootnpm run deploy
Marketingascii-motion.compackages/web/marketingnpx vercel --prod
Docsdocs.ascii-motion.compackages/web/docs-sitenpx vercel --prod

Main App Deployment (Root)

The main ASCII art editor deploys with automated versioning:

Available Deployment Commands
CommandVersion IncrementUse Case
npm run deployPatch (2.0.0 β†’ 2.0.1)Bug fixes, small updates
npm run deploy:majorMinor (2.0.1 β†’ 2.1.0)New features, significant improvements
npm run deploy:previewNoneTesting deployments, preview branches

Manual Version Commands

For version management without deployment:

# Increment patch version (2.0.0 β†’ 2.0.1)
npm run version:patch

# Increment minor version (2.0.1 β†’ 2.1.0) 
npm run version:minor

# Increment major version (2.1.0 β†’ 3.0.0)
npm run version:major

Marketing & Docs Site Deployment

These deploy separately from the main app using the Vercel CLI:

# Marketing site (ascii-motion.com)
cd packages/web/marketing
npx vercel --prod

# Docs site (docs.ascii-motion.com)
cd packages/web/docs-site
npx vercel --prod

See the README in each package for detailed deployment instructions.

πŸ—οΈ Tech Stack

  • React 19 - UI framework
  • TypeScript - Type safety (strict mode)
  • Vite - Build tool and dev server
  • Tailwind CSS v3 - Styling
  • Shadcn/ui - UI components
  • Zustand - State management
  • Lucide React - Icons
  • Vitest - Testing framework

πŸ“¦ Project Structure

This is a monorepo with dual licensing and separate deployment targets:

  • packages/core/ - Open source core features (MIT License)

    • Canvas editor, drawing tools, animation system
    • Export features (PNG, SVG, GIF, MP4, etc.)
    • All UI components and utilities
  • packages/premium/ - Premium features (Proprietary License)

    • User authentication (email-based)
    • Cloud project storage (Supabase)
    • Payment integration (future)
  • packages/web/marketing/ - Marketing site (Proprietary License)

    • Deploys to ascii-motion.com
    • Next.js 16 + React 19
    • Has its own package.json and Vercel project
  • packages/web/docs-site/ - Documentation site (Proprietary License)

    • Deploys to docs.ascii-motion.com
    • Next.js 15 + MDX
    • Has its own package.json and Vercel project

See docs/MONOREPO_SETUP_GUIDE.md for details.

πŸ›οΈ Core App Architecture

src/
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ common/         # Shared/reusable components
β”‚   β”œβ”€β”€ features/       # Complex functional components (canvas, import/export)
β”‚   β”‚   └── timeline/   # Layer list, track area, keyframe editor, ruler
β”‚   β”œβ”€β”€ tools/          # Tool-specific components
β”‚   └── ui/             # Shadcn UI components
β”œβ”€β”€ stores/
β”‚   β”œβ”€β”€ timelineStore.ts   # PRIMARY: layers, content frames, keyframes, groups
β”‚   β”œβ”€β”€ canvasStore.ts     # Working canvas buffer for active layer
β”‚   β”œβ”€β”€ animationStore.ts  # Legacy compatibility adapter
β”‚   └── toolStore.ts       # Tools, settings, undo/redo history
β”œβ”€β”€ types/
β”‚   β”œβ”€β”€ timeline.ts        # Layer, ContentFrame, Keyframe, PropertyTrack types
β”‚   └── easing.ts          # Cubic bezier interpolation engine
β”œβ”€β”€ hooks/              # Custom React hooks
β”œβ”€β”€ utils/
β”‚   β”œβ”€β”€ layerCompositing.ts    # Multi-layer compositing with transforms
β”‚   β”œβ”€β”€ layerTransformUtils.ts # Screen↔local coordinate conversion
β”‚   └── sessionMigration.ts    # v1β†’v2 format migration
β”œβ”€β”€ constants/          # App configuration
└── pages/              # Page components

πŸ“‹ Development Status

This is currently maintained entirely by me, an animator and brand designer with next to no experience with building tools. This has been vibe-coded into existence using GitHub Copilot in VScode, using mostly Claude Opus 4.6, with the occasional GPT-5.2-Codex when Claude gets stumped. Please forgive any messy or unusal structure or vibe-code artifacts, I'm trying my best!

Upcoming features planned

  • Refactor of effects system to integrate with v2 timeline, so that effects are procedural and can be keyframed across time.
  • Update the ellipse and rectangle tool to use the bezier pen tool's vector system
  • Add a "find edges" algorithm to media import using ASCII line characters
  • Update bezier tool and media import conversion functions to get more accurate shape edges
  • Add a post processing shader effect layer for things like CRT Effects, Chromatic abberation, bloom, etc.

Got an idea for a new feature? Open an issue!

πŸ“– Documentation

🀝 Contributing

We welcome contributions to the open-source core (packages/core/)!

For Open Source Contributors

What you can contribute:

  • βœ… New drawing tools and brushes
  • βœ… Animation features and effects
  • βœ… Export formats and converters
  • βœ… UI/UX improvements
  • βœ… Bug fixes and performance optimizations
  • βœ… Documentation and examples

What is proprietary:

  • ❌ Authentication system (packages/premium/)
  • ❌ Cloud storage features
  • ❌ Payment integration

Monorepo Setup for Contributors

Important: This project uses a monorepo structure with a private Git submodule for premium features.

Project Structure

Ascii-Motion/               # Main repository (public)
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ core/              # Open source (MIT) - You work here!
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ stores/
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── utils/
β”‚   β”‚   └── package.json
β”‚   └── premium/           # Private submodule (Proprietary)
β”‚       └── (not accessible to contributors)
β”œβ”€β”€ src/                   # Legacy code (being migrated to core)
└── package.json           # Root workspace config

Getting Started

  1. Clone the repository:

    git clone https://github.com/cameronfoxly/Ascii-Motion.git
    cd Ascii-Motion
    npm install
    
  2. The packages/premium/ folder will be empty - This is expected! You don't need it to contribute. The app runs without premium features.

  3. Development:

    npm run dev          # Start dev server
    npm run test:run     # Run tests (343 tests)
    npm run lint         # Check code quality
    npm run build        # Production build
    
  4. All source code lives in src/ β€” not in packages/core/ (which is a shared UI component library). Your contributions go directly in src/.

  5. Key files to know:

    • src/stores/timelineStore.ts β€” Primary state (layers, keyframes, timeline)
    • src/hooks/useKeyboardShortcuts.ts β€” All keyboard shortcuts and undo/redo
    • src/components/features/ToolPalette.tsx β€” Tool UI and options
    • src/utils/exportRenderer.ts β€” All export format rendering
    • src/types/timeline.ts β€” Core type definitions

Import Paths

When writing code in src/, use these import patterns:

// Stores
import { useTimelineStore } from '../stores/timelineStore';
import { useCanvasStore } from '../stores/canvasStore';
import { useToolStore } from '../stores/toolStore';

// Utils
import { screenToLocal } from '../utils/layerTransformUtils';
import { compositeLayersAtFrame } from '../utils/layerCompositing';

// Types
import type { Layer, ContentFrame, KeyframeId } from '../types/timeline';

// UI Components
import { Button } from '../components/ui/button';

What Happens to Premium Code?

  • The main app (src/ folder) imports from both core and premium
  • When you run npm run dev from the root, both packages are built
  • If packages/premium/ is missing, the app will still work but without auth/cloud features
  • Your contributions to core are completely independent of premium features

Testing Your Changes

# Run the full test suite (343 tests)
npm run test:run

# Run tests in watch mode during development
npm test

# Lint check
npm run lint

# TypeScript type check
npx tsc --noEmit

# Production build verification
npm run build

Submitting Pull Requests

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-tool
  3. Make your changes in packages/core/
  4. Commit with clear messages: git commit -m "Add gradient brush tool"
  5. Push to your fork: git push origin feature/amazing-tool
  6. Open a Pull Request to the main branch

PR Checklist:

  • Changes don't modify premium code (packages/premium/)
  • Code follows existing patterns and TypeScript strict mode
  • Tests pass (npm run test:run)
  • No linting errors (npm run lint)
  • Build succeeds (npm run build)
  • New features include tests where applicable
  • PR description explains what and why

See CONTRIBUTING.md for detailed guidelines.

πŸ“œ License

Dual License:

  • Core Features (packages/core/) - MIT License

    • Free to use, modify, and distribute
    • No restrictions on commercial use
  • Premium Features (packages/premium/) - Proprietary License

    • Authentication and cloud storage
    • Unauthorized copying or distribution prohibited

See individual LICENSE files for full details.


Made with ❀️ for the ASCII art community

CameronFoxly/Ascii-Motion

A modern web application for creating and animating ASCII art

TypeScript

927

1,112 commits

updated Oct 17, 2026

See the code

README

ASCII Motion

ASCII Motion License - Dual

A web app for creating and animating ASCII/ANSI art.

Current deployed version: https://ascii-motion.app

See what people are making in the community gallery: https://ascii-motion.app/community

Learn more on the landing page: https://ascii-motion.com

Check the usage documentation at: https://docs.ascii-motion.com

Screenshot 2026-02-17 at 4 26 14β€―PM

🎨 Current Features

  • Grid-based ASCII Art Editor with full drawing toolset (pencil, eraser, fill, rectangle, ellipse, bezier pen, text, gradient, and more)
  • Convert images or video assets to ASCII art with fine-tuned rendering control and frame rate matching
  • Custom Color and Character Palettes including presets and import/export
  • Apply effects and filters to existing animations
  • Generate animations using procedural animation tools
  • Layer-Based Timeline with keyframe interpolation for position, scale, rotation, and anchor point
  • Multi-Layer Compositing with z-order, visibility, solo, lock, and layer groups
  • Keyframe Animation with cubic bezier easing editor and presets
  • Export Formats: Images (PNG, JPEG, SVG), Videos (MP4, WebM), React Components, CLI Components (Ink, OpenTUI, BubbleTea), Text, HTML, and session files
  • Publish to community gallery and explore what people are making
  • MCP Server (ascii-motion-mcp) for AI-assisted animation creation

πŸš€ Quick Start

Prerequisites

  • Node.js 18+
  • npm or yarn

Installation

git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install

Development

npm run dev

Build

npm run build

πŸš€ Deployment

This monorepo contains three separate deployable apps, each with its own Vercel project:

AppDomainDeploy FromCommand
Main Appascii-motion.appRootnpm run deploy
Marketingascii-motion.compackages/web/marketingnpx vercel --prod
Docsdocs.ascii-motion.compackages/web/docs-sitenpx vercel --prod

Main App Deployment (Root)

The main ASCII art editor deploys with automated versioning:

Available Deployment Commands
CommandVersion IncrementUse Case
npm run deployPatch (2.0.0 β†’ 2.0.1)Bug fixes, small updates
npm run deploy:majorMinor (2.0.1 β†’ 2.1.0)New features, significant improvements
npm run deploy:previewNoneTesting deployments, preview branches

Manual Version Commands

For version management without deployment:

# Increment patch version (2.0.0 β†’ 2.0.1)
npm run version:patch

# Increment minor version (2.0.1 β†’ 2.1.0) 
npm run version:minor

# Increment major version (2.1.0 β†’ 3.0.0)
npm run version:major

Marketing & Docs Site Deployment

These deploy separately from the main app using the Vercel CLI:

# Marketing site (ascii-motion.com)
cd packages/web/marketing
npx vercel --prod

# Docs site (docs.ascii-motion.com)
cd packages/web/docs-site
npx vercel --prod

See the README in each package for detailed deployment instructions.

πŸ—οΈ Tech Stack

  • React 19 - UI framework
  • TypeScript - Type safety (strict mode)
  • Vite - Build tool and dev server
  • Tailwind CSS v3 - Styling
  • Shadcn/ui - UI components
  • Zustand - State management
  • Lucide React - Icons
  • Vitest - Testing framework

πŸ“¦ Project Structure

This is a monorepo with dual licensing and separate deployment targets:

  • packages/core/ - Open source core features (MIT License)

    • Canvas editor, drawing tools, animation system
    • Export features (PNG, SVG, GIF, MP4, etc.)
    • All UI components and utilities
  • packages/premium/ - Premium features (Proprietary License)

    • User authentication (email-based)
    • Cloud project storage (Supabase)
    • Payment integration (future)
  • packages/web/marketing/ - Marketing site (Proprietary License)

    • Deploys to ascii-motion.com
    • Next.js 16 + React 19
    • Has its own package.json and Vercel project
  • packages/web/docs-site/ - Documentation site (Proprietary License)

    • Deploys to docs.ascii-motion.com
    • Next.js 15 + MDX
    • Has its own package.json and Vercel project

See docs/MONOREPO_SETUP_GUIDE.md for details.

πŸ›οΈ Core App Architecture

src/
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ common/         # Shared/reusable components
β”‚   β”œβ”€β”€ features/       # Complex functional components (canvas, import/export)
β”‚   β”‚   └── timeline/   # Layer list, track area, keyframe editor, ruler
β”‚   β”œβ”€β”€ tools/          # Tool-specific components
β”‚   └── ui/             # Shadcn UI components
β”œβ”€β”€ stores/
β”‚   β”œβ”€β”€ timelineStore.ts   # PRIMARY: layers, content frames, keyframes, groups
β”‚   β”œβ”€β”€ canvasStore.ts     # Working canvas buffer for active layer
β”‚   β”œβ”€β”€ animationStore.ts  # Legacy compatibility adapter
β”‚   └── toolStore.ts       # Tools, settings, undo/redo history
β”œβ”€β”€ types/
β”‚   β”œβ”€β”€ timeline.ts        # Layer, ContentFrame, Keyframe, PropertyTrack types
β”‚   └── easing.ts          # Cubic bezier interpolation engine
β”œβ”€β”€ hooks/              # Custom React hooks
β”œβ”€β”€ utils/
β”‚   β”œβ”€β”€ layerCompositing.ts    # Multi-layer compositing with transforms
β”‚   β”œβ”€β”€ layerTransformUtils.ts # Screen↔local coordinate conversion
β”‚   └── sessionMigration.ts    # v1β†’v2 format migration
β”œβ”€β”€ constants/          # App configuration
└── pages/              # Page components

πŸ“‹ Development Status

This is currently maintained entirely by me, an animator and brand designer with next to no experience with building tools. This has been vibe-coded into existence using GitHub Copilot in VScode, using mostly Claude Opus 4.6, with the occasional GPT-5.2-Codex when Claude gets stumped. Please forgive any messy or unusal structure or vibe-code artifacts, I'm trying my best!

Upcoming features planned

  • Refactor of effects system to integrate with v2 timeline, so that effects are procedural and can be keyframed across time.
  • Update the ellipse and rectangle tool to use the bezier pen tool's vector system
  • Add a "find edges" algorithm to media import using ASCII line characters
  • Update bezier tool and media import conversion functions to get more accurate shape edges
  • Add a post processing shader effect layer for things like CRT Effects, Chromatic abberation, bloom, etc.

Got an idea for a new feature? Open an issue!

πŸ“– Documentation

🀝 Contributing

We welcome contributions to the open-source core (packages/core/)!

For Open Source Contributors

What you can contribute:

  • βœ… New drawing tools and brushes
  • βœ… Animation features and effects
  • βœ… Export formats and converters
  • βœ… UI/UX improvements
  • βœ… Bug fixes and performance optimizations
  • βœ… Documentation and examples

What is proprietary:

  • ❌ Authentication system (packages/premium/)
  • ❌ Cloud storage features
  • ❌ Payment integration

Monorepo Setup for Contributors

Important: This project uses a monorepo structure with a private Git submodule for premium features.

Project Structure

Ascii-Motion/               # Main repository (public)
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ core/              # Open source (MIT) - You work here!
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ stores/
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── utils/
β”‚   β”‚   └── package.json
β”‚   └── premium/           # Private submodule (Proprietary)
β”‚       └── (not accessible to contributors)
β”œβ”€β”€ src/                   # Legacy code (being migrated to core)
└── package.json           # Root workspace config

Getting Started

  1. Clone the repository:

    git clone https://github.com/cameronfoxly/Ascii-Motion.git
    cd Ascii-Motion
    npm install
    
  2. The packages/premium/ folder will be empty - This is expected! You don't need it to contribute. The app runs without premium features.

  3. Development:

    npm run dev          # Start dev server
    npm run test:run     # Run tests (343 tests)
    npm run lint         # Check code quality
    npm run build        # Production build
    
  4. All source code lives in src/ β€” not in packages/core/ (which is a shared UI component library). Your contributions go directly in src/.

  5. Key files to know:

    • src/stores/timelineStore.ts β€” Primary state (layers, keyframes, timeline)
    • src/hooks/useKeyboardShortcuts.ts β€” All keyboard shortcuts and undo/redo
    • src/components/features/ToolPalette.tsx β€” Tool UI and options
    • src/utils/exportRenderer.ts β€” All export format rendering
    • src/types/timeline.ts β€” Core type definitions

Import Paths

When writing code in src/, use these import patterns:

// Stores
import { useTimelineStore } from '../stores/timelineStore';
import { useCanvasStore } from '../stores/canvasStore';
import { useToolStore } from '../stores/toolStore';

// Utils
import { screenToLocal } from '../utils/layerTransformUtils';
import { compositeLayersAtFrame } from '../utils/layerCompositing';

// Types
import type { Layer, ContentFrame, KeyframeId } from '../types/timeline';

// UI Components
import { Button } from '../components/ui/button';

What Happens to Premium Code?

  • The main app (src/ folder) imports from both core and premium
  • When you run npm run dev from the root, both packages are built
  • If packages/premium/ is missing, the app will still work but without auth/cloud features
  • Your contributions to core are completely independent of premium features

Testing Your Changes

# Run the full test suite (343 tests)
npm run test:run

# Run tests in watch mode during development
npm test

# Lint check
npm run lint

# TypeScript type check
npx tsc --noEmit

# Production build verification
npm run build

Submitting Pull Requests

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-tool
  3. Make your changes in packages/core/
  4. Commit with clear messages: git commit -m "Add gradient brush tool"
  5. Push to your fork: git push origin feature/amazing-tool
  6. Open a Pull Request to the main branch

PR Checklist:

  • Changes don't modify premium code (packages/premium/)
  • Code follows existing patterns and TypeScript strict mode
  • Tests pass (npm run test:run)
  • No linting errors (npm run lint)
  • Build succeeds (npm run build)
  • New features include tests where applicable
  • PR description explains what and why

See CONTRIBUTING.md for detailed guidelines.

πŸ“œ License

Dual License:

  • Core Features (packages/core/) - MIT License

    • Free to use, modify, and distribute
    • No restrictions on commercial use
  • Premium Features (packages/premium/) - Proprietary License

    • Authentication and cloud storage
    • Unauthorized copying or distribution prohibited

See individual LICENSE files for full details.


Made with ❀️ for the ASCII art community

Significant stargazers

(top 24 of 29)

Konv Suu

85 followers Β· starred Dec 2025

Jintao Zhang

1,305 followers Β· starred Sep 2025

Patrick Arminio

1,008 followers Β· starred Sep 2025

Wu Tingfeng

129 followers Β· starred Sep 2025