Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 48 additions & 14 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -400,15 +400,23 @@ jobs:
rmdir appdir/usr/share/flare 2>/dev/null || true
fi

base_url="https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous"
# Each linuxdeploy tool lives in its OWN GitHub repo. Downloading the
# qt / appimage plugins from linuxdeploy/linuxdeploy returns 404, which
# is exactly why the AppImage was silently missing from nightly builds.
TOOLS_OK=1
for tool in linuxdeploy-x86_64.AppImage linuxdeploy-plugin-qt-x86_64.AppImage linuxdeploy-plugin-appimage-x86_64.AppImage; do
if ! (wget -q "${base_url}/${tool}" || wget -q "${base_url}/${tool}" || wget -q "${base_url}/${tool}"); then
echo "Warning: failed to download ${tool}; skipping AppImage"
TOOLS_OK=0; break
fi
chmod +x "${tool}"
done
download_tool() {
repo="$1"; file="$2"
url="https://github.com/${repo}/releases/download/continuous/${file}"
for attempt in 1 2 3; do
if wget -q "${url}" -O "${file}"; then chmod +x "${file}"; return 0; fi
sleep 3
done
echo "::warning::failed to download ${file} from ${repo}"
return 1
}
download_tool linuxdeploy/linuxdeploy linuxdeploy-x86_64.AppImage || TOOLS_OK=0
download_tool linuxdeploy/linuxdeploy-plugin-qt linuxdeploy-plugin-qt-x86_64.AppImage || TOOLS_OK=0
download_tool linuxdeploy/linuxdeploy-plugin-appimage linuxdeploy-plugin-appimage-x86_64.AppImage || TOOLS_OK=0

if [ -d appdir/usr/lib/flare ]; then
export LD_LIBRARY_PATH="appdir/usr/lib/flare:${LD_LIBRARY_PATH:-}"
Expand All @@ -422,10 +430,21 @@ jobs:
./linuxdeploy-x86_64.AppImage --appdir=appdir \
--desktop-file=appdir/io.github.Flare.desktop \
--icon-file=appdir/io.github.Flare.png \
--plugin=qt --output=appimage --custom-apprun=apprun.sh || true
--plugin=qt --output=appimage --custom-apprun=apprun.sh \
|| echo "::warning::linuxdeploy failed; AppImage will be absent for this build"
else
echo "::warning::linuxdeploy tools unavailable; skipping AppImage generation"
fi

if ls Flare*.AppImage >/dev/null 2>&1; then mv Flare*.AppImage artifact/Flare.AppImage; fi
# Expose the AppImage both inside the tarball AND as a standalone asset
if ls Flare*.AppImage >/dev/null 2>&1; then
APPIMAGE_FILE=$(ls Flare*.AppImage | head -n1)
cp "${APPIMAGE_FILE}" "${GITHUB_WORKSPACE}/Flare-x86_64.AppImage"
mv "${APPIMAGE_FILE}" artifact/Flare.AppImage
echo "AppImage created: ${APPIMAGE_FILE}"
else
echo "::warning::No AppImage was produced for this build (see download/linuxdeploy warnings above)"
fi
ARTIFACT_NAME=Flare-Linux-nightly
mv artifact ${ARTIFACT_NAME} || true
tar zcf ${ARTIFACT_NAME}.tar.gz ${ARTIFACT_NAME} || true
Expand Down Expand Up @@ -467,6 +486,13 @@ jobs:
path: flare/build/Flare-Linux-nightly.tar.gz
if-no-files-found: ignore

- name: Upload standalone AppImage
uses: actions/upload-artifact@v4
with:
name: Flare-Linux-AppImage
path: Flare-x86_64.AppImage
if-no-files-found: warn

- name: Upload smoke test log
if: always()
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -684,7 +710,7 @@ jobs:
)
fi

find dist -type f \( -name '*.tar.gz' -o -name '*.dmg' \) -exec cp -f {} release-assets/ \;
find dist -type f \( -name '*.tar.gz' -o -name '*.dmg' -o -name '*.AppImage' \) -exec cp -f {} release-assets/ \;
find release-assets -type f | sort

