Mods / Vintage Canvas

Tags:
Immersion Decoration
Author:
TonyMurchison
Side:
Both
Created:
Jun 6th at 10:03 AM
Last modified:
Jul 4th at 12:38 PM
Downloads:
6635
Recommended download (for Vintage Story 1.22.0 - 1.22.3):
vintagecanvas_1.1.2.zip  1-click install

Vintage Canvas

Vintage Canvas is an immersive in-world painting mod. Designed to provide a gameplay experience similar to vanilla chiselling, it simulates the crafting and use of traditional oil paints on canvas.

The mod adds a collection of painting tools, with the possibilities ranging from simple charcoal sketches all the way to large canvasses with custom mixed paints, frames, and more!

 

To ask questions, request features, or show off your paintings, come join us over at the Discord!


 

Features

Vintage Canvas introduces the following blocks and items:

 

Vintage Canvas collectibles

Easels

The core of the painting process, easels can contain canvases of their corresponding size (normal or large). While a canvas is on the easel, it can be edited with one of the painting tools. Right-clicking with an empty hand retrieves the canvas.

 

Canvases

Canvases are made from linen and sticks, and can be combined into their larger variants. Each size of canvas is available in landscape, portrait, and square variants.

Right-clicking a placed canvas with a board of wood cycles through different frame designs for the canvas.

 

Paints

Pigments can be ground in a quern from various materials, and then combined with plant oils in specialised paint jars to create the mod's default paints.

Early-game pigments can be obtained from common materials like clay, ferns, bone, and woad. Paints made from these pigments are somewhat muted, earthy tones. Late-game mineral resources like malachite can be ground into brighter, richer pigments.

 

Brushes

Available in several sizes, brushes apply whatever paint they have been dipped in onto the easel canvas. Alternatively, while the brush is clean, the brush blends existing colours to create smooth transitions.

Some items can be applied to the canvas directly, functioning like a small paintbrush with a preset colour and opacity. Currently, these include charcoal, chalk, and limestone.

 

Turpentine

Turpentine is a paint thinner derived from pine resin. While holding a brush, you can right-click a paint jar with turpentine to gradually reduce the opacity of your brush. The more you click, the more translucent your paint strokes will be.

Alternatively, shift + right-clicking the jar will completely clear your current brush, allowing you to use it as a blender.

 

Palettes

The palette is a utility block that lets you mix paints together. While placed in the world, clicking one of the palette's paint slots with a paint jar adds that paint to the slot. As you add more paint portions to the slot, the colour adjusts to be the average off all added portions. To clear a slot of paint, click it with a jar of turpentine.

To quickly switch between paints, hold the palette in your off-hand while painting. You can then use the tool mode selection key (default: F) to instantly swap.

 


 

Roadmap

These features are intended - if technically viable - to be implemented in the future.

  • Optional paint consumption during use, to be toggled by config
  • Support for painting using left-click in addition to right-click
    • Potential support for drawing tablet pressure sensitivity
  • Resolution of lingering visual issues in multiplayer
  • Exporting paintings
  • Frescos - painting art directly onto world blocks
    • Including support for chiselled blocks to enable custom signage, painted sculptures, and more
  • An artist class that removes off-hand hunger penalties for hammers and palettes

 

I will not be adding the ability to import images into Vintage Canvas. This would undermine a lot of the achievement in making your own in-world paintings, since it circumvents both the process and the materials required. Consider using the excellent Joy of Painting instead!

Thank you to both Miranda and Affonso for their help in providing code examples, testing, and feature feedback for Vintage Canvas.

Mod Version Mod IdentifierFor Game version Downloads Released Changelog Download 1-click mod install*
1.1.2 vintagecanvas
1.22.0 - 1.22.3
1172 Jul 4th at 12:38 PM vintagecanvas_1.1.2.zip 1-click install

Features:

  • By default, paint now gets slowly consumed from your brush while painting, refilling them from jars consumes small amounts of paint, and palette slots eventually run out.
  • Added a config file that lets you tweak or disable paint consumption rates.
  • When paint depletion is enabled, palettes and brushes now show their contents in the GUI
