Fennecpaw

3d artist, roblox developer

current projects are Wolf Story and Dragon Story

const robloxUserId = "16661025"; function formatSocialNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateRobloxProfile() { try { const userResponse = await fetch( `https://users.roproxy.com/v1/users/${robloxUserId}` ); const user = await userResponse.json(); const avatarResponse = await fetch( `https://thumbnails.roproxy.com/v1/users/avatar-headshot?userIds=${robloxUserId}&size=420x420&format=Png&isCircular=false` ); const avatarResult = await avatarResponse.json(); const followersResponse = await fetch( `https://friends.roproxy.com/v1/users/${robloxUserId}/followers/count` ); const followersResult = await followersResponse.json(); document.getElementById( "roblox-display-name" ).textContent = user.displayName || "Fennecpaw"; document.getElementById( "roblox-username" ).textContent = `@${user.name}`; document.getElementById( "roblox-followers" ).textContent = formatSocialNumber( followersResult.count ); document.getElementById( "roblox-profile-avatar" ).src = avatarResult.data[0].imageUrl; } catch (error) { document.getElementById( "roblox-username" ).textContent = "@Fennecpaw"; document.getElementById( "roblox-followers" ).textContent = "View"; } } updateRobloxProfile();

(icon by @wallabytea)

Fennecpaw

she/her

Background

Hi! I’m Brooke, better known online as Fennecpaw. I’m a 23-year-old Roblox developer and 3D artist based in Ontario, Canada. I hold a BSc (Honours) in Animal Biology and currently work part-time at a humane society while creating Roblox experiences and 3D artwork. As you can probably tell, animals are a huge part of both my professional and creative life!

Developer Experience

I began my 3D modelling journey on Roblox in 2017, starting as a developer for Wolves’ Life 2 before going on to create Sundown Island and Felandia. Having been on Roblox for more than half of my life, the platform has played an enormous role in developing my skills and shaping my creative career.I joined the Roblox UGC Program on March 23, 2020, and have attended the Roblox Developers Conference since 2019. I previously co-owned the development studio Wandering Spirit, which has since transitioned into our new studio, Star Glow Studios. There, we continue to create imaginative experiences inspired primarily by animals and fantasy.

Fun Facts

- My favourite animals are fennec foxes (second are cats, of course)!
- My favourite games are Ark: Survival Evolved and World of Warcraft!
- I hope to someday work on Roblox full-time!

Programs Used

- Blender
- Substance Painter
- Adobe Photoshop
- Adobe Illustrator
- Adobe Procreate

Portfolio

Wolf (~13k tris, 2026)


Rabbit (~3k tris, 2026)


Fluffkin (~13k tris, 2023)


Wolf (~14k tris, 2023)



Critters (Roblox Avatar Bodies, 2023)


Manacat (Roblox Avatar Bodies, 2023)


Pokemon-styled Creatures (2022)


UGC Catalog (2020 to now)

Environment Examples

Animation Examples (more in future)

Vector/UI (more in future)

Games I Made

My portfolio is still a work in progress, so the best way to experience much of my work is by exploring the games I have helped create over the years. Across these projects, I served as a creative lead and contributed to environment and map design, 3D modelling, animation, accessories, UI elements, logos, etc.I also contributed to several games during 2017–2018, but I consider much of that work too outdated to represent my current abilities. These earlier projects can still be found through the Wandering Spirit Roblox group.My newest project, Wolf Story, serves as the primary showcase of my portfolio and best represents my current artistic direction, technical abilities, and experience as a Roblox developer.

Wolf Story game icon const placeId = "115660240004711"; function formatNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateWolfStoryCard() { try { const universeResponse = await fetch( `https://apis.roproxy.com/universes/v1/places/${placeId}/universe` ); const universe = await universeResponse.json(); const gameResponse = await fetch( `https://games.roproxy.com/v1/games?universeIds=${universe.universeId}` ); const gameResult = await gameResponse.json(); const game = gameResult.data[0]; const iconResponse = await fetch( `https://thumbnails.roproxy.com/v1/games/icons?universeIds=${universe.universeId}&size=512x512&format=Png&isCircular=false` ); const iconResult = await iconResponse.json(); document.getElementById("wolf-story-name").textContent = game.name; document.getElementById("wolf-story-creator").textContent = `By ${game.creator.name}`; document.getElementById("wolf-story-players").textContent = formatNumber(game.playing); document.getElementById("wolf-story-visits").textContent = formatNumber(game.visits); document.getElementById("wolf-story-icon").src = iconResult.data[0].imageUrl; } catch (error) { document.getElementById("wolf-story-creator").textContent = "Click to view Wolf Story on Roblox"; } } updateWolfStoryCard(); setInterval(updateWolfStoryCard, 60000);
Felandia game icon

Felandia: Cat Roleplay

Loading game information...