- name: Publish / update rolling nightly release
Expand All @@ -706,7 +732,7 @@ jobs:
| Platform | Package | Requirements |
|----------|---------|--------------|
| **Windows** | `Flare-Windows-Portable-nightly.zip` | Windows 10/11 **64-bit (x86_64/AMD64)** — ARM is not supported |
| **Linux** | `Flare-Linux-nightly.tar.gz` | x86_64 Linux, glibc 2.35+ (Ubuntu 22.04 or newer) |
| **Linux** | `Flare-x86_64.AppImage` (standalone) or `Flare-Linux-nightly.tar.gz` | x86_64 Linux, glibc 2.35+ (Ubuntu 22.04 or newer) |
| **macOS** | `Flare.dmg` | macOS 13+ Intel (Apple Silicon via Rosetta 2) |

## Windows usage
Expand All @@ -727,8 +753,16 @@ jobs:

## Linux usage

1. Extract: `tar xzf Flare-Linux-nightly.tar.gz`
2. Inside the `Flare-Linux-nightly/` folder run `./Flare.AppImage` (or the `Flare` binary if AppImage creation was skipped).
**Easiest:** download `Flare-x86_64.AppImage`, then:
```
chmod +x Flare-x86_64.AppImage
./Flare-x86_64.AppImage
```

**Or the tarball:** extract `tar xzf Flare-Linux-nightly.tar.gz`, then inside the
`Flare-Linux-nightly/` folder run `./Flare.AppImage` (or the `Flare` binary if
AppImage creation was skipped). If the standalone AppImage asset is absent, the
build's AppImage step failed — check the [CI run](https://github.com/Flare-Animate/Flare/actions/runs/${{ github.run_id }}) for `::warning::` lines.