1.1.1 vintagecanvas
1.22.0 - 1.22.3
1583 Jun 24th at 7:23 PM vintagecanvas_1.1.1.zip 1-click install

Features

  • Basic drawing tablet support
    • Drawing tools (brush, charcoal) now interact with easels and paint jars identically using either left or right click
    • Due to vanilla game shenanigans, this unfortunately doesn't work for chalk/limestone

 

Bugfixes

  • Miscellaneous
1.1.0 vintagecanvas
1.22.0 - 1.22.3
981 Jun 21st at 7:00 PM vintagecanvas_1.1.0.zip 1-click install

Features

  • Craftable beret for optimal Parisian vibes
  • Clean brushes now work as blenders, smoothing out paint transitions
1.0.6 vintagecanvas
1.22.0 - 1.22.3
289 Jun 20th at 8:36 PM vintagecanvas_1.0.6.zip 1-click install

Features:

  • Paint jars now have a splash texture that corresponds to the paint inside. Makes them much easier to recognise from cabinets/shelves/tables.
  • Modded blocks have been assigned correct base materials

 

Bugfixes:

  • Grinder recipe for crushed lead no longer overrides vanilla recipes
  • Painting strokes no longer end unexpectedly when rapidly shifting between multiblock instances
  • Stroke interpolation less sensitive to skipping pixels, especially for the small brush
  • Paint jars no longer crash the world when filled with opaque contents
1.0.5 vintagecanvas
1.22.0 - 1.22.3
867 Jun 16th at 1:19 PM vintagecanvas_1.0.5.zip 1-click install
  • Brush strokes are now interpolated between instances, making quick, uninterrupted strokes possible.
  • Can use chalk and limestone as single-pixel drawing tools similar to charcoal.
    • Pigment colour is similar to the raw canvas, so you can use this as an eraser
  • Oils from Expanded Foods are now supported as a medium
1.0.4 vintagecanvas
1.22.0 - 1.22.3
602 Jun 15th at 8:46 PM vintagecanvas_1.0.4.zip 1-click install

Multiplayer update

  • Canvases synchronise between players after being placed in the world
  • Easels synchronise between players at the end of every brush stroke

 

Known remaining issues:

  • Easels don't synchronise if the stroke ends off-canvas
  • Easels may appear to contain absent canvases for other players. Placing your own canvas resolves this issue.

 

I bought a second copy of the game to test the mod in multiplayer. Let me know if different issues appear in server-based multiplayer games!

1.0.3 vintagecanvas
1.22.0 - 1.22.3
541 Jun 13th at 8:35 AM vintagecanvas_1.0.3.zip 1-click install
  • Additional multiplayer synchronisation fixes
  • Handbook adjustments and Ukrainian translation (courtesy of DeanBro)
1.0.2 vintagecanvas
1.22.0 - 1.22.3
267 Jun 11th at 5:01 PM vintagecanvas_1.0.2.zip 1-click install
  • Fixed bug where mixing versions in multiplayer would cause crashing during pixeldata transfers
  • Updated all picture frames to be in line with the new large canvas designs
1.0.1 vintagecanvas
1.22.0 - 1.22.3
169 Jun 9th at 8:20 PM vintagecanvas_1.0.1.zip 1-click install
  • Added large (2x2) canvases
    • Added large H-frame easels
    • Added frame models for 2x2 canvases
  • Canvas bitmaps are now stored in compressed form to avoid overloading stack and tree attributes
1.0.0 vintagecanvas
1.22.0 - 1.22.3
164 Jun 6th at 10:04 AM vintagecanvas_1.0.0.zip 1-click install

Initial release


57 Comments (oldest first | newest first) (threaded | flat)

Punchweasel, 4 days ago

Definitely giving this mod a shot in singleplayer and someday in multiplayer, also sick to see Frescos on the roadmap too!

StreetCaptain, Jul 4th at 9:00 AM

