A modern web application for creating and animating ASCII art
See the code
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
git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install
npm run dev
npm run build
This monorepo contains three separate deployable apps, each with its own Vercel project:
| App | Domain | Deploy From | Command |
|---|---|---|---|
| Main App | ascii-motion.app | Root | npm run deploy |
| Marketing | ascii-motion.com | packages/web/marketing | npx vercel --prod |
| Docs | docs.ascii-motion.com | packages/web/docs-site | npx vercel --prod |
The main ASCII art editor deploys with automated versioning:
| Command | Version Increment | Use Case |
|---|---|---|
npm run deploy | Patch (2.0.0 β 2.0.1) | Bug fixes, small updates |
npm run deploy:major | Minor (2.0.1 β 2.1.0) | New features, significant improvements |
npm run deploy:preview | None | Testing deployments, preview branches |
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
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.
This is a monorepo with dual licensing and separate deployment targets:
packages/core/ - Open source core features (MIT License)
packages/premium/ - Premium features (Proprietary License)
packages/web/marketing/ - Marketing site (Proprietary License)
ascii-motion.compackage.json and Vercel projectpackages/web/docs-site/ - Documentation site (Proprietary License)
docs.ascii-motion.compackage.json and Vercel projectSee docs/MONOREPO_SETUP_GUIDE.md for details.
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
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!
Got an idea for a new feature? Open an issue!
We welcome contributions to the open-source core (packages/core/)!
What you can contribute:
What is proprietary:
packages/premium/)Important: This project uses a monorepo structure with a private Git submodule for premium features.
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
Clone the repository:
git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install
The packages/premium/ folder will be empty - This is expected! You don't need it to contribute. The app runs without premium features.
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
All source code lives in src/ β not in packages/core/ (which is a shared UI component library). Your contributions go directly in src/.
Key files to know:
src/stores/timelineStore.ts β Primary state (layers, keyframes, timeline)src/hooks/useKeyboardShortcuts.ts β All keyboard shortcuts and undo/redosrc/components/features/ToolPalette.tsx β Tool UI and optionssrc/utils/exportRenderer.ts β All export format renderingsrc/types/timeline.ts β Core type definitionsWhen 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';
src/ folder) imports from both core and premiumnpm run dev from the root, both packages are builtpackages/premium/ is missing, the app will still work but without auth/cloud featurescore are completely independent of premium features# 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
git checkout -b feature/amazing-toolpackages/core/git commit -m "Add gradient brush tool"git push origin feature/amazing-toolmain branchPR Checklist:
packages/premium/)npm run test:run)npm run lint)npm run build)See CONTRIBUTING.md for detailed guidelines.
Dual License:
Core Features (packages/core/) - MIT License
Premium Features (packages/premium/) - Proprietary License
See individual LICENSE files for full details.
Made with β€οΈ for the ASCII art community
(top 24 of 29)
85 followers Β· starred Dec 2025
1,305 followers Β· starred Sep 2025
1,008 followers Β· starred Sep 2025
129 followers Β· starred Sep 2025
A modern web application for creating and animating ASCII art
See the code
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
git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install
npm run dev
npm run build
This monorepo contains three separate deployable apps, each with its own Vercel project:
| App | Domain | Deploy From | Command |
|---|---|---|---|
| Main App | ascii-motion.app | Root | npm run deploy |
| Marketing | ascii-motion.com | packages/web/marketing | npx vercel --prod |
| Docs | docs.ascii-motion.com | packages/web/docs-site | npx vercel --prod |
The main ASCII art editor deploys with automated versioning:
| Command | Version Increment | Use Case |
|---|---|---|
npm run deploy | Patch (2.0.0 β 2.0.1) | Bug fixes, small updates |
npm run deploy:major | Minor (2.0.1 β 2.1.0) | New features, significant improvements |
npm run deploy:preview | None | Testing deployments, preview branches |
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
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.
This is a monorepo with dual licensing and separate deployment targets:
packages/core/ - Open source core features (MIT License)
packages/premium/ - Premium features (Proprietary License)
packages/web/marketing/ - Marketing site (Proprietary License)
ascii-motion.compackage.json and Vercel projectpackages/web/docs-site/ - Documentation site (Proprietary License)
docs.ascii-motion.compackage.json and Vercel projectSee docs/MONOREPO_SETUP_GUIDE.md for details.
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
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!
Got an idea for a new feature? Open an issue!
We welcome contributions to the open-source core (packages/core/)!
What you can contribute:
What is proprietary:
packages/premium/)Important: This project uses a monorepo structure with a private Git submodule for premium features.
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
Clone the repository:
git clone https://github.com/cameronfoxly/Ascii-Motion.git
cd Ascii-Motion
npm install
The packages/premium/ folder will be empty - This is expected! You don't need it to contribute. The app runs without premium features.
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
All source code lives in src/ β not in packages/core/ (which is a shared UI component library). Your contributions go directly in src/.
Key files to know:
src/stores/timelineStore.ts β Primary state (layers, keyframes, timeline)src/hooks/useKeyboardShortcuts.ts β All keyboard shortcuts and undo/redosrc/components/features/ToolPalette.tsx β Tool UI and optionssrc/utils/exportRenderer.ts β All export format renderingsrc/types/timeline.ts β Core type definitionsWhen 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';
src/ folder) imports from both core and premiumnpm run dev from the root, both packages are builtpackages/premium/ is missing, the app will still work but without auth/cloud featurescore are completely independent of premium features# 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
git checkout -b feature/amazing-toolpackages/core/git commit -m "Add gradient brush tool"git push origin feature/amazing-toolmain branchPR Checklist:
packages/premium/)npm run test:run)npm run lint)npm run build)See CONTRIBUTING.md for detailed guidelines.
Dual License:
Core Features (packages/core/) - MIT License
Premium Features (packages/premium/) - Proprietary License
See individual LICENSE files for full details.
Made with β€οΈ for the ASCII art community
(top 24 of 29)
85 followers Β· starred Dec 2025
1,305 followers Β· starred Sep 2025
1,008 followers Β· starred Sep 2025
129 followers Β· starred Sep 2025