5 Commits

Author SHA1 Message Date
Marcos Paulo fa1fe8ab21 chore: release 0.7.3 2026-10-12 21:41:01 -03:00
Marcos Paulo 30d0c72338 build: use the masi/craft-libs fork
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:57:17 -03:00
Marcos Paulo c2688bbcb0 build(windows): set working directory to repo root in package.ps1 2026-10-12 20:57:17 -03:00
Marcos Paulo 38d003341f build(windows): package standalone filmcraft-cli zip and auto-detect rc.exe 2026-10-12 20:57:17 -03:00
Marcos Paulo 66aef503e3 chore: debrand ArtCraft and Discord references
Remove the Discord header button, Help menu and macOS app-menu links, About and Home
website links, brand assets and wordmark; rewrite docs, packaging URLs and catalogs.
Add .debrand rules and the craft-skills submodule (debrand skill) to keep upstream
syncs clean.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:57:17 -03:00
72 changed files with 210 additions and 532 deletions
+20
View File
@@ -0,0 +1,20 @@
# Strip upstream (ArtCraft / Discord) branding. Run: perl tools/craft-skills/skills/debrand/debrand.pl . (--check in CI)
delete docs/brand
# MIT/Apache texts stay verbatim. The copyright holder line stays everywhere (legal requirement).
keep ^(LICENSE-(MIT|APACHE)|\.debrand)$
dropline ^crates/ui-egui/src/i18n/.*\.tsv$ :: [^#\n][^\n]*\t[^\n]*(?:ArtCraft|Discord|getartcraft)
dropline ^ATTRIBUTION\.md$ :: \|\s*`docs/brand/
sub (?s)## First-party brand marks\n.*?(?=## Third-party source code) =>
sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n =>
sub drawn by the owner in ArtCraft => drawn by the owner by hand
sub in ArtCraft, then => by hand, then
sub drew it in ArtCraft as => drew it by hand as
sub owner's ArtCraft drawing => owner's drawing
sub ArtCraft,[ ]? =>
sub ArtCraft、 =>
sub https://getartcraft\.com/apps/filmcraft => https://github.com/storytold/filmcraft
sub https://discord\.gg/artcraft => https://github.com/storytold/filmcraft/issues
forbid (?i)artcraft(?! Team and the FilmCraft contributors)
forbid (?i)discord
sub Help menu, About and Discord links => Help menu and About links
sub \(artcraft#2093\) => (#2093)
+3
View File
@@ -0,0 +1,3 @@
[submodule "tools/craft-skills"]
path = tools/craft-skills
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
+2 -6
View File
@@ -86,12 +86,8 @@ reproduce an image (for example, point lists traced from someone else's icon).
`crates/media`, procedural looks in `crates/render`) are original work under the project licence
and are listed in `ATTRIBUTION.md`.
7. **When in doubt, leave it out** and draw or generate it yourself.
8. **The one exception: first-party ArtCraft brand marks.** The ArtCraft name and logos in `docs/brand/`
are trademarks of the ArtCraft Team, not open source, usable only unmodified and only in the context of
FilmCraft under `docs/brand/LICENSE-brand.txt`; forks and modified versions must remove them. They still
need a sidecar and an `ATTRIBUTION.md` row (licence `LicenseRef-ArtCraft-Trademark`). No other
non-open asset is allowed, and this exception never covers third-party marks (Adobe, Discord, GitHub
and other logos stay out; draw a generic icon instead).
8. **No non-open assets.** Third-party marks (Adobe, GitHub and other logos) stay out; draw a generic icon
instead.
9. **Fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), never in this
repo.** Don't commit new font files (the small Latin UI fonts already in `assets/fonts/` stay). A
font FilmCraft needs is added to craft-fonts, which the app reads through the optional build input
+16 -34
View File
@@ -30,24 +30,24 @@ iconography, images or other Adobe assets; open licences only; every asset attri
| `docs/images/filmcraft-scopes.png` | FilmCraft contributors | Original work: FilmCraft UI crop (scopes of a Charade (1963) frame, public domain) | MIT OR Apache-2.0 |
| `docs/images/filmcraft-effects.png` | FilmCraft contributors | Original work: FilmCraft screenshot crop; NASA Earth Views (US Government work, public domain) | MIT OR Apache-2.0; footage public domain |
| `docs/images/filmcraft-timeline.png` | FilmCraft contributors | Original work: FilmCraft UI crop; thumbnails from Night of the Living Dead (1968) and Carnival of Souls (1962), CC0 Chopin waveform | MIT OR Apache-2.0; film frames public domain |
| `assets/app-icon/filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; canonical vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; canonical vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `packaging/macos/dmg/background.svg` | @XusBadia | Original work: FilmCraft macOS DMG window background, derived from the FilmCraft app icon (`assets/app-icon/filmcraft.svg`); rendered to `background.tiff` by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) |
| `packaging/macos/dmg/background.tiff` | @XusBadia | Rendered from `packaging/macos/dmg/background.svg` by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) |
| `assets/app-icon/filmcraft-small.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; lighter vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft-1024.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; 1024 px render | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft-macos-512.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; macOS runtime Dock icon (512 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft.icns` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; macOS .icns | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft.ico` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Windows .ico (16-256 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 16 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 24 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 32 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 48 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 64 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 256 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 512 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme scalable | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `apps/filmcraft-web/web/favicon.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft-small.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; lighter vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft-1024.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; 1024 px render | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft-macos-512.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; macOS runtime Dock icon (512 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft.icns` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; macOS .icns | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/filmcraft.ico` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Windows .ico (16-256 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 16 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 24 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 32 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 48 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 64 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 256 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme 512 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; Linux hicolor theme scalable | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
| `apps/filmcraft-web/web/favicon.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner by hand and vectorised; 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
## Golden test images
@@ -129,24 +129,6 @@ carry each font's licence as `OFL-<family>.txt`.
| Shippori Mincho Regular (FONTDASU) | Japanese fallback for serif titles (native builds) | OFL-1.1 |
| BIZ UDMincho Regular (Morisawa) | Japanese fallback for serif titles (native builds) | OFL-1.1 |
## First-party brand marks
The ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team. They are not open source and
are not covered by the project licence; they may be used only unmodified and only in the context of
FilmCraft, under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt). Forks and modified versions must
remove them (AGENTS.md §1.8).
| File | Author | Source | Licence |
|---|---|---|---|
| `docs/brand/artcraft-logo-white.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-logo-white.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-logo.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-logo.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-mark-black.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-mark-black.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-mark.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
| `docs/brand/artcraft-mark.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft trademark, not open source; `docs/brand/LICENSE-brand.txt` (not MIT/Apache) |
## Third-party source code
Source files that are transcribed from third-party code rather than written from scratch. Each keeps
Generated
+55 -55
View File
@@ -1014,7 +1014,7 @@ dependencies = [
[[package]]
name = "craft-ui"
version = "0.1.0"
source = "git+https://github.com/storytold/craft-libs?rev=5c874d51eeb3de70e735c8ce87a59a7dedd47675#5c874d51eeb3de70e735c8ce87a59a7dedd47675"
source = "git+https://git.marcospaulo.dev.br/masi/craft-libs?rev=22544b6d619d4f16779b8bdfa3f0b642a86fc065#22544b6d619d4f16779b8bdfa3f0b642a86fc065"
dependencies = [
"egui",
"serde",
@@ -1674,7 +1674,7 @@ dependencies = [
[[package]]
name = "filmcraft"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"arboard",
"chrono",
@@ -1707,7 +1707,7 @@ dependencies = [
[[package]]
name = "filmcraft-aac"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -1717,7 +1717,7 @@ dependencies = [
[[package]]
name = "filmcraft-ac3"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
"thiserror 2.0.21",
@@ -1725,7 +1725,7 @@ dependencies = [
[[package]]
name = "filmcraft-apv"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -1735,14 +1735,14 @@ dependencies = [
[[package]]
name = "filmcraft-audio-dsp"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
]
[[package]]
name = "filmcraft-automation"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"base64 0.22.1",
"filmcraft-engine",
@@ -1758,7 +1758,7 @@ dependencies = [
[[package]]
name = "filmcraft-av1"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -1769,21 +1769,21 @@ dependencies = [
[[package]]
name = "filmcraft-avi"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
]
[[package]]
name = "filmcraft-bitstream"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"proptest",
]
[[package]]
name = "filmcraft-captions"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-project",
@@ -1796,11 +1796,11 @@ dependencies = [
[[package]]
name = "filmcraft-cfb"
version = "0.7.2"
version = "0.7.3"
[[package]]
name = "filmcraft-cli"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-automation",
"filmcraft-codecs",
@@ -1822,7 +1822,7 @@ dependencies = [
[[package]]
name = "filmcraft-codecs"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-aac",
"filmcraft-ac3",
@@ -1860,7 +1860,7 @@ dependencies = [
[[package]]
name = "filmcraft-color"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"proptest",
"serde",
@@ -1868,7 +1868,7 @@ dependencies = [
[[package]]
name = "filmcraft-dng"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-dng",
"rayon",
@@ -1877,7 +1877,7 @@ dependencies = [
[[package]]
name = "filmcraft-dnx"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -1887,7 +1887,7 @@ dependencies = [
[[package]]
name = "filmcraft-edit"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-geom",
"filmcraft-media",
@@ -1900,7 +1900,7 @@ dependencies = [
[[package]]
name = "filmcraft-engine"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-audio-dsp",
"filmcraft-captions",
@@ -1934,7 +1934,7 @@ dependencies = [
[[package]]
name = "filmcraft-export"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-aac",
"filmcraft-apv",
@@ -1965,7 +1965,7 @@ dependencies = [
[[package]]
name = "filmcraft-flac"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -1974,7 +1974,7 @@ dependencies = [
[[package]]
name = "filmcraft-format"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-media",
"filmcraft-project",
@@ -1987,7 +1987,7 @@ dependencies = [
[[package]]
name = "filmcraft-frame"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-time",
@@ -1997,7 +1997,7 @@ dependencies = [
[[package]]
name = "filmcraft-geom"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"proptest",
"serde",
@@ -2005,7 +2005,7 @@ dependencies = [
[[package]]
name = "filmcraft-golden"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-frame",
@@ -2022,7 +2022,7 @@ dependencies = [
[[package]]
name = "filmcraft-gpu"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-export",
@@ -2041,7 +2041,7 @@ dependencies = [
[[package]]
name = "filmcraft-h264"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2051,7 +2051,7 @@ dependencies = [
[[package]]
name = "filmcraft-h264enc"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2061,7 +2061,7 @@ dependencies = [
[[package]]
name = "filmcraft-hevc"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2071,7 +2071,7 @@ dependencies = [
[[package]]
name = "filmcraft-interchange"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-cfb",
"filmcraft-color",
@@ -2088,7 +2088,7 @@ dependencies = [
[[package]]
name = "filmcraft-isobmff"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2099,7 +2099,7 @@ dependencies = [
[[package]]
name = "filmcraft-matroska"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
"serde_json",
@@ -2107,7 +2107,7 @@ dependencies = [
[[package]]
name = "filmcraft-media"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-dng",
@@ -2123,7 +2123,7 @@ dependencies = [
[[package]]
name = "filmcraft-mpa"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2132,7 +2132,7 @@ dependencies = [
[[package]]
name = "filmcraft-mpeg2v"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
"rayon",
@@ -2141,7 +2141,7 @@ dependencies = [
[[package]]
name = "filmcraft-mpegts"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
"thiserror 2.0.21",
@@ -2149,28 +2149,28 @@ dependencies = [
[[package]]
name = "filmcraft-mxf"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
]
[[package]]
name = "filmcraft-ogg"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
]
[[package]]
name = "filmcraft-opus"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
]
[[package]]
name = "filmcraft-platform"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-codecs",
@@ -2196,7 +2196,7 @@ dependencies = [
[[package]]
name = "filmcraft-project"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"filmcraft-geom",
@@ -2210,7 +2210,7 @@ dependencies = [
[[package]]
name = "filmcraft-prores"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"filmcraft-testkit",
@@ -2220,7 +2220,7 @@ dependencies = [
[[package]]
name = "filmcraft-render"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-audio-dsp",
"filmcraft-captions",
@@ -2240,7 +2240,7 @@ dependencies = [
[[package]]
name = "filmcraft-scopes"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"serde",
@@ -2249,7 +2249,7 @@ dependencies = [
[[package]]
name = "filmcraft-speech"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"candle-core",
"candle-nn",
@@ -2267,14 +2267,14 @@ dependencies = [
[[package]]
name = "filmcraft-testkit"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"png",
]
[[package]]
name = "filmcraft-text"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-color",
"harfrust",
@@ -2286,7 +2286,7 @@ dependencies = [
[[package]]
name = "filmcraft-time"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"proptest",
"serde",
@@ -2294,7 +2294,7 @@ dependencies = [
[[package]]
name = "filmcraft-tts"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"candle-core",
"candle-nn",
@@ -2308,7 +2308,7 @@ dependencies = [
[[package]]
name = "filmcraft-tts-text"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"serde",
"thiserror 2.0.21",
@@ -2316,7 +2316,7 @@ dependencies = [
[[package]]
name = "filmcraft-ui-egui"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"cpu-time",
"craft-ui",
@@ -2355,14 +2355,14 @@ dependencies = [
[[package]]
name = "filmcraft-vp8"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"thiserror 2.0.21",
]
[[package]]
name = "filmcraft-vp9"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-bitstream",
"rayon",
@@ -2371,7 +2371,7 @@ dependencies = [
[[package]]
name = "filmcraft-web"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"eframe",
"egui",
@@ -7396,7 +7396,7 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
[[package]]
name = "xtask"
version = "0.7.2"
version = "0.7.3"
dependencies = [
"filmcraft-testkit",
"serde_json",
+2 -2
View File
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/*", "xtask"]
[workspace.package]
version = "0.7.2"
version = "0.7.3"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
@@ -73,7 +73,7 @@ roxmltree = "0.21"
# ui
# Shared frontend components; keep this dependency above the engine boundary.
craft-ui = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] }
craft-ui = { version = "0.1.0", git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "22544b6d619d4f16779b8bdfa3f0b642a86fc065", features = ["serde"] }
egui = "0.36"
eframe = { version = "0.36", default-features = false }
egui_kittest = "0.36"
-4
View File
@@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the FilmCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
+15 -76
View File
@@ -1,13 +1,3 @@
<p align="center">
<a href="https://getartcraft.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/brand/artcraft-logo-white.svg">
<img alt="ArtCraft" src="docs/brand/artcraft-logo.svg" width="200">
</picture>
</a>
</p>
<h1 align="center">FilmCraft</h1>
<p align="center">
@@ -15,8 +5,7 @@
</p>
<p align="center">
An open-source, clean-room take on the Adobe Premiere Pro workflow: native on macOS, Windows and Linux, and in the browser via WebAssembly.<br>
By the ArtCraft team.
An open-source, clean-room take on the Adobe Premiere Pro workflow: native on macOS, Windows and Linux, and in the browser via WebAssembly.
</p>
<p align="center">
@@ -26,16 +15,6 @@
<a href="#status"><img alt="Status: young and moving fast" src="https://img.shields.io/badge/status-young%20and%20moving%20fast-6a3fd6"></a>
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<p align="center">
<a href="https://getartcraft.com/apps/filmcraft"><b>FilmCraft on getartcraft.com</b></a> ·
<a href="https://getartcraft.com/">ArtCraft</a> ·
<a href="https://getartcraft.com/apps">All Crafting Apps</a>
</p>
<br>
<p align="center">
@@ -44,10 +23,6 @@
<p align="center"><sub><i>Apollo 11 - Tranquility</i>: a three-minute documentary edit of NASA's 1969 launch, landing and moonwalk film, with subtitles from the mission transcript. Every frame in these screenshots comes from public-domain footage, decoded, composited and graded by FilmCraft's own code.</sub></p>
> [!NOTE]
> **ArtCraft is a community of artists from all walks of life.** Digital, generative, music,
> games &mdash; if you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
<p align="center">
<a href="#edit">Edit</a> ·
<a href="#color">Color</a> ·
@@ -262,7 +237,7 @@ git clone https://github.com/storytold/craft-fonts ../craft-fonts
CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo run --release -p filmcraft
```
The control protocol is documented in [docs/control-protocol.md](docs/control-protocol.md). Stuck, or want to show what you made? Ask in [Discord](https://discord.gg/artcraft).
The control protocol is documented in [docs/control-protocol.md](docs/control-protocol.md).
## Documentation
@@ -298,7 +273,7 @@ The biggest gaps today:
- **Real-world media and platforms.** Our decoders are bit-exact on conformance streams, but camera and phone files in the wild are less tested. Windows and Linux get far less testing than macOS.
- **AI features.** Few so far; speech to text is optional and off by default.
Bug reports with real footage are the most useful thing you can send us: [open an issue](https://github.com/storytold/filmcraft/issues) or tell us in [Discord](https://discord.gg/artcraft).
Bug reports with real footage are the most useful thing you can send us: [open an issue](https://github.com/storytold/filmcraft/issues).
## Architecture
@@ -318,8 +293,6 @@ Nothing below the front ends depends on a UI toolkit or OS API. `cargo xtask ci`
## Downloads
**New to FilmCraft?** Download it from the [FilmCraft page on getartcraft.com](https://getartcraft.com/apps/filmcraft). That's the easiest way to install it.
**Want a specific build or format?** On GitHub, the [latest release](https://github.com/storytold/filmcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/filmcraft/releases) has earlier versions and their notes. `<ver>` in the file names is the version number, and `SHA256SUMS.txt` lists a checksum for every file.
### Windows
@@ -397,44 +370,22 @@ emerge --ask media-video/filmcraft-bin
## The Crafting Apps
FilmCraft is one of the **Crafting Apps**: free, open-source creative tools from the
[ArtCraft](https://getartcraft.com/) team, each written from scratch in Rust and each able to
[storytold](https://github.com/storytold) team, each written from scratch in Rust and each able to
stand on its own.
| | App | What it's for | Code | Learn more |
|:-:|---|---|---|---|
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | [Website](https://getartcraft.com/apps/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | **Video editing, color and sound · you are here** | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | [Website](https://getartcraft.com/apps/designcraft) |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video studio for artists who want real control.
| | App | What it's for | Code |
|:-:|---|---|---|
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | **Video editing, color and sound · you are here** | [GitHub](https://github.com/storytold/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) |
<br>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<h3 align="center">Come make things with us</h3>
<p align="center">
Our Discord is where artists of every kind hang out: people who paint, shoot, draw, cut film,
set type, and people still figuring out what they like to make. Share what you're working on,
ask for help, tell us what's broken, or tell us what you wish these tools could do.
Whatever your medium and however long you've been at it, you're welcome here.
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><b>discord.gg/artcraft</b></a> ·
<a href="https://getartcraft.com/">getartcraft.com</a> ·
<a href="https://getartcraft.com/apps">The Crafting Apps</a> ·
<a href="https://getartcraft.com/apps/filmcraft">FilmCraft</a>
</p>
<br>
---
## License and credits
@@ -448,22 +399,10 @@ with its author, source and license in [ATTRIBUTION.md](ATTRIBUTION.md). Builds
**Footage and music in the screenshots:** NASA's Apollo 11 film and television footage from [images.nasa.gov](https://images.nasa.gov) (launch, Launch Control Center, lunar surface and recovery) and the Apollo 11 air-to-ground voice transcript, all US Government works in the public domain (NASA does not endorse this project); *Night of the Living Dead* (1968), *Carnival of Souls* (1962) and *Charade* (1963), all in the US public domain; *Earth Views from the ISS* by NASA; Chopin's Nocturne Op. 48 No. 1 and Ballade No. 1, performed for Musopen and released under CC0. The media itself is not in this repository. Sources and details for every asset are in [ATTRIBUTION.md](ATTRIBUTION.md).
FilmCraft is an independent implementation. It contains no Adobe code, icons, images, presets or LUTs, and no GPL or LGPL code; every icon is drawn in code and every asset is openly licensed and attributed ([AGENTS.md](AGENTS.md)), apart from the ArtCraft name and logos, which are trademarks of the ArtCraft Team used under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt). ffmpeg is used only as an external test oracle.
The ArtCraft name, wordmark and logos in [`docs/brand/`](docs/brand/) are trademarks of the
ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as
part of this repository and FilmCraft, under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt).
Forks and modified versions must remove them.
FilmCraft is an independent implementation. It contains no Adobe code, icons, images, presets or LUTs, and no GPL or LGPL code; every icon is drawn in code and every asset is openly licensed and attributed ([AGENTS.md](AGENTS.md)). ffmpeg is used only as an external test oracle.
<sub>Adobe, Photoshop, Illustrator, Premiere Pro, Lightroom, Acrobat, After Effects and InDesign are trademarks or registered trademarks of Adobe Inc. in the United States and/or other countries. FilmCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Adobe Inc.; these names are used only to describe the workflows it is compatible with.</sub>
<br>
<p align="center">
<a href="https://getartcraft.com/"><img alt="ArtCraft" src="docs/brand/artcraft-mark.svg" width="28"></a><br>
<sub>Made by the <a href="https://getartcraft.com/">ArtCraft</a> team and community.</sub>
</p>
## Star history
[![Star History Chart](https://api.star-history.com/svg?repos=storytold/filmcraft&type=Date&legend=top-left)](https://www.star-history.com/?repos=storytold%2Ffilmcraft&type=date&legend=top-left)
@@ -1,7 +1,7 @@
asset: favicon.png
title: FilmCraft web app icon (favicon and loading image), 128 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
+1 -1
View File
@@ -36,7 +36,7 @@ cpal = "0.16"
arboard = "3"
chrono = { version = "0.4", default-features = false, features = ["clock"] }
sys-locale = "0.3"
# Help menu / About / Discord links in the system browser (MIT; as PhotoCraft).
# Help menu / About links in the system browser (MIT; as PhotoCraft).
open = "5"
[dev-dependencies]
+1 -1
View File
@@ -305,7 +305,7 @@ fn app_creator(launch: Launch, graphics: graphics::GraphicsStart, created: Arc<A
app.hooks.run_dialog = Some(Box::new(run_dialog_off_thread));
}
app.hooks.open_path = Some(Box::new(open_path));
// Help menu, About and Discord links (#642): eframe is built without its `links`
// Help menu and About links (#642): eframe is built without its `links`
// feature, so `ctx.open_url` does nothing on the desktop. Detached, so a launcher
// that waits for the browser never freezes the UI.
app.hooks.open_url = Some(Box::new(|url: &str| open::that_detached(url).map_err(|e| e.to_string())));
+2 -4
View File
@@ -39,11 +39,10 @@ pub fn install(app: &FilmcraftApp, ctx: egui::Context) -> (Receiver<String>, Men
native.push((it.clone(), mi.clone()));
let _ = settings.append(&mi);
}
// About and Discord repeat Help menu commands: same translated labels, updated with them
// About repeats Help menu commands: same translated labels, updated with them
let label = |id: &str, english: &str| items.iter().find(|i| i.id == id).map_or_else(|| english.to_string(), |i| i.label.clone());
let about = MenuItem::with_id("app.about", label("app.about", "About FilmCraft"), true, None);
let discord = MenuItem::with_id("help.discord", label("help.discord", "Join the ArtCraft Discord…"), true, None);
for (id, mi) in [("app.about", &about), ("help.discord", &discord)] {
for (id, mi) in [("app.about", &about)] {
if let Some(it) = items.iter().find(|i| i.id == id) {
// recorded as built (enabled, no shortcut), so the first update applies the real state
native.push((Item { enabled: true, shortcut: None, ..it.clone() }, mi.clone()));
@@ -58,7 +57,6 @@ pub fn install(app: &FilmcraftApp, ctx: egui::Context) -> (Receiver<String>, Men
let [(_, hide), (_, hide_others), (_, quit)] = &predefined;
let _ = app_menu.append_items(&[
&about,
&discord,
&PredefinedMenuItem::separator(),
&settings,
&PredefinedMenuItem::separator(),
+1 -1
View File
@@ -2,7 +2,7 @@ FilmCraft app icon (filmcraft.svg and every file derived from it in this directo
filmcraft-small.svg, filmcraft-1024.png, filmcraft-macos-512.png, filmcraft.icns, filmcraft.ico,
hicolor/, and apps/filmcraft-web/web/favicon.png).
Original artwork made for this project by the FilmCraft owner (Brandon Thomas) in ArtCraft, then
Original artwork made for this project by the FilmCraft owner (Brandon Thomas) by hand, then
vectorised. No third-party material. Licensed like the rest of FilmCraft, under either of
* Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+1 -1
View File
@@ -23,7 +23,7 @@ Exactly three colours:
## Provenance
The owner drew it in ArtCraft as a 2880 px engraving-style image. The original is kept in craftrules
The owner drew it by hand as a 2880 px engraving-style image. The original is kept in craftrules
at `craftrules/assets/app-icons/filmcraft/source.png` (not in this repo). It was vectorised with
craftrules `assets/logo-options/_tools/vectorize_tile.py`, which keys the drawing to the three-colour
palette and traces the ink with potrace. Licence: [LICENSE.txt](LICENSE.txt) (MIT OR Apache-2.0).
@@ -1,7 +1,7 @@
asset: filmcraft-1024.png
title: FilmCraft app icon, 1024 px render
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: filmcraft-macos-512.png
title: FilmCraft app icon, macOS runtime Dock icon (512 px)
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: filmcraft-small.svg
title: FilmCraft app icon, lighter vector
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
+1 -1
View File
@@ -1,7 +1,7 @@
asset: filmcraft.icns
title: FilmCraft app icon, macOS .icns
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
+1 -1
View File
@@ -1,7 +1,7 @@
asset: filmcraft.ico
title: FilmCraft app icon, Windows .ico (16-256 px)
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
+2 -2
View File
@@ -1,8 +1,8 @@
asset: filmcraft.svg
title: FilmCraft app icon, canonical vector (owl with ear tufts)
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
notes: SVG traced at 2048 px with craftrules assets/logo-options/_tools/vectorize_tile.py from the owner's ArtCraft drawing (craftrules assets/app-icons/filmcraft/source.png). Three colours: ink #0b0b0c, paper #efe9dc, app colour #8b5cf6; 512 viewBox, rx=112. See assets/app-icon/README.md.
notes: SVG traced at 2048 px with craftrules assets/logo-options/_tools/vectorize_tile.py from the owner's drawing (craftrules assets/app-icons/filmcraft/source.png). Three colours: ink #0b0b0c, paper #efe9dc, app colour #8b5cf6; 512 viewBox, rx=112. See assets/app-icon/README.md.
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 128 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 16 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 24 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 256 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 32 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 48 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 512 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.png
title: FilmCraft app icon, Linux hicolor theme 64 px
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
@@ -1,7 +1,7 @@
asset: ai.storyteller.filmcraft.svg
title: FilmCraft app icon, Linux hicolor theme scalable
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
source: original work (drawn by the owner in ArtCraft, then vectorised)
source: original work (drawn by the owner by hand, then vectorised)
license: MIT OR Apache-2.0
license-file: assets/app-icon/LICENSE.txt
added: 2026-10-02 by Claude (agent) for Brandon Thomas
-1
View File
@@ -35,7 +35,6 @@ rayon = { workspace = true }
web-time = "1"
# Unicode Bidirectional Algorithm for Arabic and Hebrew captions in reading order (MIT OR Apache-2.0).
unicode-bidi = "0.3.18"
# ArtCraft wordmark (PNG) for the About dialog and Home screen.
image = { version = "0.25", default-features = false, features = ["png"] }
# Thread/process CPU clocks for frame-job profiling (safe wrappers; see frames.rs).
-33
View File
@@ -1,33 +0,0 @@
//! The ArtCraft wordmark (first-party trademark, used with permission; see `docs/brand/` and
//! AGENTS.md §1.8), decoded once and kept as a texture.
const LOGO_LIGHT_INK: &[u8] = include_bytes!("../../../docs/brand/artcraft-logo-white.png");
const LOGO_DARK_INK: &[u8] = include_bytes!("../../../docs/brand/artcraft-logo.png");
/// The wordmark for a dark (`dark = true`) or light UI: light ink on dark themes. Its aspect
/// ratio is width / height of the returned texture.
pub fn wordmark(ctx: &egui::Context, dark: bool) -> Option<egui::TextureHandle> {
let id = egui::Id::new(("artcraft-wordmark", dark));
if let Some(t) = ctx.data(|d| d.get_temp::<egui::TextureHandle>(id)) {
return Some(t);
}
let bytes = if dark { LOGO_LIGHT_INK } else { LOGO_DARK_INK };
let img = image::load_from_memory_with_format(bytes, image::ImageFormat::Png).ok()?;
// Large enough to stay sharp at 2x for the sizes we draw (≤ 320 pt wide).
let img = img.resize(1024, 1024, image::imageops::FilterType::Lanczos3).to_rgba8();
let color = egui::ColorImage::from_rgba_unmultiplied([img.width() as usize, img.height() as usize], img.as_raw());
let tex = ctx.load_texture("artcraft-wordmark", color, egui::TextureOptions::LINEAR);
ctx.data_mut(|d| d.insert_temp(id, tex.clone()));
Some(tex)
}
/// Draw the wordmark `height` points tall with its left edge at `left_center` (vertically centred).
/// Returns the drawn rect.
pub fn paint_wordmark(ui: &egui::Ui, left_center: egui::Pos2, height: f32, dark: bool) -> Option<egui::Rect> {
let tex = wordmark(ui.ctx(), dark)?;
let [w, h] = tex.size();
let width = height * w as f32 / h.max(1) as f32;
let r = egui::Rect::from_min_size(egui::pos2(left_center.x, left_center.y - height / 2.0), egui::vec2(width, height));
ui.painter().image(tex.id(), r, egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), egui::Color32::WHITE);
Some(r)
}
+1 -1
View File
@@ -24,7 +24,7 @@ pub(crate) fn craft_fonts() -> impl Iterator<Item = &'static filmcraft_text::fon
}
// Hangul: neither the UI fonts nor the Chinese/Japanese fallbacks have it, so typed, pasted and
// IME-composed Korean drew as missing-glyph boxes (artcraft#2093).
// IME-composed Korean drew as missing-glyph boxes (#2093).
const KOREAN_SAMPLE: &str = "한국어입력테스트";
const KOREAN_PREFERRED: &[&str] = &["Malgun Gothic", "Apple SD Gothic Neo", "Noto Sans CJK KR", "Noto Sans KR", "Source Han Sans K", "NanumGothic"];
+1 -15
View File
@@ -120,20 +120,10 @@ pub fn show(app: &mut FilmcraftApp, ui: &mut egui::Ui, rect: Rect) {
let wresp = ui.interact(wr, egui::Id::new("hdr-ws-name"), Sense::click());
app.auto.add("header.workspaceName", wr, &ws);
p.galley_with_override_text_color(pos2(wr.min.x + 4.0, rect.center().y - wg.size().y / 2.0), wg, if wresp.hovered() { t.text } else { t.text_dim });
// Community: a labelled Discord button, always one click away.
{
let label = "Discord";
let g = p.layout_no_wrap(label.to_string(), Tokens::ui(12.0), Color32::WHITE);
let w = g.size().x + 34.0;
let r = Rect::from_min_size(pos2(wr.min.x - w - 14.0, rect.center().y - 12.0), vec2(w, 24.0));
let resp = ui.interact(r, egui::Id::new("hdr-discord"), Sense::click()).on_hover_text(tl!("Join the ArtCraft Discord (discord.gg/artcraft)"));
app.auto.add("header.discord", r, "Join the ArtCraft Discord");
ui.painter().rect_filled(r, 12.0, if resp.hovered() { t.accent_hover } else { t.accent });
icons::paint(ui.painter(), Rect::from_center_size(pos2(r.min.x + 14.0, r.center().y), vec2(14.0, 14.0)), Icon::Chat, Color32::WHITE);
ui.painter().galley(pos2(r.min.x + 25.0, r.center().y - g.size().y / 2.0), g, Color32::WHITE);
// Localized menus and user titles can be wider than English. Use the actual gap.
let left = left_end + 12.0;
let right = r.min.x - 12.0;
let right = wr.min.x - 12.0;
if right > left + 40.0 {
let mut job = egui::text::LayoutJob::simple_singleline(title, Tokens::ui(14.0), t.tab_text_active);
job.wrap.max_width = right - left;
@@ -147,10 +137,6 @@ pub fn show(app: &mut FilmcraftApp, ui: &mut egui::Ui, rect: Rect) {
t.tab_text_active,
);
}
if resp.clicked() {
crate::links::open(app, ui.ctx(), crate::links::DISCORD);
}
}
let popup_id = egui::Id::new("workspaces-popup");
if ws_resp.clicked() || wresp.clicked() {
+1 -4
View File
@@ -4,7 +4,7 @@
# German video-editing vocabulary. No proprietary localisation resource, string table or product UI
# was consulted or copied; add entries the same way. Like the German catalogs of the other Craft
# apps, text addresses the user informally ("du") and commands use the infinitive ("Projekt
# öffnen…"). Product, format and feature names (FilmCraft, ArtCraft, Lumetri, Essential Graphics,
# öffnen…"). Product, format and feature names (FilmCraft, Lumetri, Essential Graphics,
# EDL, AAF…) keep their spelling. This catalog covers every menu, including the native macOS
# app menu; anything else is shown in English.
#
@@ -40,7 +40,6 @@
Apply Default Transitions to Selection Standardübergänge auf Auswahl anwenden
Apply Video Transition Videoübergang anwenden
Arrange Anordnen
ArtCraft Website ArtCraft-Website
Assembly Montage
Attach Proxies… Proxys anhängen…
Audio Audio
@@ -146,7 +145,6 @@
Fill frame Bild füllen
FilmCraft Help… FilmCraft-Hilfe…
FilmCraft on GitHub FilmCraft auf GitHub
FilmCraft on getartcraft.com FilmCraft auf getartcraft.com
Final Cut Pro XML… Final Cut Pro XML…
Find Next Weitersuchen
Find… Suchen…
@@ -195,7 +193,6 @@
Install Motion Graphics Template… Motion-Graphics-Vorlage installieren…
Interpret Footage… Material interpretieren…
Iris Iris
Join the ArtCraft Discord… Dem ArtCraft-Discord beitreten…
Keyboard Shortcuts… Tastenkürzel…
Label Farbmarkierung
Labels… Farbmarkierungen…
Can't render this file because it contains an unexpected character in line 6 and column 45.
+1 -8
View File
@@ -11,7 +11,7 @@
# Clean-room: every entry was written from the plain meaning of the English text using ordinary
# Spanish video-editing vocabulary (pista, cabezal, secuencia, bandeja, procesar…). No proprietary
# localisation resource, string table or product UI was consulted or copied; add entries the same
# way. Product and technology names (FilmCraft, ArtCraft, Lumetri, ProRes, LUFS…) keep their
# way. Product and technology names (FilmCraft, Lumetri, ProRes, LUFS…) keep their
# spelling. "video" is written without an accent, as in the rest of this catalog.
About FilmCraft Acerca de FilmCraft
@@ -40,7 +40,6 @@
Apply Default Transitions to Selection Aplicar transiciones predeterminadas a la selección
Apply Video Transition Aplicar transición de video
Arrange Organizar
ArtCraft Website Sitio web de ArtCraft
Assembly Ensamblaje
Attach Proxies… Adjuntar proxies…
Audio Channels… Canales de audio…
@@ -135,7 +134,6 @@
Fill frame Rellenar fotograma
FilmCraft Help… Ayuda de FilmCraft…
FilmCraft on GitHub FilmCraft en GitHub
FilmCraft on getartcraft.com FilmCraft en getartcraft.com
Find Next Buscar siguiente
Find… Buscar…
Fit Ajustar
@@ -179,7 +177,6 @@
Insert Frame Hold Segment Insertar segmento de fotograma congelado
Install Motion Graphics Template… Instalar plantilla de animación…
Interpret Footage… Interpretar material…
Join the ArtCraft Discord… Únete al Discord de ArtCraft…
Keyboard Shortcuts… Atajos de teclado…
Label Etiqueta
Labels… Etiquetas…
@@ -370,7 +367,6 @@
Master volume: use the Audio Track Mixer Volumen maestro: usa el mezclador de pistas de audio
Search Buscar
Quick Export Exportación rápida
Join the ArtCraft Discord (discord.gg/artcraft) Únete al Discord de ArtCraft (discord.gg/artcraft)
Cancel Cancelar
OK Aceptar
Interpret Footage Interpretar material
@@ -413,8 +409,6 @@
Delete Caption Track Eliminar pista de subtítulos
Delete Empty Caption Tracks Eliminar pistas de subtítulos vacías
Version {version} Versión {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. Un editor de video no lineal en Rust puro, desarrollado en sala limpia. Parte de la familia ArtCraft.
Join the ArtCraft Discord Únete al Discord de ArtCraft
Source code on GitHub Código fuente en GitHub
Report an issue Informar de un problema
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT OR Apache-2.0. Fuentes: Inter, Noto Serif y JetBrains Mono (SIL OFL 1.1).
@@ -455,7 +449,6 @@
Bars and Tone Barras y tono
SMPTE HD bars with 1 kHz reference tone Barras SMPTE HD con tono de referencia de 1 kHz
Community Comunidad
Join us on Discord Únete a nosotros en Discord
OMF Export Settings Ajustes de exportación OMF
AAF Export Settings Ajustes de exportación AAF
OMF Title: Título OMF:
Can't render this file because it contains an unexpected character in line 3 and column 95.
+1 -8
View File
@@ -4,7 +4,7 @@
# French video-editing vocabulary. No proprietary localisation resource, string table or product UI
# was consulted or copied; add entries the same way. Commands use the infinitive ("Enregistrer
# sous…"), messages address the user as "vous", and labels use French sentence case. Product,
# format and technology names (FilmCraft, ArtCraft, Lumetri, ProRes, LUFS, EDL, AAF…) keep their
# format and technology names (FilmCraft, Lumetri, ProRes, LUFS, EDL, AAF…) keep their
# spelling. French spacing: a space before ":", ";", "?" and "!". This catalog has the same entries
# as `es.tsv` plus the native macOS Settings menu; strings added later show in English until they
# are translated. A native-speaker review is welcome.
@@ -42,7 +42,6 @@
Apply Default Transitions to Selection Appliquer les transitions par défaut à la sélection
Apply Video Transition Appliquer une transition vidéo
Arrange Disposition
ArtCraft Website Site web d'ArtCraft
Assembly Assemblage
Attach Proxies… Associer des proxys…
Audio Channels… Canaux audio…
@@ -137,7 +136,6 @@
Fill frame Remplir l'image
FilmCraft Help… Aide de FilmCraft…
FilmCraft on GitHub FilmCraft sur GitHub
FilmCraft on getartcraft.com FilmCraft sur getartcraft.com
Find Next Rechercher le suivant
Find… Rechercher…
Fit Adapter
@@ -181,7 +179,6 @@
Insert Frame Hold Segment Insérer un segment d'image figée
Install Motion Graphics Template… Installer un modèle d'animation graphique…
Interpret Footage… Interpréter le métrage…
Join the ArtCraft Discord… Rejoindre le Discord d'ArtCraft…
Keyboard Shortcuts… Raccourcis clavier…
Label Étiquette
Labels… Étiquettes…
@@ -372,7 +369,6 @@
Master volume: use the Audio Track Mixer Volume principal : utilisez le Mixeur de pistes audio
Search Rechercher
Quick Export Exportation rapide
Join the ArtCraft Discord (discord.gg/artcraft) Rejoindre le Discord d'ArtCraft (discord.gg/artcraft)
Cancel Annuler
OK OK
Interpret Footage Interpréter le métrage
@@ -415,8 +411,6 @@
Delete Caption Track Supprimer la piste de sous-titres
Delete Empty Caption Tracks Supprimer les pistes de sous-titres vides
Version {version} Version {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. Un éditeur vidéo non linéaire en pur Rust, conçu en salle blanche. Membre de la famille ArtCraft.
Join the ArtCraft Discord Rejoindre le Discord d'ArtCraft
Source code on GitHub Code source sur GitHub
Report an issue Signaler un problème
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT OR Apache-2.0. Polices : Inter, Noto Serif et JetBrains Mono (SIL OFL 1.1).
@@ -457,7 +451,6 @@
Bars and Tone Barres et tonalité
SMPTE HD bars with 1 kHz reference tone Barres SMPTE HD avec tonalité de référence à 1 kHz
Community Communauté
Join us on Discord Rejoignez-nous sur Discord
OMF Export Settings Paramètres d'exportation OMF
AAF Export Settings Paramètres d'exportation AAF
OMF Title: Titre OMF :
Can't render this file because it contains an unexpected character in line 5 and column 83.
+1 -8
View File
@@ -5,7 +5,7 @@
# string table or product UI was consulted or copied; add entries the same way. Commands use the
# base verb ("Simpan Sebagai…", "Tambah Penanda"), messages address the user as "Anda", and menu
# labels keep the title case of the English source. Product, format and technology names
# (FilmCraft, ArtCraft, Lumetri, ProRes, LUFS, EDL, AAF…) keep their spelling, and common loanwords
# (FilmCraft, Lumetri, ProRes, LUFS, EDL, AAF…) keep their spelling, and common loanwords
# of the trade (render, preset, mixer, gain, ripple, roll, slip, slide, snap, scrub, offline) stay
# as they are. Decimal fractions in descriptions use a comma (29,97 fps). This catalog has the same
# entries as `es.tsv` plus the native macOS Settings menu; strings added later show in English until
@@ -47,7 +47,6 @@
Apply Default Transitions to Selection Terapkan Transisi Bawaan ke Pilihan
Apply Video Transition Terapkan Transisi Video
Arrange Susun
ArtCraft Website Situs Web ArtCraft
Assembly Perakitan
Attach Proxies… Lampirkan Proksi…
Audio Channels… Kanal Audio…
@@ -142,7 +141,6 @@
Fill frame Isi bingkai
FilmCraft Help… Bantuan FilmCraft…
FilmCraft on GitHub FilmCraft di GitHub
FilmCraft on getartcraft.com FilmCraft di getartcraft.com
Find Next Cari Berikutnya
Find… Cari…
Fit Pas
@@ -186,7 +184,6 @@
Insert Frame Hold Segment Sisipkan Segmen Tahan Bingkai
Install Motion Graphics Template… Pasang Templat Grafis Gerak…
Interpret Footage… Interpretasikan Rekaman…
Join the ArtCraft Discord… Gabung ke Discord ArtCraft…
Keyboard Shortcuts… Pintasan Keyboard…
Label Label
Labels… Label…
@@ -377,7 +374,6 @@
Master volume: use the Audio Track Mixer Volume master: gunakan Mixer Trek Audio
Search Cari
Quick Export Ekspor Cepat
Join the ArtCraft Discord (discord.gg/artcraft) Gabung ke Discord ArtCraft (discord.gg/artcraft)
Cancel Batal
OK OK
Interpret Footage Interpretasikan Rekaman
@@ -420,8 +416,6 @@
Delete Caption Track Hapus Trek Takarir
Delete Empty Caption Tracks Hapus Trek Takarir Kosong
Version {version} Versi {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. Editor video non-linear clean-room berbahasa Rust murni. Bagian dari keluarga ArtCraft.
Join the ArtCraft Discord Gabung ke Discord ArtCraft
Source code on GitHub Kode sumber di GitHub
Report an issue Laporkan masalah
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT OR Apache-2.0. Font: Inter, Noto Serif dan JetBrains Mono (SIL OFL 1.1).
@@ -462,7 +456,6 @@
Bars and Tone Bar dan Nada
SMPTE HD bars with 1 kHz reference tone Bar SMPTE HD dengan nada referensi 1 kHz
Community Komunitas
Join us on Discord Bergabunglah dengan kami di Discord
OMF Export Settings Pengaturan Ekspor OMF
AAF Export Settings Pengaturan Ekspor AAF
OMF Title: Judul OMF:
Can't render this file because it contains an unexpected character in line 6 and column 14.
+1 -8
View File
@@ -4,7 +4,7 @@
# Clean-room: every entry was written from the plain meaning of the English text using ordinary
# Japanese computing and video-editing vocabulary (クリップ, シーケンス, トラック, 再生ヘッド, ぼかし ...). No
# proprietary localisation resource, string table or product UI was consulted or copied; add entries
# the same way. Product and technology names (FilmCraft, ArtCraft, Lumetri, ProRes, LUFS ...) keep
# the same way. Product and technology names (FilmCraft, Lumetri, ProRes, LUFS ...) keep
# their spelling.
#
# House style, so new entries read like the rest:
@@ -42,7 +42,6 @@
Apply Default Transitions to Selection 選択範囲に既定のトランジションを適用
Apply Video Transition ビデオトランジションを適用
Arrange 重ね順
ArtCraft Website ArtCraft の Web サイト
Assembly アセンブリ
Attach Proxies… プロキシを関連付け…
Audio Channels… オーディオチャンネル…
@@ -137,7 +136,6 @@
Fill frame フレームを埋める
FilmCraft Help… FilmCraft ヘルプ…
FilmCraft on GitHub GitHub の FilmCraft
FilmCraft on getartcraft.com getartcraft.com の FilmCraft
Find Next 次を検索
Find… 検索…
Fit 合わせる
@@ -181,7 +179,6 @@
Insert Frame Hold Segment フレームホールドセグメントを挿入
Install Motion Graphics Template… モーショングラフィックステンプレートをインストール…
Interpret Footage… 素材を解釈…
Join the ArtCraft Discord… ArtCraft の Discord に参加…
Keyboard Shortcuts… キーボードショートカット…
Label ラベル
Labels… ラベル…
@@ -371,7 +368,6 @@
Master volume: use the Audio Track Mixer マスター音量はオーディオトラックミキサーで調整してください
Search 検索
Quick Export クイック書き出し
Join the ArtCraft Discord (discord.gg/artcraft) ArtCraft の Discord に参加 (discord.gg/artcraft)
Cancel キャンセル
OK OK
Interpret Footage 素材を解釈
@@ -410,8 +406,6 @@
Delete Audio Tracks オーディオトラックを削除する
All Empty Tracks すべての空のトラック
Version {version} バージョン {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. Rust だけで書かれた、クリーンルーム設計のノンリニアビデオ編集ソフトです。ArtCraft ファミリーの一員です。
Join the ArtCraft Discord ArtCraft の Discord に参加
Source code on GitHub GitHub のソースコード
Report an issue 問題を報告
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT OR Apache-2.0。フォント: Inter、Noto Serif、JetBrains Mono (SIL OFL 1.1)。
@@ -452,7 +446,6 @@
Bars and Tone カラーバーとトーン
SMPTE HD bars with 1 kHz reference tone 1 kHz 基準トーン付きの SMPTE HD カラーバー
Community コミュニティ
Join us on Discord Discord に参加
OMF Export Settings OMF 書き出し設定
AAF Export Settings AAF 書き出し設定
OMF Title: OMF タイトル:
Can't render this file because it contains an unexpected character in line 11 and column 59.
+1 -8
View File
@@ -4,7 +4,7 @@
# Brazilian Portuguese video-editing vocabulary. No proprietary localisation resource, string table
# or product UI was consulted or copied; add entries the same way. Commands use the infinitive
# ("Salvar como…"), instructions use the polite imperative ("Selecione um clipe…"), and labels use
# sentence case. Product, format and technology names (FilmCraft, ArtCraft, Lumetri, ProRes, LUFS,
# sentence case. Product, format and technology names (FilmCraft, Lumetri, ProRes, LUFS,
# EDL, AAF…) keep their spelling; decimals in prose use a comma ("29,97 fps"). This catalog has the
# same entries as `es.tsv` plus the native macOS Settings menu; strings added later show in English
# until they are translated. A native-speaker review is welcome.
@@ -44,7 +44,6 @@
Apply Default Transitions to Selection Aplicar transições padrão à seleção
Apply Video Transition Aplicar transição de vídeo
Arrange Organizar
ArtCraft Website Site do ArtCraft
Assembly Montagem
Attach Proxies… Anexar proxies…
Audio Channels… Canais de áudio…
@@ -139,7 +138,6 @@
Fill frame Preencher quadro
FilmCraft Help… Ajuda do FilmCraft…
FilmCraft on GitHub FilmCraft no GitHub
FilmCraft on getartcraft.com FilmCraft no getartcraft.com
Find Next Localizar próximo
Find… Localizar…
Fit Ajustar
@@ -183,7 +181,6 @@
Insert Frame Hold Segment Inserir segmento de quadro congelado
Install Motion Graphics Template… Instalar modelo de gráficos de movimento…
Interpret Footage… Interpretar clipes…
Join the ArtCraft Discord… Entre no Discord do ArtCraft…
Keyboard Shortcuts… Atalhos de teclado…
Label Rótulo
Labels… Rótulos…
@@ -374,7 +371,6 @@
Master volume: use the Audio Track Mixer Volume principal: use o misturador de faixas de áudio
Search Pesquisar
Quick Export Exportação rápida
Join the ArtCraft Discord (discord.gg/artcraft) Entre no Discord do ArtCraft (discord.gg/artcraft)
Cancel Cancelar
OK OK
Interpret Footage Interpretar clipes
@@ -417,8 +413,6 @@
Delete Caption Track Excluir faixa de legendas
Delete Empty Caption Tracks Excluir faixas de legendas vazias
Version {version} Versão {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. Um editor de vídeo não linear em Rust puro, desenvolvido em sala limpa. Parte da família ArtCraft.
Join the ArtCraft Discord Entre no Discord do ArtCraft
Source code on GitHub Código-fonte no GitHub
Report an issue Relatar um problema
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT OR Apache-2.0. Fontes: Inter, Noto Serif e JetBrains Mono (SIL OFL 1.1).
@@ -459,7 +453,6 @@
Bars and Tone Barras e tom
SMPTE HD bars with 1 kHz reference tone Barras SMPTE HD com tom de referência de 1 kHz
Community Comunidade
Join us on Discord Junte-se a nós no Discord
OMF Export Settings Configurações de exportação OMF
AAF Export Settings Configurações de exportação AAF
OMF Title: Título OMF:
Can't render this file because it contains an unexpected character in line 6 and column 4.
-3
View File
@@ -30,7 +30,6 @@
Apply Default Transitions to Selection Применить переходы по умолчанию к выделению
Apply Video Transition Применить видеопереход
Arrange Упорядочить
ArtCraft Website Веб-сайт ArtCraft
Assembly Сборка
Attach Proxies… Прикрепить прокси…
Audio Аудио
@@ -128,7 +127,6 @@
Fill frame Заполнить кадр
FilmCraft Help… Справка FilmCraft…
FilmCraft on GitHub FilmCraft на GitHub
FilmCraft on getartcraft.com FilmCraft на getartcraft.com
Find Next Найти далее
Find… Найти…
Fit По размеру
@@ -172,7 +170,6 @@
Insert Frame Hold Segment Вставить сегмент стоп-кадра
Install Motion Graphics Template… Установить шаблон анимированной графики…
Interpret Footage… Интерпретировать материал…
Join the ArtCraft Discord… Присоединиться к ArtCraft Discord…
Keyboard Shortcuts… Сочетания клавиш…
Label Метка
Labels… Метки…
1 # Russian (ru) catalog. Columns separated by TAB: context <TAB> source <TAB> translation
30
31
32
33
34
35
127
128
129
130
131
132
170
171
172
173
174
175
-3
View File
@@ -30,7 +30,6 @@
Apply Default Transitions to Selection Застосувати типові переходи до виділення
Apply Video Transition Застосувати відеоперехід
Arrange Упорядкувати
ArtCraft Website Вебсайт ArtCraft
Assembly Компонування
Attach Proxies… Приєднати проксі…
Audio Аудіо
@@ -128,7 +127,6 @@
Fill frame Заповнити кадр
FilmCraft Help… Довідка FilmCraft…
FilmCraft on GitHub FilmCraft на GitHub
FilmCraft on getartcraft.com FilmCraft на getartcraft.com
Find Next Знайти далі
Find… Знайти…
Fit Умістити
@@ -172,7 +170,6 @@
Insert Frame Hold Segment Вставити сегмент стоп-кадру
Install Motion Graphics Template… Установити шаблон анімаційної графіки…
Interpret Footage… Інтерпретувати матеріал…
Join the ArtCraft Discord… Приєднатися до Discord ArtCraft…
Keyboard Shortcuts… Клавіатурні скорочення…
Label Мітка
Labels… Мітки…
1 # Ukrainian (uk) catalog. Columns separated by TAB: context <TAB> source <TAB> translation
30
31
32
33
34
35
127
128
129
130
131
132
170
171
172
173
174
175
+1 -8
View File
@@ -8,7 +8,7 @@
#
# 净室实现:每条译文均由英文含义直接译出,使用通用的中文视频剪辑术语(剪辑、时间轴、序列、
# 轨道、关键帧……)。未参考或复制任何专有本地化资源、字符串表或产品界面。产品与技术名称
# (FilmCraft、ArtCraft、Lumetri、ProRes、LUFS……)保留原文拼写。
# (FilmCraft、Lumetri、ProRes、LUFS……)保留原文拼写。
About FilmCraft 关于 FilmCraft
Add Audio Submix Track 添加音频子混音轨道
Add Caption at Playhead 在播放头处添加字幕
@@ -35,7 +35,6 @@
Apply Default Transitions to Selection 对所选对象应用默认过渡
Apply Video Transition 应用视频过渡
Arrange 排列
ArtCraft Website ArtCraft 官网
Assembly 组装
Attach Proxies… 附加代理文件…
Audio Channels… 音频声道…
@@ -130,7 +129,6 @@
Fill frame 填满帧
FilmCraft Help… FilmCraft 帮助…
FilmCraft on GitHub GitHub 上的 FilmCraft
FilmCraft on getartcraft.com getartcraft.com 上的 FilmCraft
Find Next 查找下一个
Find… 查找…
Fit 适配
@@ -174,7 +172,6 @@
Insert Frame Hold Segment 插入帧定格片段
Install Motion Graphics Template… 安装动态图形模板…
Interpret Footage… 解释素材…
Join the ArtCraft Discord… 加入 ArtCraft Discord…
Keyboard Shortcuts… 键盘快捷键…
Label 标签
Labels… 标签…
@@ -365,7 +362,6 @@
Master volume: use the Audio Track Mixer 主音量:请使用音频轨道混音器调整
Search 搜索
Quick Export 快速导出
Join the ArtCraft Discord (discord.gg/artcraft) 加入 ArtCraft Discord(discord.gg/artcraft)
Cancel 取消
OK 确定
Interpret Footage 解释素材
@@ -404,8 +400,6 @@
Delete Audio Tracks 删除音频轨道
All Empty Tracks 所有空轨道
Version {version} 版本 {version}
A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family. 一款净室实现的纯 Rust 非线性视频编辑器,属于 ArtCraft 家族。
Join the ArtCraft Discord 加入 ArtCraft Discord
Source code on GitHub GitHub 上的源代码
Report an issue 报告问题
MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1). MIT 或 Apache-2.0。字体:Inter、Noto Serif 与 JetBrains Mono(SIL OFL 1.1)。
@@ -446,7 +440,6 @@
Bars and Tone 彩条与音调
SMPTE HD bars with 1 kHz reference tone 带 1 kHz 参考音调的 SMPTE HD 彩条
Community 社区
Join us on Discord 在 Discord 上加入我们
OMF Export Settings OMF 导出设置
AAF Export Settings AAF 导出设置
OMF Title: OMF 标题:
Can't render this file because it contains an unexpected character in line 3 and column 95.
+1 -2
View File
@@ -83,8 +83,7 @@ pub enum Icon {
Undo,
Redo,
Bell,
/// Community chat (the ArtCraft Discord): a speech bubble with three dots. Our own drawing,
/// not the Discord logo.
/// Community chat: a speech bubble with three dots.
Chat,
/// Website: a globe.
Globe,
+1 -2
View File
@@ -30,7 +30,6 @@ macro_rules! tlf {
}
pub mod automation;
pub mod brand;
pub mod calc;
mod cjk;
pub mod control;
@@ -159,7 +158,7 @@ pub struct HostHooks {
/// running while the dialog is open (the desktop app on Linux, #260); without it the
/// synchronous pickers above are used.
pub run_dialog: Option<Box<dyn FnMut(native_dialogs::FileDialog) -> Receiver<Vec<String>>>>,
/// Open a URL in the system browser (Help menu links, About dialog, Discord button, Import
/// Open a URL in the system browser (Help menu links, About dialog, Import
/// screen). Without it, or when it fails, links go through `egui::Context::open_url`, which
/// opens a new tab on the web (the native egui backend is built without its `links` feature).
pub open_url: Option<Box<dyn FnMut(&str) -> Result<(), String>>>,
+8 -24
View File
@@ -1,30 +1,15 @@
//! Community and project links (Help menu, About dialog, header Discord button, Home screen).
//!
//! FilmCraft is part of the ArtCraft family: the community lives on the ArtCraft Discord, every
//! app has a page on the ArtCraft website and a public GitHub repository.
//! Project links (Help menu, About dialog, Home screen).
/// The app's short name, used in the website and repository URLs.
/// The app's short name, used in the repository URLs.
pub const APP: &str = "filmcraft";
/// The ArtCraft community Discord.
pub const DISCORD: &str = "https://discord.gg/artcraft";
/// The ArtCraft website.
pub const WEBSITE: &str = "https://getartcraft.com";
/// FilmCraft's page on the ArtCraft website.
pub const APP_PAGE: &str = "https://getartcraft.com/apps/filmcraft";
/// FilmCraft's source repository.
pub const GITHUB: &str = "https://github.com/storytold/filmcraft";
/// New issue on FilmCraft's repository.
pub const ISSUES: &str = "https://github.com/storytold/filmcraft/issues";
/// (command id, label, url) for every link, in menu order.
pub const ALL: [(&str, &str, &str); 5] = [
("help.discord", "Join the ArtCraft Discord…", DISCORD),
("help.website", "ArtCraft Website", WEBSITE),
("help.appPage", "FilmCraft on getartcraft.com", APP_PAGE),
("help.github", "FilmCraft on GitHub", GITHUB),
("help.reportIssue", "Report an Issue…", ISSUES),
];
pub const ALL: [(&str, &str, &str); 2] = [("help.github", "FilmCraft on GitHub", GITHUB), ("help.reportIssue", "Report an Issue…", ISSUES)];
/// The URL a `help.*` link command opens.
pub fn url_for(command: &str) -> Option<&'static str> {
@@ -50,17 +35,16 @@ mod tests {
use super::*;
#[test]
fn urls_follow_the_artcraft_scheme() {
assert_eq!(APP_PAGE, format!("{WEBSITE}/apps/{APP}"));
fn urls_follow_the_repo_scheme() {
assert_eq!(GITHUB, format!("https://github.com/storytold/{APP}"));
assert!(ALL.iter().all(|(id, _, u)| id.starts_with("help.") && u.starts_with("https://")));
assert_eq!(url_for("help.discord"), Some(DISCORD));
assert_eq!(url_for("help.github"), Some(GITHUB));
assert_eq!(url_for("help.nope"), None);
}
#[test]
fn links_open_through_the_host_hook() {
// #642: on the desktop every link (Help menu, About, Discord button, Import screen) must
// #642: on the desktop every link (Help menu, About, Import screen) must
// reach the host's browser opener; `ctx.open_url` alone is a no-op natively.
use std::cell::RefCell;
use std::rc::Rc;
@@ -77,8 +61,8 @@ mod tests {
assert_eq!(r["url"], url, "{id}");
assert_eq!(opened.borrow().last().map(String::as_str), Some(url), "{id}");
}
open(&mut app, &ctx, DISCORD);
assert_eq!(opened.borrow().last().map(String::as_str), Some(DISCORD));
open(&mut app, &ctx, GITHUB);
assert_eq!(opened.borrow().last().map(String::as_str), Some(GITHUB));
assert_eq!(opened.borrow().len(), ALL.len() + 1);
// A failing opener falls back to `ctx.open_url` instead of losing the click.
-3
View File
@@ -134,9 +134,6 @@ pub const UI_COMMANDS: &[UiCommand] = &[
uic!("mode.import", "Import", [], None),
uic!("mode.edit", "Edit", [], None),
uic!("mode.export", "Export", ["File", "Export"], Some("Cmd+M")),
uic!("help.discord", "Join the ArtCraft Discord…", ["Help"], None),
uic!("help.website", "ArtCraft Website", ["Help"], None),
uic!("help.appPage", "FilmCraft on getartcraft.com", ["Help"], None),
uic!("help.github", "FilmCraft on GitHub", ["Help"], None),
uic!("help.reportIssue", "Report an Issue…", ["Help"], None),
uic!("help.revealLogFiles", "Reveal Log Files…", ["Help"], None),
+11 -33
View File
@@ -408,7 +408,7 @@ fn delete_tracks(app: &mut FilmcraftApp, ctx: &egui::Context) -> bool {
keep
}
/// Help ▸ About FilmCraft, in three tabs: About (version and the ArtCraft community links),
/// Help ▸ About FilmCraft, in three tabs: About (version and the project links),
/// Contributors and Models (the credits compiled in from `contributors/contributors.json`, see
/// `crate::credits` and docs/contributors.md).
///
@@ -443,57 +443,35 @@ fn about(app: &mut FilmcraftApp, ui: &mut egui::Ui) {
}
}
/// About ▸ About: version, licence and the ArtCraft community links. Joining the Discord is the
/// first, accented button.
/// About ▸ About: version, licence and the project links.
///
/// Automation ids: `about.discord`, `about.website`, `about.appPage`, `about.github`,
/// `about.reportIssue`.
/// Automation ids: `about.github`, `about.reportIssue`.
fn about_tab(app: &mut FilmcraftApp, ui: &mut egui::Ui) {
use crate::icons::{self, Icon};
use crate::links;
let t = app.tokens;
ui.set_width(380.0);
// ArtCraft wordmark (first-party trademark, docs/brand/).
let (r, _) = ui.allocate_exact_size(egui::vec2(ui.available_width(), 30.0), egui::Sense::hover());
crate::brand::paint_wordmark(ui, egui::pos2(r.min.x, r.center().y), 20.0, app.ui.dark);
ui.add_space(6.0);
ui.heading("FilmCraft");
ui.label(tlf!("Version {version}", version = env!("CARGO_PKG_VERSION")));
ui.label(tl!("A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family."));
ui.label(tl!("A clean-room, pure-Rust non-linear video editor."));
ui.add_space(10.0);
let mut link = |ui: &mut egui::Ui, id: &str, icon: Icon, label: &str, url: &str, primary: bool| {
let size = egui::vec2(ui.available_width(), if primary { 36.0 } else { 28.0 });
let mut link = |ui: &mut egui::Ui, id: &str, icon: Icon, label: &str, url: &str| {
let size = egui::vec2(ui.available_width(), 28.0);
let (r, resp) = ui.allocate_exact_size(size, egui::Sense::click());
let resp = resp.on_hover_text(url);
app.auto.add(&format!("about.{id}"), r, label);
let bg = if primary {
if resp.hovered() { t.accent_hover } else { t.accent }
} else if resp.hovered() {
t.hover
} else {
egui::Color32::TRANSPARENT
};
let bg = if resp.hovered() { t.hover } else { egui::Color32::TRANSPARENT };
ui.painter().rect_filled(r, 6.0, bg);
let fg = if primary { egui::Color32::WHITE } else { t.text };
let fg = t.text;
let ir = egui::Rect::from_center_size(egui::pos2(r.min.x + 20.0, r.center().y), egui::vec2(18.0, 18.0));
icons::paint(ui.painter(), ir, icon, fg);
ui.painter().text(
egui::pos2(r.min.x + 40.0, r.center().y),
egui::Align2::LEFT_CENTER,
label,
crate::theme::Tokens::ui(if primary { 14.0 } else { 13.0 }),
fg,
);
ui.painter().text(egui::pos2(r.min.x + 40.0, r.center().y), egui::Align2::LEFT_CENTER, label, crate::theme::Tokens::ui(13.0), fg);
if resp.clicked() {
links::open(app, ui.ctx(), url);
}
};
link(ui, "discord", Icon::Chat, tl!("Join the ArtCraft Discord"), links::DISCORD, true);
ui.add_space(6.0);
link(ui, "website", Icon::Globe, "getartcraft.com", links::WEBSITE, false);
link(ui, "appPage", Icon::Globe, tl!("FilmCraft on getartcraft.com"), links::APP_PAGE, false);
link(ui, "github", Icon::Code, tl!("Source code on GitHub"), links::GITHUB, false);
link(ui, "reportIssue", Icon::Code, tl!("Report an issue"), links::ISSUES, false);
link(ui, "github", Icon::Code, tl!("Source code on GitHub"), links::GITHUB);
link(ui, "reportIssue", Icon::Code, tl!("Report an issue"), links::ISSUES);
ui.add_space(10.0);
ui.label(egui::RichText::new(tl!("MIT OR Apache-2.0. Fonts: Inter, Noto Serif and JetBrains Mono (SIL OFL 1.1).")).small().color(t.text_dim));
}
+5 -14
View File
@@ -45,26 +45,17 @@ pub fn show(app: &mut FilmcraftApp, ui: &mut egui::Ui, rect: Rect) {
}
// Community and project links.
let y = 90.0 + 150.0 + 36.0;
// ArtCraft wordmark (first-party trademark, docs/brand/), then the section title.
let logo = crate::brand::paint_wordmark(ui, rect.min + vec2(24.0, y), 15.0, app.ui.dark);
let tx = logo.map_or(rect.min.x + 24.0, |r| r.max.x + 12.0);
ui.painter().text(pos2(tx, rect.min.y + y), Align2::LEFT_CENTER, tl!("Community"), Tokens::semibold(15.0), t.text);
ui.painter().text(pos2(rect.min.x + 24.0, rect.min.y + y), Align2::LEFT_CENTER, tl!("Community"), Tokens::semibold(15.0), t.text);
let mut x = rect.min.x + 24.0;
for (i, (id, label, url)) in crate::links::ALL.iter().take(4).enumerate() {
let primary = i == 0;
let label = if primary { tl!("Join us on Discord") } else { crate::i18n::t(label) };
for (id, label, url) in crate::links::ALL.iter() {
let label = crate::i18n::t(label);
let g = ui.painter().layout_no_wrap(label.to_string(), Tokens::ui(13.0), t.text);
let r = Rect::from_min_size(pos2(x, rect.min.y + y + 18.0), vec2(g.size().x + 44.0, 34.0));
let resp = ui.interact(r, egui::Id::new(("imp-link", *id)), Sense::click()).on_hover_text(*url);
app.auto.add(&format!("import.link.{}", id.trim_start_matches("help.")), r, label);
let (bg, fg) = if primary {
(if resp.hovered() { t.accent_hover } else { t.accent }, Color32::WHITE)
} else {
(if resp.hovered() { t.hover } else { t.tl_header_bg }, t.text)
};
let (bg, fg) = (if resp.hovered() { t.hover } else { t.tl_header_bg }, t.text);
ui.painter().rect_filled(r, 8.0, bg);
let icon = [crate::icons::Icon::Chat, crate::icons::Icon::Globe, crate::icons::Icon::Globe, crate::icons::Icon::Code][i];
crate::icons::paint(ui.painter(), Rect::from_center_size(pos2(r.min.x + 20.0, r.center().y), vec2(16.0, 16.0)), icon, fg);
crate::icons::paint(ui.painter(), Rect::from_center_size(pos2(r.min.x + 20.0, r.center().y), vec2(16.0, 16.0)), crate::icons::Icon::Code, fg);
ui.painter().galley(pos2(r.min.x + 34.0, r.center().y - g.size().y / 2.0), g, fg);
if resp.clicked() {
crate::links::open(app, &ctx, url);
+1 -1
View File
@@ -633,7 +633,7 @@ mod tests {
ctx.run_ui(egui::RawInput::default(), |_| {}).textures_delta.clear();
}
/// Typed, pasted or IME-composed Hangul draws real glyphs, not the missing-glyph box (artcraft#2093).
/// Typed, pasted or IME-composed Hangul draws real glyphs, not the missing-glyph box (#2093).
#[test]
fn korean_text_renders_with_an_installed_korean_font() {
const KOREAN: &str = "한국어 입력 테스트";
+4 -8
View File
@@ -1,5 +1,4 @@
//! Headless UI test of the community links: Help menu commands, the header Discord button, the
//! About dialog and the Home (Import) screen.
//! Headless UI test of the community links: Help menu commands, the About dialog and the Home (Import) screen.
//!
//! Set `FILMCRAFT_UI_SNAPSHOT_DIR=<dir>` to also render the window offscreen with wgpu and write
//! `links-*.png` there; without it no GPU is needed.
@@ -90,14 +89,11 @@ fn community_links_everywhere() {
for (id, label, _) in links::ALL {
assert!(text.contains(id) && text.contains(label), "Help menu lists {id}");
}
// Header: the Discord button is always there.
assert_eq!(d.ids("header.discord"), vec!["header.discord".to_string()]);
d.snapshot("header");
// About dialog: Discord first, then website, app page, GitHub, issues.
// About dialog: GitHub, issues.
d.ok("engine.execute", json!({"command": "app.about", "params": {}}));
d.frames(3);
let about = d.ids("about.");
for id in ["about.discord", "about.website", "about.appPage", "about.github", "about.reportIssue"] {
for id in ["about.github", "about.reportIssue"] {
assert!(about.iter().any(|a| a == id), "{id} in {about:?}");
}
d.snapshot("about");
@@ -108,7 +104,7 @@ fn community_links_everywhere() {
d.ok("engine.execute", json!({"command": "mode.import", "params": {}}));
d.frames(3);
let home = d.ids("import.link.");
for id in ["import.link.discord", "import.link.website", "import.link.appPage", "import.link.github"] {
for id in ["import.link.github", "import.link.reportIssue"] {
assert!(home.iter().any(|a| a == id), "{id} in {home:?}");
}
d.snapshot("home");
-42
View File
@@ -1,42 +0,0 @@
ArtCraft brand assets: license
The ArtCraft name, wordmark and mark (the "ArtCraft Marks"), including every file in this
directory in every color, size and format, are owned by the ArtCraft Team. They are trademarks
and are NOT open source. They are not covered by FilmCraft's MIT OR Apache-2.0 license, and nothing in
that license, in NOTICE or in any other file of this repository grants any right to them.
Permission
The ArtCraft Team grants a limited, non-exclusive, non-transferable, revocable, royalty-free
permission to use the ArtCraft Marks only:
1. as part of copies of this repository; and
2. within FilmCraft itself, its documentation and its official builds, to identify FilmCraft as made
by the ArtCraft team and community and to link to getartcraft.com and its community.
Conditions
The permission holds only while every one of these is true:
- The marks are used exactly as supplied in this directory. Do not redraw, recolor, crop,
stretch, rotate, animate, outline or add effects to them, extract parts of them, or combine
them with any other name, mark or artwork.
- They are used only in the context of FilmCraft, and only to say that the ArtCraft team makes it.
They must never suggest that the ArtCraft Team made, sponsors, endorses, certifies or supports
any other product, service, fork, modified version, plug-in, organization or person.
- Neither the marks nor the ArtCraft name appear in the name, logo, icon, domain, social media
handle, app-store listing, advertising or marketing of anything other than FilmCraft.
Forks and modified versions
If you distribute or publish a modified version of FilmCraft, or any work derived from it, you must
remove the ArtCraft Marks from it (or replace them with your own) and must not call it ArtCraft or
present it as an ArtCraft product. You may say, in plain text, that your work is based on FilmCraft by
the ArtCraft team. A fork kept only to propose changes back to this repository may keep the marks
unchanged.
Everything else
Any use not expressly permitted here needs prior written permission from the ArtCraft Team
(https://getartcraft.com/). The permission ends automatically for anyone who breaks these terms.
All other rights are reserved.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

@@ -1,8 +0,0 @@
asset: artcraft-logo-white.png
title: ArtCraft wordmark, light ink for dark backgrounds
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: 3200x333 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

@@ -1,8 +0,0 @@
asset: artcraft-logo-white.svg
title: ArtCraft wordmark, light ink for dark backgrounds
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

-8
View File
@@ -1,8 +0,0 @@
asset: artcraft-logo.png
title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: 3200x333 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

-8
View File
@@ -1,8 +0,0 @@
asset: artcraft-logo.svg
title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

@@ -1,8 +0,0 @@
asset: artcraft-mark-black.png
title: ArtCraft symbol ("A" mark), black
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: 1024x1024 PNG. Kept for brand use (README, docs). First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
-4
View File
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
<title>ArtCraft</title>
<path fill="#0b0b0c" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 341 B

@@ -1,8 +0,0 @@
asset: artcraft-mark-black.svg
title: ArtCraft symbol ("A" mark), black
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: SVG. Kept for brand use (README, docs). First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

-8
View File
@@ -1,8 +0,0 @@
asset: artcraft-mark.png
title: ArtCraft symbol ("A" mark), blue
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: 1024x1024 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
-4
View File
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
<title>ArtCraft</title>
<path fill="#4e7bfb" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 341 B

-8
View File
@@ -1,8 +0,0 @@
asset: artcraft-mark.svg
title: ArtCraft symbol ("A" mark), blue
author: ArtCraft Team
source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team)
license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source; usable only unmodified and only in the context of FilmCraft, under docs/brand/LICENSE-brand.txt. Not covered by the project's MIT OR Apache-2.0 license.
license-file: docs/brand/LICENSE-brand.txt
added: 2026-10-01 by Claude (agent) for Brandon Thomas
notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt).
@@ -18,10 +18,10 @@
<launchable type="desktop-id">ai.storyteller.filmcraft.desktop</launchable>
<icon type="stock">ai.storyteller.filmcraft</icon>
<!-- Only url types known to appstream 0.15 (Ubuntu 22.04, where CI validates): no vcs-browser. -->
<url type="homepage">https://getartcraft.com/apps/filmcraft</url>
<url type="homepage">https://github.com/storytold/filmcraft</url>
<url type="bugtracker">https://github.com/storytold/filmcraft/issues</url>
<url type="help">https://github.com/storytold/filmcraft</url>
<url type="contact">https://discord.gg/artcraft</url>
<url type="contact">https://github.com/storytold/filmcraft/issues</url>
<categories>
<category>AudioVideo</category>
<category>Video</category>
+1 -1
View File
@@ -14,7 +14,7 @@ section: video
priority: optional
maintainer: ${FILMCRAFT_MAINTAINER}
vendor: Learning Machines LLC
homepage: https://getartcraft.com/apps/filmcraft
homepage: https://github.com/storytold/filmcraft
license: MIT OR Apache-2.0
description: |-
Open-source, native video editor: edit video, color and sound.
+3 -3
View File
@@ -24,9 +24,9 @@
<Icon Id="FilmcraftIcon.ico" SourceFile="$(var.IconPath)" />
<Property Id="ARPPRODUCTICON" Value="FilmcraftIcon.ico" />
<Property Id="ARPURLINFOABOUT" Value="https://getartcraft.com/apps/filmcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://getartcraft.com/apps/filmcraft" />
<Property Id="ARPHELPLINK" Value="https://discord.gg/artcraft" />
<Property Id="ARPURLINFOABOUT" Value="https://github.com/storytold/filmcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://github.com/storytold/filmcraft" />
<Property Id="ARPHELPLINK" Value="https://github.com/storytold/filmcraft/issues" />
<StandardDirectory Id="ProgramFiles6432Folder">
<Directory Id="INSTALLFOLDER" Name="FilmCraft" />
+27 -1
View File
@@ -6,6 +6,7 @@
Produces, in $env:DIST (default: dist/release):
filmcraft-<version>-windows-<arch>.msi per-machine installer (WiX v5)
filmcraft-<version>-windows-<arch>-portable.zip filmcraft.exe + filmcraft-cli.exe + portable.txt
filmcraft-cli-<version>-windows-<arch>.zip filmcraft-cli.exe standalone
The binaries link the C runtime statically (+crt-static), so neither the MSI nor the portable
zip needs the Visual C++ redistributable. Signing is delegated to sign.ps1 (skipped with a
@@ -25,6 +26,7 @@ param(
)
$ErrorActionPreference = 'Stop'
$Root = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path
Set-Location $Root
function Invoke-Native([string] $What, [scriptblock] $Block) {
Write-Output "==> $What"
@@ -56,6 +58,17 @@ if (-not $env:FILMCRAFT_BUILD_DATE) { $env:FILMCRAFT_BUILD_DATE = (Get-Date).ToU
Write-Output "FilmCraft $Version for Windows $Arch ($Target)"
if (-not $SkipBuild) {
# Locate rc.exe if not in PATH
if (-not (Get-Command rc.exe -ErrorAction SilentlyContinue)) {
$kits = Join-Path ${env:ProgramFiles(x86)} 'Windows Kits\10\bin'
$foundRc = Get-ChildItem -Path $kits -Recurse -Filter rc.exe -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '\\x64\\rc\.exe$' } |
Sort-Object FullName -Descending | Select-Object -First 1
if ($foundRc) {
$env:PATH = "$($foundRc.DirectoryName);$env:PATH"
}
}
# Static CRT: no VC++ redistributable needed. Scoped to the target so host build scripts and
# proc-macros are unaffected.
$flagVar = 'CARGO_TARGET_' + ($Target.ToUpper() -replace '-', '_') + '_RUSTFLAGS'
@@ -125,6 +138,19 @@ $Zip = Join-Path $Dist "filmcraft-$Version-windows-$Arch-portable.zip"
Remove-Item -Force $Zip -ErrorAction SilentlyContinue
Compress-Archive -Path $Portable -DestinationPath $Zip
# ---- cli zip -----------------------------------------------------------------------------------
$CliPortable = Join-Path $TargetDir "windows-package\filmcraft-cli-$Version-windows-$Arch"
Remove-Item -Recurse -Force $CliPortable -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force -Path $CliPortable | Out-Null
Copy-Item (Join-Path $Stage 'filmcraft-cli.exe') $CliPortable
foreach ($f in 'README.md', 'LICENSE', 'LICENSE-MIT', 'LICENSE-APACHE') {
$p = Join-Path $Root $f
if (Test-Path $p) { Copy-Item $p $CliPortable }
}
$CliZip = Join-Path $Dist "filmcraft-cli-$Version-windows-$Arch.zip"
Remove-Item -Force $CliZip -ErrorAction SilentlyContinue
Compress-Archive -Path $CliPortable -DestinationPath $CliZip
# Smoke-test the CLI when this machine can run it. An ARM64 build made on an x64 runner can't run
# here; .github/workflows/windows-arm64.yml installs and runs it on ARM64 instead.
$HostArch = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString().ToLowerInvariant()
@@ -133,4 +159,4 @@ if ($Arch -ne 'arm64' -or $HostArch -eq 'arm64') {
} else {
Write-Output "skipping filmcraft-cli --version: an $Arch build doesn't run on this $HostArch machine"
}
Get-Item $Msi, $Zip | Format-Table Name, Length
Get-Item $Msi, $Zip, $CliZip | Format-Table Name, Length
Submodule tools/craft-skills added at 2c1fed9237