🟢 playing👁️ visits
Play on Roblox
{ const felandiaPlaceId = "8309651430"; function formatFelandiaNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateFelandiaCard() { try { const universeResponse = await fetch( `https://apis.roproxy.com/universes/v1/places/${felandiaPlaceId}/universe` ); const universe = await universeResponse.json(); const gameResponse = await fetch( `https://games.roproxy.com/v1/games?universeIds=${universe.universeId}` ); const gameResult = await gameResponse.json(); const game = gameResult.data[0]; const iconResponse = await fetch( `https://thumbnails.roproxy.com/v1/games/icons?universeIds=${universe.universeId}&size=512x512&format=Png&isCircular=false` ); const iconResult = await iconResponse.json(); document.getElementById("felandia-name").textContent = game.name; document.getElementById("felandia-creator").textContent = `Previous project • By ${game.creator.name}`; document.getElementById("felandia-players").textContent = formatFelandiaNumber(game.playing); document.getElementById("felandia-visits").textContent = formatFelandiaNumber(game.visits); document.getElementById("felandia-icon").src = iconResult.data[0].imageUrl; } catch(error) { document.getElementById("felandia-creator").textContent = "Previous Roblox project"; } } updateFelandiaCard(); setInterval(updateFelandiaCard,60000); }
Forest Tails game icon

Forest Tails

Loading game information...

🟢 playing👁️ visits
Play on Roblox
{ const forestTailsPlaceId = "5561060005"; function formatForestTailsNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateForestTailsCard() { try { const universeResponse = await fetch( `https://apis.roproxy.com/universes/v1/places/${forestTailsPlaceId}/universe` ); const universe = await universeResponse.json(); const gameResponse = await fetch( `https://games.roproxy.com/v1/games?universeIds=${universe.universeId}` ); const gameResult = await gameResponse.json(); const game = gameResult.data[0]; const iconResponse = await fetch( `https://thumbnails.roproxy.com/v1/games/icons?universeIds=${universe.universeId}&size=512x512&format=Png&isCircular=false` ); const iconResult = await iconResponse.json(); document.getElementById("forest-tails-name").textContent = game.name; document.getElementById("forest-tails-creator").textContent = `Previous project • By ${game.creator.name}`; document.getElementById("forest-tails-players").textContent = formatForestTailsNumber(game.playing); document.getElementById("forest-tails-visits").textContent = formatForestTailsNumber(game.visits); document.getElementById("forest-tails-icon").src = iconResult.data[0].imageUrl; } catch(error) { document.getElementById("forest-tails-creator").textContent = "Previous Roblox project"; } } updateForestTailsCard(); setInterval(updateForestTailsCard,60000); }
Sundown Island game icon

Sundown Island

Loading game information...

🟢 playing👁️ visits
Play on Roblox
{ const sundownPlaceId = "3246508824"; function formatSundownNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateSundownCard() { try { const universeResponse = await fetch( `https://apis.roproxy.com/universes/v1/places/${sundownPlaceId}/universe` ); const universe = await universeResponse.json(); const gameResponse = await fetch( `https://games.roproxy.com/v1/games?universeIds=${universe.universeId}` ); const gameResult = await gameResponse.json(); const game = gameResult.data[0]; const iconResponse = await fetch( `https://thumbnails.roproxy.com/v1/games/icons?universeIds=${universe.universeId}&size=512x512&format=Png&isCircular=false` ); const iconResult = await iconResponse.json(); document.getElementById("sundown-name").textContent = game.name; document.getElementById("sundown-creator").textContent = `Outdated / legacy • By ${game.creator.name}`; document.getElementById("sundown-players").textContent = formatSundownNumber(game.playing); document.getElementById("sundown-visits").textContent = formatSundownNumber(game.visits); document.getElementById("sundown-icon").src = iconResult.data[0].imageUrl; } catch(error) { document.getElementById("sundown-creator").textContent = "Outdated / legacy project"; } } updateSundownCard(); setInterval(updateSundownCard,60000); }
Serene Forest game icon

Serene Forest

Loading game information...

🟢 playing👁️ visits
Play on Roblox
{ const serenePlaceId = "2837918991"; function formatSereneNumber(number) { return new Intl.NumberFormat("en-CA", { notation: number >= 1000000 ? "compact" : "standard", maximumFractionDigits: 1 }).format(number); } async function updateSereneCard() { try { const universeResponse = await fetch( `https://apis.roproxy.com/universes/v1/places/${serenePlaceId}/universe` ); const universe = await universeResponse.json(); const gameResponse = await fetch( `https://games.roproxy.com/v1/games?universeIds=${universe.universeId}` ); const gameResult = await gameResponse.json(); const game = gameResult.data[0]; const iconResponse = await fetch( `https://thumbnails.roproxy.com/v1/games/icons?universeIds=${universe.universeId}&size=512x512&format=Png&isCircular=false` ); const iconResult = await iconResponse.json(); document.getElementById("serene-name").textContent = game.name; document.getElementById("serene-creator").textContent = `Outdated / legacy • By ${game.creator.name}`; document.getElementById("serene-players").textContent = formatSereneNumber(game.playing); document.getElementById("serene-visits").textContent = formatSereneNumber(game.visits); document.getElementById("serene-icon").src = iconResult.data[0].imageUrl; } catch(error) { document.getElementById("serene-creator").textContent = "Outdated / legacy project"; } } updateSereneCard(); setInterval(updateSereneCard,60000); }

Business Inquiries

Commission Status

OPEN!If you want to commission me, please fill out this form.