Shipwright: Vessels of Distant Shores (https://mods.vintagestory.at/shipwright) conflicts - the recipe for the "Drakkar Emblem Canvas" overwrites the recipe for the Small Square Canvas.
Additionally, Expanded Matter conflicts with the recipe for the Lead White pigment, though this has already been noted. Haven't noticed any other conflicts yet, myself, but I've basically only just started with this mod.

Onlime, Jul 1st at 10:57 PM

Can paintings be copied? I.e. if i want a duplicate?

TonyMurchison , Jul 2nd at 11:10 AM
@Onlime: Can paintings be copied? I.e. if i want a duplicate?

Yes, but currently only in Creative. A tool for making screen print copies may eventually make it to survival.

Eshisakka, Jun 28th at 1:10 PM

Hey, I can't seem to find the recipe for lead white pigment in the handbook? How can you make it?

TonyMurchison , Jun 28th at 7:41 PM
@Eshisakka: Hey, I can't seem to find the recipe for lead white pigment in the handbook? How can you make it?

The recipe should be grinding up crushed galena. Any chance some other mod is overriding grinding recipes? It's showing up in the hand book on my end.

Eshisakka, Jun 29th at 11:26 AM
@TonyMurchison: The recipe should be grinding up crushed galena. Any chance some other mod is overriding grinding recipes? It's showing up in the hand book on my end.

Ahhhh, then that would make sense - expanded matter (which is needed for bricklayers) seems to override that recipe 🥲

Yithani, Jun 24th at 9:43 AM (modified Jun 24th at 9:51 AM)

Hi! Something in VintageCanvas is preventing use of the Easel block in Esoterica (https://mods.vintagestory.at/show/mod/35893). I assume there is an interaction overriding something there.

TonyMurchison , Jun 26th at 9:09 AM
@Yithani: Hi! Something in VintageCanvas is preventing use of the Easel block in Esoterica (https://mods.vintagestory.at/show/mod/35893). I assume there is an interaction overriding something there.

Interesting! I've taken a look at it and verified the problem, though I genuinely don't know how or why that happens, and Esoterica doesn't appear to have a public github. I'll try to clean up anything that might be related, but I can't even tell for certain if the issue is caused on the end of Vintage Canvas.

Screwy, Jun 20th at 12:50 PM

Another small issue found:

When using this mod, it seems to prevent grinding any crushed material. Iron oxide, lapislazuli, alum, such stuff.

BraindeadGoon, Jun 19th at 6:34 AM (modified Jun 19th at 6:35 AM)

I happened to encounter an error with putting dye in a paint jar that corrupts the world. Hope this can help with debuging :]

(I was using a bucket with base game dye and no other mods)

Crash Report

Running on 64 bit Windows 10.0.26200.0 with 32549 MB RAM
Game Version: v1.22.3 (Stable)
6/19/2026 2:30:38 AM: Critical error occurred
Loaded Mods: game@1.22.3, vintagecanvas@1.0.5, creative@1.22.3, survival@1.22.3
System.NullReferenceException: Object reference not set to an instance of an object.
at Vintagestory.GameContent.BlockLiquidContainerTopOpened.GenMesh(ICoreClientAPI capi, ItemStack contentStack, BlockPos forBlockPos) in VSSurvivalMod\Systems\Liquid\BlockLiquidContainerTopOpened.cs:line 140
at Vintagestory.GameContent.BlockLiquidContainerTopOpened.OnBeforeRender(ICoreClientAPI capi, ItemStack itemstack, EnumItemRenderTarget target, ItemRenderInfo& renderinfo) in VSSurvivalMod\Systems\Liquid\BlockLiquidContainerTopOpened.cs:line 71
at Vintagestory.Client.NoObf.InventoryItemRenderer.GetItemStackRenderInfo(ClientMain game, ItemSlot inSlot, EnumItemRenderTarget target, Single dt) in VintagestoryLib\Client\Render\InventoryItemRenderer.cs:line 426
at Vintagestory.GameContent.EntityPlayerShapeRenderer.RenderHeldItem(Single dt, Boolean isShadowPass, Boolean right) in VSEssentials\EntityRenderer\EntityPlayerShapeRenderer.cs:line 364
at Vintagestory.GameContent.EntityPlayerShapeRenderer.DoRender3DOpaque(Single dt, Boolean isShadowPass) in VSEssentials\EntityRenderer\EntityPlayerShapeRenderer.cs:line 277
at Vintagestory.Client.NoObf.SystemRenderEntities.OnRenderFrameShadows(Single dt) in VintagestoryLib\Client\Systems\Render\RenderEntities.cs:line 174
at Vintagestory.Client.NoObf.ClientEventManager.TriggerRenderStage(EnumRenderStage stage, Single dt) in VintagestoryLib\Client\Util\ClientEventManager.cs:line 243
at Vintagestory.Client.NoObf.ClientMain.MainRenderLoop(Single dt) in VintagestoryLib\Client\ClientMain.cs:line 919
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 173
at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 742
at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 686
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 112
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 354
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95

Event Log entries for Vintagestory.exe, the latest 1
==================================
{ TimeGenerated = 6/19/2026 1:22:26 AM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.22.3.0, time stamp: 0x691d0000
Faulting module name: openal32.dll, version: 1.23.0.0, time stamp: 0x63dd31ad
Exception code: 0x40000015
Fault offset: 0x00000000000df046
Faulting process id: 0xd94
Faulting application start time: 0x1dcffab7f313749
Faulting application path: C:\Users\tidus\AppData\Roaming\Vintagestory\Vintagestory.exe
Faulting module path: C:\Users\tidus\AppData\Roaming\Vintagestory\Lib\openal32.dll
Report Id: 221c57cc-0152-4463-9dab-0e9a065cf0de
Faulting package full name:
Faulting package-relative application ID: }

[This is my first time linking a crash report so I don't know if I did it right]

TonyMurchison , Jun 20th at 12:40 PM
@BraindeadGoon: I happened to encounter an error with putting dye in a paint jar that corrupts the world. Hope this can help with debuging :] (I was using a bucket with base game dye and no other mods) Crash Report Running on 64 bit Windows 10.0.26200.0 with 32549 MB RAM

Thank you for the report! The bug has been fixed (to be included in an update later today). It should also un-corrupt your world.

Just out of curiosity, was there a particular reason you tried to add dye to the paint jars?

BraindeadGoon, Jun 25th at 4:51 PM
@TonyMurchison: Thank you for the report! The bug has been fixed (to be included in an update later today). It should also un-corrupt your world. Just out of curiosity, was there a particular reason you tried to add dye to the paint jars?

I was unable to make the relevant paint due to using an old version of the mod which hadn't added the vermillion and ultramarine pigments so I attempted to use red dye to substitute and experiment

Thank you for fixing it quickly (:

Beedy, Jun 17th at 5:11 PM

Is it possible to remove colors from a palette?

TonyMurchison , Jun 18th at 9:35 AM
@Beedy: Is it possible to remove colors from a palette?

Yes! You click the slot with your turpentine jar.

UnknownVox, Jun 16th at 7:03 PM

Hi! I cant add pigments to any paint pots with oil, was wondering if there is a certain hotkey or if im doing stuff wrong :(

TonyMurchison , Jun 17th at 5:32 AM
@UnknownVox: Hi! I cant add pigments to any paint pots with oil, was wondering if there is a certain hotkey or if im doing stuff wrong :(

You should be able to place the jar of oil on the ground, and right-click it with your pigment. 

Eliam, Jun 16th at 4:39 PM

Wow, it looks sooooooo nice ! I was wondering how you implemented pigments mixing ?

TonyMurchison , Jun 19th at 10:06 AM
@Eliam: Wow, it looks sooooooo nice ! I was wondering how you implemented pigments mixing ?

Thank you! There's a limited number of base pigments and corresponding paints in the mod. The mod can interpolate between those colours either on the canvas (with an opacity modifier based on how much turpentine you used) or on the palette (where the strength of additional paint is relative to the amount of paint you already added to the slot).

Crackomint, Jun 16th at 12:34 AM

This is such a cool mod. I love the implementation of mixing colors and turpentine to make it feel more like real painting. I want to build an artist's studio in my world now! Thank you for making this. :)

Beedy, Jun 15th at 9:33 PM (modified Jun 15th at 9:37 PM)

I can't wait to try it in an actual playthrough. I'll share my paintings with you guys when I do.
in fact, this is a Public Request, everyone share what you painted with us. 

BugleMama64, Jun 15th at 8:49 PM

absolutely wonderful mod. thank you for your hard work! (and buying a second copy wow, that's commitment!!)

Elemiach, Jun 15th at 12:00 PM

Brilliant mod. Yet another reason to forfeit real life and live inside the game already.
Having the ability to import/export images would be very cool.

Stason4ikRU, Jun 13th at 7:59 PM (modified Jun 13th at 8:01 PM)

Hang a picture on the wall and the other player can't see it. I gave it to him, and he hung it, and I stopped seeing this picture. In the hands, the picture is visible to everyone. Latest Mod & Game Version

TonyMurchison , Jun 15th at 7:25 AM
@Stason4ikRU: Hang a picture on the wall and the other player can't see it. I gave it to him, and he hung it, and I stopped seeing this picture. In the hands, the picture is visible to everyone. Latest Mod & Game Version

This bug is known, and I'm currently working on it. In the meantime, if you're really eager to show off your work, placed paintings should synchronise to any player leaving and rejoining the server.

Axebeard, Jun 13th at 7:54 PM

One major thing - this (by default) can't be used with drawing tablets because the stylus input registers as a left-click by default, so you punch the canvas rather than paint on it. My suggestion is to add a simple toggle button to swap the input buttons so it can be used with a tablet.

TonyMurchison , Jun 15th at 7:46 AM (modified Jun 15th at 8:49 PM)
@Axebeard: One major thing - this (by default) can't be used with drawing tablets because the stylus input registers as a left-click by default, so you punch the canvas rather than paint on it. My suggestion is to add a simple toggle button to swap the input buttons

Good suggestion! I'm currently simply planning to have brushes and charcoal behave identically on easel left and right click. To be included in the next update after addressing multiplayer issues.

GriffinPhillis, Jun 13th at 4:39 AM

Love this mod! Have been wanting this in Vintage Story for a long time, glad to see it finally brought to fruition! 💚

Moristel, Jun 12th at 10:55 PM

Oh wow!! I love that this includes dilution, and that the rendering style itself seems to really fit in with the style of vintage story. 

Has anyone tried this with a drawing tablet? This would be so exciting to have, but I'm left handed and use a mouse right handed-- so that would make things a bit easier for me, I think. 

Morfs, Jun 12th at 11:40 AM

I really can't wait to use this while getting drunk and pixel-painting along to Bob Ross's Joy of Painting. I can revive my old hobby in earnest, if you can call it that.

The_Old_Bookman, Jun 12th at 3:25 AM

Hello! I was wondering how the multiplayer performance is? Any information would be helpful, thanks! :)

TonyMurchison , Jun 12th at 6:27 AM
@The_Old_Bookman: Hello! I was wondering how the multiplayer performance is? Any information would be helpful, thanks! :)

Hey there! I've had some reports of crashes on certain multiplayer instances, so while performace is apparently fine, stability may be an issue. I'll be addressing the problem as soon as I have a multiplayer testing setup.

Screwy, Jun 12th at 2:56 AM (modified Jun 12th at 3:16 AM)

Awesome mod! I just installed this to my server and it looks pretty close to finished already. One small thing I was missing is to acually see the amount of paint go down as I'm working.
As for now the paint jar is infinate. Is it a planned feature to make the brush interactions use a small amount of the liquid each time? That would give a finishing touch to this nice and immersive approach on painting.

Unfortunately players still crash, like described earlier by couki. Hope you can fix this soon!

Crash Report
Running on 64 bit Windows 10.0.19045.0 with 16334 MB RAM
Game Version: v1.22.3 (Stable)
12.06.2026 05:13:51: Critical error occurred in the following mod: vintagecanvas@1.0.2
Loaded Mods: walkingstick@3.0.9, hardcorewaterforked@1.4.6, bola@1.4.1, boricalchemy@1.9.3, craftablecartographyfork@0.1.12, craftablecompanion@1.5.4, crawlanddive@0.2.5, edeninstinct@1.0.2, fallingtree@0.5.2, grindablearrows@1.0.1, grindingwheelrework@1.1.2, hydrateordiedrate@2.4.12, immersivemininganimguard@1.0.1, immersivemining@0.2.22, immersiveorecrush@2.2.5, jsonpatcheslib@1.5.3, manualdough@1.1.8, metalleaf@1.4.1, millwright@1.3.3, overhaullib@2.0.8, remotetradercheckmod@0.8.0, soapandlyecontinued@2.1.2, spinningwheel@1.2.9, thetruearchimedesscrew@0.2.0, game@1.22.3, vsimgui@1.2.7, zfh@0.0.7, abyssaldepths@1.0.17, airthermomod@0.5.0, alchemy@2.1.0-rc.67, algernonsterrainsampler@1.3.0, attributerenderinglibrary@3.1.5, bathtimeforked@1.4.0, betterjonasdevicesfixedagain@2.1.6, betterruins@0.6.2, bloodtrail@1.2.3, brazilpiratefoods@1.2.4, butchering@1.13.4, carryonlib@1.0.0-pre.4, changeclass@1.1.1, claimuiimproved@1.0.0, clothierheirloomsmod@1.1.0, clothingvisuallydegrades@2.3.0, cmicebox@2.0.0, collapsestory@0.6.7, commonlibforked@2.8.1, configlib@1.12.0, cooperativecombatrework@1.1.0, coreofartspatch@1.2.1, bell@1.0.51, thecritterpackcontinued@1.4.2, dairyplus@1.0.4, danatweaks@4.1.0, decoclockrevival@1.22.2, effectshud@0.3.3, emotemenupatched2@1.0.8, extendedcreation@1.2.5, extrashelves@1.1.1-rc.1, fallingspawnmanager@0.1.1, farseer@1.4.0, foodpreferences@1.5.8, foragersgamble@1.3.0, gourmand@1.8.9, grassroots@0.5.6, groupui@1.0.0, hideplayernametag@1.0.0, hudclockpatch@4.3.1, icebreaker@1.22.3, immersivecorpsedrop@1.0.4, immersiveminingandahalf@1.0.0, immersiverope122@1.1.2, immersivewoodchopping@0.8.3, immersivewoodsawing@0.2.9, insanitylib@2.0.3, itemsyncfixes@1.0.7, ithaniacannedgoods@2.0.5, justthepepper@3.0.0, knitting@2.0.3, madcrowglider@1.22.0-rc.6, maketeaforked@0.9.42, mobsradar@3.0.0, multisignpost@0.4.0, multisign@1.2.0, naturalfertilizer@1.5.1, trailmodmaro@1.3.21, ndlflowergrowth@2.2.1, nohandsrevived@0.2.0, novelty@1.2.4, orekiwoofsbeehives@2.0.0, outlawmodreborn@1.0.2, petai@5.1.1, placeonslabs@1.1.3, playercollisions@2.3.0, playerlistrevived@2.3.8, playermodellib@1.20.7, riftworks@1.1.20, roamingbees@2.0.0, scaffolding@1.3.1, scarecrow@1.8.2, shipwright@1.3.3, simplescaffoldings@2.0.0, simplestarvation@1.0.7, slowtox@5.0.0, spyglass@0.6.1, struggletosleep@1.0.4, substrate@2.0.0, temporalfatigue@1.5.0, th3dungeon@0.5.0, thievery@1.3.0, toolsmith@1.2.17, torturedevices@2.1.0, transcribetobook@3.1.0, treetapredux@1.2.7, vigor@122.7.3, vintagecanvas@1.0.2, visibleoresandminerals@1.1.1, vsairshipmod@1.1.4, creative@1.22.3, vsinstrumentsbasetemp@2.0.8, survival@1.22.3, vsvillage@6.0.1, warmweathereffects@1.0.4, artofcookingpatch@1.2.1, artofgrowingpatch@1.2.1, brainfreeze@1.3.7, carryon@2.0.0-pre.4, cats@5.0.1, fseraph@0.4.8, petbackback@1.1.0, playercorpseforked@1.14.1, scoopofjammod@1.2.0, shearlib@1.3.0, spyglassinfoforked@1.0.3, tabletopgames@4.0.0-pre.2, vsballadeerclass@2.0.0-pre.2, watergatemod@1.0.0, wearandtear@1.5.22, wolftaming@5.0.1, aogbreedingaddonpatch@1.2.1, wool@1.9.2
System.NullReferenceException: Object reference not set to an instance of an object.
at VintageCanvas.src.Entities.BlockEntityCanvas.OnBlockPlaced(ItemStack byItemStack) in C:\Users\Wout\source\repos\VintageCanvas\VintageCanvas\VintageCanvas\src\Entities\BlockEntityCanvas.cs:line 52
at Vintagestory.Client.NoObf.ClientWorldMap.SpawnBlockEntity(String classname, BlockPos position, ItemStack byItemStack) in VintagestoryLib\Client\ClientWorldMap.cs:line 1147
at Vintagestory.API.Common.Block.OnBlockPlaced(IWorldAccessor world, BlockPos blockPos, ItemStack byItemStack) in VintagestoryApi\Common\Collectible\Block\Block.cs:line 1381
at Vintagestory.Common.BlockAccessorBase.SetSolidBlockInternal(Int32 blockId, BlockPos pos, IWorldChunk chunk, Boolean synchronize, Boolean relight, ItemStack byItemstack) in VintagestoryLib\Common\API\BlockAccessorBase.cs:line 122
at Vintagestory.Client.NoObf.GeneralPacketHandler.HandleSetBlock(Packet_Server packet) in VintagestoryLib\Client\Systems\GeneralPacketHandler.cs:line 128
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime) in VintagestoryLib\Client\ClientMain.cs:line 817
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 173
at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 742
at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 686
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 112
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 354
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
IWillSoonReturn, Jun 11th at 11:11 PM

seems that a lot of people are trying to dethrone vspaint, which is honestly really cool since painting is a thing that works beautifully for servers

Partexedd, Jun 11th at 10:38 PM

This is amazing

umm, Jun 11th at 5:44 PM

Holy cow, nice work!

TonyMurchison , Jun 11th at 5:55 PM
@umm: Holy cow, nice work!

Thank you very much!

DanaCraluminum, Jun 11th at 5:39 PM (modified Jun 11th at 5:40 PM)

Could you add ground/wall signs for these? E.g. like a sign for shop etc.

TonyMurchison , Jun 11th at 7:38 PM
@DanaCraluminum: Could you add ground/wall signs for these? E.g. like a sign for shop etc.

I want to avoid adding dozens of different individually paintable objects, but one plan for the long-term is to add fresco painting to simple and chiselled blocks. That way you can just carve and paint any block you require.

couki, Jun 9th at 11:35 PM

Hi, loving this mod so far but I'm experiencing a crash in multiplayer when a nearby user breaks and re-places a canvas. Here is the log, this happens to users with and without OptiTime.

Crash Report
Running on 64 bit Windows 10.0.26200.0 with 16305 MB RAM
Game Version: v1.22.3 (Stable)
10/06/2026 00:32:28: Critical error occurred in the following mod: vintagecanvas@1.0.0
Loaded Mods: claycasting@1.3.8, creaturefootsteps@1.3.0, drtagx@1.3.0, grindingwheelrework@1.1.2, jsonpatcheslib@1.5.3, overhaullib@2.0.8, spinningwheel@1.2.9, game@1.22.3, vsimgui@1.2.5, arthursjournal@2.0.3, wforests@1.0.0, configlib@1.12.0, coriaendershaders@1.2.2-pre.3, naturalfoliage@0.0.4, opineuponpine@1.0.10, optitime@1.5.14, playermodellib@1.20.3, rpvoicechat@2.5.7, shipwright@1.3.3, stonerailings@1.4.0, synergy@1.1.15, targetDotMedium@1.1.0, vintagecanvas@1.0.0, creative@1.22.3, vsroofing@1.5.7, survival@1.22.3, windchimes@1.5.2, antlershorns@1.5.1, comfybeds@0.4.2, goblinears@2.3.4, kcsdragons@0.9.10, lupines@0.2.9, shearlib@1.3.0, tailorsdelight@2.2.2, wool@1.9.2
Involved Harmony IDs: com.zaldaryon.optitime
System.NullReferenceException: Object reference not set to an instance of an object.
at VintageCanvas.src.Entities.BlockEntityCanvas.OnBlockPlaced(ItemStack byItemStack) in C:\Users\Wout\source\repos\VintageCanvas\VintageCanvas\VintageCanvas\src\Entities\BlockEntityCanvas.cs:line 50
at Vintagestory.Client.NoObf.ClientWorldMap.SpawnBlockEntity(String classname, BlockPos position, ItemStack byItemStack) in VintagestoryLib\Client\ClientWorldMap.cs:line 1147
at Vintagestory.API.Common.Block.OnBlockPlaced(IWorldAccessor world, BlockPos blockPos, ItemStack byItemStack) in VintagestoryApi\Common\Collectible\Block\Block.cs:line 1381
at Vintagestory.Common.BlockAccessorBase.SetSolidBlockInternal(Int32 blockId, BlockPos pos, IWorldChunk chunk, Boolean synchronize, Boolean relight, ItemStack byItemstack) in VintagestoryLib\Common\API\BlockAccessorBase.cs:line 150
at Vintagestory.Common.BlockAccessorBase.SetBlockInternal(Int32 blockId, BlockPos pos, IWorldChunk chunk, Boolean synchronize, Boolean relight, Int32 layer, ItemStack byItemstack) in VintagestoryLib\Common\API\BlockAccessorBase.cs:line 117
at Vintagestory.Common.BlockAccessorRelaxed.SetBlock(Int32 blockId, BlockPos pos, ItemStack byItemstack) in VintagestoryLib\Common\API\BlockAccessorRelaxed.cs:line 77
at Vintagestory.Client.NoObf.GeneralPacketHandler.HandleSetBlock(Packet_Server packet) in VintagestoryLib\Client\Systems\GeneralPacketHandler.cs:line 128
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime) in VintagestoryLib\Client\ClientMain.cs:line 817
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 173
at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 742
at Vintagestory.Client.ScreenManager.OnNewFrame_Patch1(ScreenManager this, Single dt)
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame_Patch1(ClientPlatformWindows this, FrameEventArgs e)
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 354
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
TonyMurchison , Jun 10th at 6:47 AM (modified Jun 10th at 7:05 AM)
@couki: Hi, loving this mod so far but I'm experiencing a crash in multiplayer when a nearby user breaks and re-places a canvas. Here is the log, this happens to users with and without OptiTime. Crash Report Running on 64 bit Windows 10.0.26200.0 with 16305 MB RA

Hey there! I'll try to fix that as soon as I can. Just for clarification, does the crash only happen to other nearby players, or also to the player who's placing the canvas?

TonyMurchison , Jun 11th at 5:21 PM
@couki: I believe it's only to nearby players. My friend didn't crash

I've patched the most likely culprit - I suspect that some of your players may have been on different versions of the mod at the same time. Version 1.0.2 is compatible with image save data from either version, so anyone running that version should no longer crash. Let me know if the problem still persists!

MiraLeaps, Jun 9th at 8:56 PM

Woo-hoo! Glad to see this out, hope I helped somewhat :)

MiraLeaps, Jun 9th at 9:03 PM
@MiraLeaps: Woo-hoo! Glad to see this out, hope I helped somewhat :)

haha, consider VSpaint retired, holy moly, this is an amazing mod. Just...amazing! Bravo!

DanaCraluminum, Jun 9th at 8:43 PM

Best painting mod for VS ever

MiraLeaps, Jun 9th at 8:57 PM
@DanaCraluminum: Best painting mod for VS ever

**Heartbreak** (no, legit, this is a great mod)

Salty_Scott, Jun 8th at 9:17 PM

This will become a vanilla feature someday, calling it now

DeanBro, Jun 8th at 10:18 AM

TonyMurchison  Hi! I've translated this awesome mod

DaphDuv, Jun 7th at 4:29 PM

So excited to use this in my world! Looks amazing

IRDP, Jun 7th at 2:42 PM (modified Jun 7th at 2:43 PM)

Oh, man, this looks really cool!

Wish you good luck in making this work; it'd certainly be a really awesome addition to have for decoration and just spending time in VS's cosy atmosphere.