Compare commits

...
Author SHA1 Message Date
bflatasticandClaude Opus 5.5 fbabbcf623 Update the LoopCraft icon and app colour
The vectorised woodpecker tile and the softer yellow #f0d824, with the
light and dark ink colours re-derived from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:53:20 +07:00
bflatasticandClaude Opus 5.5 cd93e2aacf Place LoopCraft after FigCraft in the lineup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:49:50 +07:00
bflatasticandClaude Opus 5.5 f72fedd0a1 Add LoopCraft to the Crafting Apps pages
LoopCraft (beat making and music production) joins the lineup as the
14th app with its own /apps/loopcraft page: icon and screenshots from
storytold/loopcraft, and no release yet, so the page shows the Discord
waitlist and build-from-source instead of installers.

Its screenshots are 16:9, so gallery shots can be marked `wide`. An app
with no release no longer offers the launcher download in its hero.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:46:01 +07:00
12 changed files with 84 additions and 4 deletions

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

@@ -85,9 +85,10 @@ export default async function CraftAppPage({ params }: { params: Params }) {
const release = craftAppRelease(app);
// The hero's download is ArtCraft Launcher, which installs this app and keeps
// it updated; the app's own installers are in #get-it, under the launcher.
const launcherDownloads = craftLauncherRecommended();
// An app with no release yet has nothing for the launcher to install.
const launcherDownloads = release ? craftLauncherRecommended() : [];
const allLauncherDownloads = craftLauncherDownloads();
const hasDownload = launcherDownloads.length > 0 || release !== null;
const hasDownload = release !== null;
const [hero] = app.shots;
const [before, accent, after] = app.headline;
const shareUrl = siteUrl(craftAppPath(app));
@@ -45,7 +45,7 @@ import { siteUrl } from "@/lib/links";
const TITLE = "Crafting Apps: open-source creative tools";
const COVERAGE =
"Image editing, vector illustration, video, photography, PDFs, motion graphics, page layout, interface design, word processing, audio, presentations, CAD and spreadsheets";
"Image editing, vector illustration, video, photography, PDFs, motion graphics, page layout, interface design, beat making, word processing, audio, presentations, CAD and spreadsheets";
const DESCRIPTION = `${COVERAGE}: ${CRAFTING_APPS_COUNT_WORD.toLowerCase()} native, open-source apps from the ArtCraft team, built in Rust and free to use.`;
export const metadata: Metadata = {
@@ -325,6 +325,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
.app-effectcraft { --app: #e0368f; --app-ink: #b0206c; }
.app-designcraft { --app: #7bb51c; --app-ink: #457008; }
.app-figcraft { --app: #02da96; --app-ink: #017a54; }
.app-loopcraft { --app: #f0d824; --app-ink: #6f6300; }
.app-wordcraft { --app: #4c6ef5; --app-ink: #253e99; }
.app-soundcraft { --app: #14a9c4; --app-ink: #0b6f82; }
.app-deckcraft { --app: #f26b1d; --app-ink: #ad4306; }
@@ -338,6 +339,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
:root[data-theme="dark"] .app-effectcraft { --app-ink: #ff7ab8; }
:root[data-theme="dark"] .app-designcraft { --app-ink: #a6e04a; }
:root[data-theme="dark"] .app-figcraft { --app-ink: #3fe6ae; }
:root[data-theme="dark"] .app-loopcraft { --app-ink: #f5e04f; }
:root[data-theme="dark"] .app-wordcraft { --app-ink: #8da2fb; }
:root[data-theme="dark"] .app-soundcraft { --app-ink: #52d1ea; }
:root[data-theme="dark"] .app-deckcraft { --app-ink: #ff9657; }
@@ -352,6 +354,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
:root:not([data-theme="light"]) .app-effectcraft { --app-ink: #ff7ab8; }
:root:not([data-theme="light"]) .app-designcraft { --app-ink: #a6e04a; }
:root:not([data-theme="light"]) .app-figcraft { --app-ink: #3fe6ae; }
:root:not([data-theme="light"]) .app-loopcraft { --app-ink: #f5e04f; }
:root:not([data-theme="light"]) .app-wordcraft { --app-ink: #8da2fb; }
:root:not([data-theme="light"]) .app-soundcraft { --app-ink: #52d1ea; }
:root:not([data-theme="light"]) .app-deckcraft { --app-ink: #ff9657; }
@@ -114,7 +114,11 @@ export function AppGallery({ app, index }: { app: CraftApp; index: string }) {
rel="noopener noreferrer"
className={twMerge(
"group relative block overflow-hidden bg-bg-sunken",
shot.portrait ? "aspect-[7/9]" : "aspect-[16/10]",
shot.portrait
? "aspect-[7/9]"
: shot.wide
? "aspect-video"
: "aspect-[16/10]",
)}
>
{/* eslint-disable-next-line @next/next/no-img-element */}
@@ -222,6 +222,7 @@ export const CRAFT_APP_RELEASES: Record<CraftAppSlug, CraftRelease | null> = {
effectcraft: craftRelease("0.8.0"),
designcraft: craftRelease("0.6.0"),
figcraft: craftRelease("0.5.1"),
loopcraft: null,
wordcraft: craftRelease("0.5.0"),
soundcraft: craftRelease("0.5.0"),
deckcraft: craftRelease("0.5.0"),
@@ -30,6 +30,7 @@ export type CraftAppSlug =
| "effectcraft"
| "designcraft"
| "figcraft"
| "loopcraft"
| "wordcraft"
| "soundcraft"
| "deckcraft"
@@ -47,6 +48,8 @@ export type CraftShot = {
alt: string;
/** Portrait page (7:9) rather than a 16:10 window capture. */
portrait?: boolean;
/** 16:9 window capture rather than 16:10. */
wide?: boolean;
};
/** A feature clip with its own section under the hero. */
@@ -646,6 +649,74 @@ export const CRAFTING_APPS: CraftApp[] = [
caption: "A host and a guest editing one file",
},
},
{
slug: "loopcraft",
prefix: "Loop",
category: "Beat making & music production",
status: "Early alpha",
headline: ["Beats, patterns and ", "songs", ", in pure Rust."],
pitch: "An open-source beat maker and music production studio, built in pure Rust.",
lede: "A pattern-based music workstation: a step sequencer and piano roll for writing parts, a playlist for arranging them, and a mixer with effects for finishing them. Native, open source, and drivable end to end by AI agents.",
schemaCategory: "MultimediaApplication",
platforms: ["macOS", "Windows", "Linux"],
rustVersion: "1.95",
features: [
{
title: "Step sequencer",
body: "Program drums in the channel rack, up to four bars a row, with swing, step fills and a graph editor for each step's velocity, pan, pitch and shift.",
},
{
title: "A deep piano roll",
body: "Draw, paint and slice notes, stamp chords and scale runs, then quantise, strum, arpeggiate or humanise them, with slide notes and ghost notes from other channels.",
},
{
title: "Arrange in the playlist",
body: "Place patterns and audio clips on tracks, resize, slice and duplicate them, drop time markers, and draw automation for any knob, fader or the tempo.",
},
{
title: "Instruments and effects",
body: "Twelve instruments, from a sampler and synths to drum machines and a slicer, and twenty-four effects, each with factory presets. The drum sounds are synthesised, not sampled.",
},
{
title: "Record and mix",
body: "Play parts in from a MIDI or computer keyboard, record audio takes, and mix on a master and twenty insert tracks with sends and sidechain compression.",
},
{
title: "Agent-ready",
body: "Every action is a command with an id, so a command-line tool, an MCP server and a control channel can write, arrange and export a track end to end.",
},
],
shots: [
{
file: "hero.webp",
source: "loopcraft-hero.png",
caption: "First Light — channel rack, mixer and playlist",
alt: "LoopCraft with its demo song open: the browser on the left, the channel rack with its step sequencer, the mixer with an effect rack, and the playlist with coloured pattern clips",
wide: true,
},
{
file: "light.webp",
source: "light-theme.png",
caption: "Light theme",
alt: "LoopCraft in its light theme: the same windows on white panels with a dark application bar",
wide: true,
},
{
file: "piano-roll.webp",
source: "piano-roll.png",
caption: "Piano roll with a velocity lane",
alt: "LoopCraft's piano roll showing a melody as green notes on a grid beside a piano keyboard, with a velocity lane underneath",
wide: true,
},
{
file: "instruments.webp",
source: "instrument-and-mixer.png",
caption: "Instrument editor over the playlist and mixer",
alt: "LoopCraft's three-oscillator instrument editor, a grid of knobs for the oscillators, an envelope and a filter, floating over the playlist and mixer",
wide: true,
},
],
},
{
slug: "wordcraft",
prefix: "Word",