See the [CI run](https://github.com/Flare-Animate/Flare/actions/runs/${{ github.run_id }}) for build logs and smoke test results.
files: |
Expand Down
27 changes: 16 additions & 11 deletions .github/workflows/workflow_linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -187,18 +187,23 @@ jobs:
rmdir appdir/usr/share/flare 2>/dev/null || true
fi

base_url="https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous"
# Each linuxdeploy tool lives in its OWN GitHub repo; the qt / appimage
# plugins are NOT in linuxdeploy/linuxdeploy (downloading them from there
# 404s and silently skips AppImage generation).
APPIMAGE_TOOLS_OK=1
for tool in linuxdeploy-x86_64.AppImage linuxdeploy-plugin-qt-x86_64.AppImage linuxdeploy-plugin-appimage-x86_64.AppImage; do
if ! (wget -q --show-progress "${base_url}/${tool}" || \
wget -q --show-progress "${base_url}/${tool}" || \
wget -q --show-progress "${base_url}/${tool}"); then
echo "Warning: failed to download ${tool}; skipping AppImage generation for this run."
APPIMAGE_TOOLS_OK=0
break
fi
chmod +x "${tool}"
done
download_tool() {
repo="$1"; file="$2"
url="https://github.com/${repo}/releases/download/continuous/${file}"
for attempt in 1 2 3; do
if wget -q "${url}" -O "${file}"; then chmod +x "${file}"; return 0; fi
sleep 3
done
echo "::warning::failed to download ${file} from ${repo}"
return 1
}
download_tool linuxdeploy/linuxdeploy linuxdeploy-x86_64.AppImage || APPIMAGE_TOOLS_OK=0
download_tool linuxdeploy/linuxdeploy-plugin-qt linuxdeploy-plugin-qt-x86_64.AppImage || APPIMAGE_TOOLS_OK=0
download_tool linuxdeploy/linuxdeploy-plugin-appimage linuxdeploy-plugin-appimage-x86_64.AppImage || APPIMAGE_TOOLS_OK=0

if [ -d appdir/usr/lib/flare ]; then
export LD_LIBRARY_PATH="appdir/usr/lib/flare:${LD_LIBRARY_PATH:-}"
Expand Down
165 changes: 105 additions & 60 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,115 @@

<img width="663" height="400" alt="FlareBanner" src="https://github.com/user-attachments/assets/73e4050f-f248-419e-8e61-fe8814ab984d" />

**Flare** is a free, open-source 2D animation studio — a community-driven fork of
[OpenToonz](https://opentoonz.github.io/) reworked to feel like **Adobe Animate**
and to open the Flash/Animate file formats Adobe left behind (`.fla`, `.xfl`,
`.swf`, and friends).

A fork of OpenToonz rebranded as Flare — focused on providing an Adobe Animate-like
user experience and improving interoperability with Flash assets (.swf/.fla).
The goal is simple: give the Flash/Animate community a modern, actively
maintained, cross-platform home that reads their existing projects — without a
subscription and without a dead runtime.

This repository is a fork of OpenToonz and retains the original licensing and
attribution. See the Licensing section below for details.
[![Discord](https://img.shields.io/discord/1500316971802296430?label=Discord&logo=discord&logoColor=white&color=5865F2)](https://discord.com/invite/JpeScW8Awa)
[![Website](https://img.shields.io/badge/website-flare--animate-orange)](https://flare-animate.github.io/website/)
[![License](https://img.shields.io/badge/license-BSD--3--Clause-blue)](./LICENSE.txt)

[![Discord Server](https://discord.com/api/guilds/1500316971802296430/widget.png?style=banner2)](https://discord.gg/JpeScW8Awa)
➡️ **Website:** https://flare-animate.github.io/website/ · **Discord:** https://discord.com/invite/JpeScW8Awa

[日本語](./doc/README_ja.md) · [简体中文](./doc/README_chs.md)

[日本語](./doc/README_ja.md) [简体中文](./doc/README_chs.md)
---

## What is Flare?
## Why Flare?

Flare is a community-driven fork of OpenToonz that ships a revamped UI layout
inspired by Adobe Animate and adds built-in Flash ecosystem import support for
FLA/XFL/SWC/SWF/FLV/F4V/AS workflows.
Adobe Animate is proprietary, subscription-only, and Flash is end-of-life — yet
huge amounts of animation, games, and educational content still live in `.fla`
and `.swf` files. OpenToonz is a powerful production tool but its UI is
unfamiliar to Flash/Animate artists. Flare bridges the two:

For the original Flare project and its history, see the Flare website:
https://flare-animate.github.io/website
- **Familiar UI** — the default workspace is laid out like Adobe Animate
(Drawing / Animation / Rigging / Compositing rooms), with an Adobe-style theme.
- **Open your old work** — built-in import for the Flash/Animate file family.
- **OpenToonz power underneath** — vector + raster levels, a full xsheet/timeline,
plastic/skeleton rigging, FX, and the OpenToonz rendering pipeline.

## Program Requirements
## Features

To enable SWF import features, install FFmpeg and ensure it is available on your PATH.
### Adobe Animate-style workspace (default)
Flare ships with the **Adobe Animate** workspace selected out of the box — no
configuration needed. Prefer the classic layout? Open **Preferences → Interface →
Rooms** and switch to **OpenToonz** (or **StudioGhibli**).

Flare uses CMake as its build system. You must have CMake (version 3.10 or later)
installed and available on your PATH before attempting to configure or build the
project. On Windows you can install CMake via the official installer or
[Chocolatey](https://chocolatey.org/). On macOS use Homebrew (`brew install cmake`),
and on Linux use your distribution's package manager (`apt`, `dnf`, etc.).
### Flash / Adobe Animate file support *(work in progress)*
Built-in, native C++ import — no Java, JPEXS, or external runtime required.

## Installation
| Format | Extension | Status |
|--------|-----------|--------|
| Flash project (ZIP) | `.fla` | Import (XFL extraction + parse) |
| XFL project | `.xfl` | Import (directory or ZIP) |
| Compiled Flash | `.swf` | Header + embedded bitmap extraction |
| Component library | `.swc` | Catalog + embedded bitmaps |
| Flash Video | `.flv` / `.f4v` | Raster level via FFmpeg |
| ActionScript | `.as` | Imported as reference text |

Please see the `doc/` folder for platform-specific build and installation
instructions.
> ⚠️ Flash import is actively being developed and **not yet production-ready** —
> complex documents will not round-trip cleanly. See [`doc/FLASH_SUPPORT.md`](./doc/FLASH_SUPPORT.md)
> for the architecture and current limitations, and please file bugs with a sample
> file. Tracking issues: [#16](https://github.com/Flare-Animate/Flare/issues/16),
> [#47](https://github.com/Flare-Animate/Flare/issues/47).

## How to Build Locally
### Inherited from OpenToonz / Tahoma2D
Flare keeps the OpenToonz feature set and continues to pull improvements from
OpenToonz and the [Tahoma2D](https://tahoma2d.org/) community fork:
vector & raster drawing, the xsheet and timeline, plastic & skeleton rigging,
the GTS scanning tools, the effects (FX) schematic, motion tracking, and the
script console.

⚠️ **IMPORTANT:** Building Flare is memory-intensive. On systems with limited RAM (< 8GB), limit parallel jobs to avoid system freezes. See platform-specific guides below for details.
### Merging with Next2Flash
The Flare-Animate org is consolidating its Flash tooling by merging
[Next2Flash](https://github.com/SSF2-Mods-Official/Next2Flash) — an MIT-licensed
SWF round-trip editor with a native AS3 decompiler — into Flare. The native SWF
reader/writer pieces are being ported, while AS3 round-tripping is bridged as an
optional helper. See [`doc/NEXT2FLASH_INTEGRATION.md`](./doc/NEXT2FLASH_INTEGRATION.md).

You can configure a build directory from the repository root with a command such as:
## Download

```sh
cmake -S flare/sources -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release
```
Pre-built nightly binaries for **Windows**, **Linux** (AppImage + tarball), and
**macOS** (DMG) are published automatically on every push to `master`:

➡️ **[Latest nightly release](https://github.com/Flare-Animate/Flare/releases/tag/nightly)**

| Platform | Asset | Requirements |
|----------|-------|--------------|
| Windows | `Flare-Windows-Portable-nightly.zip` | Windows 10/11, 64-bit |
| Linux | `Flare-x86_64.AppImage` | x86_64, glibc 2.35+ (Ubuntu 22.04+) |
| macOS | `Flare.dmg` | macOS 13+ Intel (Apple Silicon via Rosetta 2) |

These are pre-release builds and may be unstable.

## Program Requirements

To enable FFmpeg-based `.swf`/`.flv`/`.f4v` playback, install **FFmpeg** and make
sure it is on your `PATH`. The Flash *import* commands themselves need no external
tools.

and then build (limit parallel jobs on low-memory systems):
Building requires **CMake 3.10+** on your `PATH`. Install it via the official
installer or [Chocolatey](https://chocolatey.org/) on Windows, Homebrew
(`brew install cmake`) on macOS, or your package manager on Linux.

## How to Build Locally

> ⚠️ Building Flare is memory-intensive. On systems with < 8 GB RAM, limit
> parallel jobs to avoid freezes.

```sh
# For systems with < 4GB RAM, use: cmake --build build -j1
# For systems with 4-8GB RAM, use: cmake --build build -j2
# For systems with > 8GB RAM, use: cmake --build build --parallel
cmake -S flare/sources -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release

# < 4GB RAM: -j1 | 4-8GB RAM: -j2 | > 8GB RAM: --parallel
cmake --build build -j2
```

For more detailed, platform‑specific guidance follow the links below:
Platform-specific guides:

- [Windows](./doc/how_to_build_win.md)
- [macOS](./doc/how_to_build_macosx.md)
Expand All @@ -66,42 +119,34 @@ For more detailed, platform‑specific guidance follow the links below:

## Community & Contribution

This fork aims to stay compatible with OpenToonz where possible while
introducing new features. When contributing, please keep the original project's
- 💬 **Discord:** https://discord.com/invite/JpeScW8Awa — the fastest way to ask
questions, report bugs, and follow development.
- 🌐 **Website:** https://flare-animate.github.io/website/
- 🗳️ **Discussions:** [GitHub Discussions](https://github.com/orgs/Flare-Animate/discussions)
for proposals and ideas.
- 🐛 **Issues:** [GitHub Issues](https://github.com/Flare-Animate/Flare/issues).

Contributions are welcome — see [CONTRIBUTING.md](./CONTRIBUTING.md). Flare aims to
stay compatible with OpenToonz where possible; please keep the original project's
licensing and attribution in mind.

## Licensing

Files outside of the `thirdparty` and `stuff/library/mypaint brushes`
directories are based on the Modified BSD License.
- [modified BSD license](./LICENSE.txt).
Files outside `thirdparty/` and `stuff/library/mypaint brushes/` are under the
[Modified BSD License](./LICENSE.txt). Third-party components retain their
original licenses — see `thirdparty/` and
`stuff/library/mypaint brushes/Licenses.txt`.

Third-party components retain their original licenses. See the relevant
documentation in `thirdparty/` and `stuff/library/mypaint brushes/Licenses.txt`.

### Adobe Animate-style Workspace & Theme

Flare includes an "Adobe Animate" workspace and an Adobe-like color theme by
default. To switch to the Adobe Animate workspace, open the Room (Workspace)
menu and choose "Adobe Animate".

### Importing SWF files

Flare provides a built-in Flash import workflow for `.fla`, `.xfl`, `.swc`,
`.swf`, `.flv`, `.f4v`, and `.as`. Native metadata/asset extraction works
without external helper tools; when FFmpeg exposes direct readers for
`.swf`/`.flv`/`.f4v` on your system, Flare can also load those containers as
scene levels automatically.
Flare is a fork of [OpenToonz](https://github.com/opentoonz/opentoonz) (© DWANGO,
based on Toonz © Digital Video / Studio Ghibli) and retains its licensing and
attribution.

## Development helper scripts

To make it easier to follow build and test output you can run the included
`log_watcher.py` script. It watches `*.log` files underneath the build
directory and prints the last few lines whenever they are modified. This is
also the script that the autonomous chat mode will launch automatically:
`scripts/log_watcher.py` watches `*.log` files under the build directory and
prints the tail whenever they change (also wired to the "watch logs" task in
VS Code, `Ctrl+Shift+B`):

```sh
python scripts/log_watcher.py # defaults to flare/build
```

You can run the same command via the "watch logs" task in VS Code (`Ctrl+Shift+B`).
12 changes: 11 additions & 1 deletion doc/FLASH_SUPPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ video playback if it is installed).

| Format | Extension | Support |
|--------|-----------|---------|
| Flash project (ZIP) | `.fla` | Extract with minizip → parse XFLReader |
| Flash project (XFL-based, CS5+) | `.fla` | Extract with minizip → parse XFLReader |
| Flash project (legacy binary, CS4-) | `.fla` | OLE2 compound document — detected, embedded bitmaps recovered (QImage-validated); full timeline import not yet supported (re-save as CS5+/XFL) |
| XFL project | `.xfl` | Directory or ZIP → parse XFLReader |
| Compiled Flash | `.swf` | Header + embedded bitmap extraction |
| Component library | `.swc` | ZIP + catalog.xml + library.swf bitmaps |
Expand Down Expand Up @@ -95,3 +96,12 @@ flash.writeMovie(fp);
| [Apache Flex SDK](https://github.com/apache/flex-sdk) | SWC `catalog.xml` schema | Apache 2.0 |
| [lifeart/fla-viewer](https://github.com/lifeart/fla-viewer) | XFL DOMDocument.xml structure | MIT |
| FLV / ISO BMFF public spec | FLV 9-byte header, `ftyp` box layout | Public spec |

## Roadmap: Next2Flash merge

The Flare-Animate org is consolidating its Flash tooling by merging
[Next2Flash](https://github.com/SSF2-Mods-Official/Next2Flash) (an MIT-licensed
SWF round-trip editor with a native AS3 decompiler) into Flare. Because the two
projects use different stacks (C++/Qt vs Python/JS/Electron), the merge ports the
native-friendly pieces and bridges AS3 as an optional helper. See
[`NEXT2FLASH_INTEGRATION.md`](./NEXT2FLASH_INTEGRATION.md) for the full plan.
Loading
Loading