Show HN: Repaint – a WebGL based website builder
236 points| benshumaker | 1 year ago |repaint.com
It has panning, zooming, and dragging elements around. The settings closely follow html/css. We think an open canvas is a big improvement over other website builders. Everything is easier: styling, consistency, responsiveness…
But making it work was hard! We thought HN would appreciate the tech behind it: - A custom WebGL rendering engine (w/text, shadows, blurs, gradients, & opacity groups) - A partial implementation of the css spec - A custom text editor & text shaper - A transformer to turn designs into publishable html/css
Repaint is a design tool for html/css. But internally, it doesn’t actually use html/css itself. All your designs live in a single <canvas> element.
We wanted users to be able to see all their content on one screen. We target +60fps, so frames only have 16ms to render. The browser’s layout engine couldn’t handle simple actions, like zooming, with many thousands of nodes on the screen. To fix that, we wrote a rendering engine in WebGL.
Since we use custom rendering, we had to create a lot of built-in browser behavior ourselves.
Users modify a large dom-like data-structure in our editor. Each node in the document has a set of css-like styles. We created a layout engine that turns this document into a list of positions and sizes. We feed these values into the rendering engine. Our layout engine lets us display proper html layouts without using the browser's layout engine. We support both flex and block layouts. We already support multiple layout units and properties (px, %, mins, maxes, etc.).
We also can’t use the browser’s built-in text editor, so we made one ourselves. We implemented all the common text editor features regarding selection and content editing (clicking, selection, hotkeys, inline styling, etc.). The state consists of content and selection. The inputs are keystrokes, clicks, and style changes. The updated state is used to render text, selection boxes, and the cursor.
When you publish a website, we turn our internal document into an html document. We've intentionally structured our document to feel similar to a dom tree. Each node has a 1:1 mapping with an html element. Nodes have a list of breakpoints which represent media-queries. We apply the styles by turning them into selectors. All of the html pages are saved and stored on our fileserver for hosting.
We made a playground for HN, so you can try it yourself. Now that the tech works, we’d love feedback and ideas for improving the product experience.
And we’d love to meet more builders interested in the space. If that’s you, feel free to say hello in the comments! Or you can reach Ben from his website.
Playground: https://app.repaint.com/playground
Demo Vid: https://www.loom.com/share/03ee81317c224189bfa202d3eacfa3c3?...
Main Website: https://repaint.com/
Contact: https://benshumaker.xyz/
nox101|1 year ago
I just tried to insert an emoji on the demo. The page didn't recognize the IME was up and when pressed enter in the IME it inserted a carriage return in the text area. I tried pasting in some Japanese and an emoji. Neither displayed. I tried right-clicking so I could use cut/copy/paste/define/lookup/spellcorrect. All of them were missing
benshumaker|1 year ago
You actually just found a bug in our text editing. Cut/copy/paste is supposed to work. We've always tested with hotkeys instead of right clicking. So thanks for the bug report :)
wg0|1 year ago
This seems to be built out of pure love for technology but I am wondering how much time and effort has gone into that.
rikroots|1 year ago
For me, it was the best part of 4 months of mornings, evenings and weekends - and roughly 40% of my sanity (quaternions took the other 60% a few years ago). And the work is nowhere near finished. Knowing that I still need to find a proper fix for CJK punctuation brings me out in hives. I've also developed a special hatred of Thai fonts.
As for styling a single Arabic glyph within a word ... has anyone in the world managed to do that? It's when I failed to achieve that idea I decided to throw in the towel and release the work as Good Enough because I've Had Enough!
Still - it was an adventure[1].
[1] - https://scrawl-v8.rikweb.org.uk/demo/canvas-206.html
red_trumpet|1 year ago
I've never heard about this. Where can I read more about it?
benshumaker0|1 year ago
And maybe it sounds silly, but we don't personally feel pure love for technology. We're obsessed with a vision. And we've decided to conquer any technical challenge to make it real.
peppertree|1 year ago
yaj54|1 year ago
- import existing html/css. This would allow me to use it for non-greenfield projects, and allow for back-and-forth workflows.
- mark nodes with my own semantic ids that are included in the html export. I would use these to post process exported html to create dynamic templates/components/views. I don't want to be tied to a specific framework.
truckerbill|1 year ago
- No way to set defaults for new frames etc ( that I know of )
- Some things rely on mouse input (setting width modes etc) which breaks flow
- Generally not for power users
- No decent code export
- No stylesheets for retheming components /showing variation (I know there's a Variant workflow for it but it's not simple to restyle an entire hierarchy)
Would love to see you tackle those if you're not already. Great to see you following CSS more closely, makes so much sense.
But if you aren't allowing us to extract the code / self host then I'll be passing on it. Digital feudalism
rikroots|1 year ago
Also congratulations on building a canvas engine library! Nothing is easy when it comes to canvas. Creating one for the WebGL canvas is magnitudes of more difficulty compared to 2D (which is what my library maps to).
I'd love to hear your horror stories when it came to coding up the text layout functionality and text editor - that is, in my view, the hardest part of the job: I may have invented a few new swear words while tackling that work.
I'd also be interested in your plans for accessibility. Not just making the tool accessible, but how such a tool may push designers to consider accessibility as a first class requirement for the end user in the projects they build with the tool.
Best wishes and great fortune!
benshumaker0|1 year ago
Haven't planned accessibility help yet. But I think simple warnings could go far. When I break guidelines, it's usually by accident.
tantalor|1 year ago
Otherwise, this is another hosting service with a really nice proprietary wizard.
71bw|1 year ago
specialist|1 year ago
HTML/CSS support should just be another MIME type among many. Java Applets, Flash/Shockwave, PDF, Markdown, VRML-97, Quake .map, or whatever. Most sites would use one of the many stock renderer & runtimes. Some would implement their own, like your CSS reimplementation, as needed.
In other words, just skip the need for HTML shims.
Lastly, your efforts bring us that much closer to bringing us full circle. Next step: implement Wayland (and/or X11 if you're nostalgic).
izakfr|1 year ago
lucasfcosta|1 year ago
When you explained how you had just reimplemented the CSS spec I was mindblown.
You guys rock. Repaint is amazing.
xpl|1 year ago
Does it really need WebGL? You could pre-render things to images (memoize your rendering basically) and update the cached images only when the editing happens. As the interactive editing usually happens only locally, it could probably work well.
The obvious upside is that you don't need then to re-invent the browser's renderer and text editing from scratch, you could re-use it.
For example, this stroke me as an extreme NIH:
> We also can’t use the browser’s built-in text editor, so we made one ourselves
People usually just hate custom non-system text inputs, because it is very hard to reproduce the native look and feel of text selection, editing and stuff, and even if you manage to get close to it, there will always be some "uncanny valley" effect...
computerthings|1 year ago
> it is very hard to reproduce the native look and feel of text selection, editing and stuff, and even if you manage to get close to it, there will always be some "uncanny valley" effect...
People who want what they already have can just use what they already have.
And it's not just about matching it... you can scroll butter smooth at 240 fps. Or maybe you could make undo leave traces that fade out where something changed, making it more easy to follow when just keeping ctrl+y/z pressed for a bit -- or maybe that would make it harder, but the cool thing is that you easily try out all sorts of crazy things things when something is in shader form that would take a lot more effort to get working at 1/100th the speed any other way.
Browsers zoom in and out in 10% steps. That's incredibly crude and jarring. Like smooth scrolling, there could be smooth zooming. Or the other way, you only change zoom once the user has confirmed the new zoom level -- you can't do either in a browser. And that's such a tiny thing!
Of course how the GPU prefers things to be laid out kind of funnels what you'll end up experimenting with, but that's absolutely an avenue worth exploring, until you hit a wall, and then you climb that wall and keep going. Please :)
FractalHQ|1 year ago
Regarding the text editor — I can’t stand using any editor that doesn’t have the hotkeys and multi cursor editing that I’m used to. I even stopped using note apps and just use vscode anytime I need to author more than a paragraph of text.
I worry that a clever image caching strategy and the Monaco npm package would be a better alternative for many reasons — especially considering the role that easy access to Devtools plays in the design process, which you also lose with a canvas.
benshumaker0|1 year ago
Maybe there's a way and we didn't find it? We looked at every example we could find. There's a lot of canvas apps without WebGL. But they're all orders of magnitude behind the Figma benchmark. Everything not using WebGL felt noticeably less smooth.
And in our user testing, our texting editing is already past the valley :)
sjud|1 year ago
Thanks for making Repaint. It looks awesome and I agree with some of the comments here. I'd go absolutely bananas for a convenient web design tool that enabled me as a developer to provide my own transformer.
I'd love to see you make the internal document / node tree you are using into something that is presented to the user and could be parsed into any frontend framework that uses a tree to represent UI. If you created a standard for your underlying data structures and exported/imported the data format defined in the standard. Developers could build to the standard and then write parsers that parsed from and to your data format. So I could use Repaint at any point in my development process and use the transformer someone built to move my design into and out of Repaint and from and into my code.
If you were to create a standard that allowed developers to build their own transformers you would be making a different product then Figma. Since Figma has a better UI and design tool, and you aren't going to catch up. Figma also is already on their way to doing a HTML/CSS mapping, (see their semi-new developer feature)
If you emphasized the open standards approach and built your tooling around leveraging developers you'd have something much more close to a UI platform as opposed to "another website builder". De-emphasize designers, emphasize developers, be the Microsoft of UI building tools.
izakfr|1 year ago
replwoacause|1 year ago
izakfr|1 year ago
scratchyone|1 year ago
I was curious what your plans are for code output in the future, have you considered some kind of React integration? If this tool had Storybook-style codebase integration I would 100% pay for a subscription. For example, being able to export the website design as a React project with organized components, allow me to modify the component code to customize behavior, and continue to iterate on the design and apply changes to my codebase?
I think an important thing for me would be to have the ability to continue to modify the design after exporting and be able to apply the design changes without having to lose my code changes.
Obviously just my personal preference so take that with a grain of salt, but I know with that feature this would completely replace Figma in my workflow and would definitely be worth paying for.
Congratulations on your launch!
benshumaker0|1 year ago
You're right about the exporting though. We're not sure exactly how to synchronize a code editor & Repaint editor for two way updates.
j-a-a-p|1 year ago
The website itself is a bit underwhelming for several reasons. For the reader who already gets the idea, the text makes sense. But try to read it as a new visitor and my guess is many of them are clueless and will probably bounce. Also add some examples, maybe a video (not the one you have linked here)
The website gives the feeling it is a Lean Startup style MVP launch, just a test if you get traction on the idea. Either fake it till you make it, or better, give the early users the comfort of (an idea that) their website will function when you pull the plug tomorrow.
benshumaker0|1 year ago
aabbcc1241|1 year ago
computerthings|1 year ago
[0] I lied, that was the second, the first thing I felt was a mixture of being jealous of what you got there, and being proud someone pulled it off! Kudos.
spdustin|1 year ago
1) https://caniuse.com/viewport-units, https://drafts.csswg.org/css-values/#viewport-relative-lengt... (includes dynamic and inline/block lengths)
2) https://caniuse.com/css-container-query-units, https://www.w3.org/TR/css-contain-3/#container-lengths
izakfr|1 year ago
zamadatix|1 year ago
The default layout seems to have the classic "horizontal scrollbar because it doesn't account for a vertical scrollbar when setting the width" design flaw. Not sure if that's specific to the example or a "just how the sizing system works" thing.
izakfr|1 year ago
p0w3n3d|1 year ago
izakfr|1 year ago
flockonus|1 year ago
Not sure what audience you have in mind.
muglug|1 year ago
The video felt a little sped up. Not sure whether that's your natural talking cadence, or the video was 1.5x, but slightly slower would be great.
Also, at first the video focusses on the nerdy interesting things like fast pan & zoom, vs the things less-technically-inclined users would care about.
andreasley|1 year ago
autoexec|1 year ago
postscape|1 year ago
I highly recommend looking at Webflow’s component system and their partially-launched Library feature for inspiration (also check out Relume).
A service like yours that offers a library of foundational sections with customization options on top would be a game-changer. Best of luck! Let me know if you need any specific user testing.
nikkwong|1 year ago
There is a lot of demand for Figma's close-sourced rendering engine to build tons of different types of tech/apps on top of it (animation engines, svg editors, an adobe illustrator killer, a better drawing/path/curvature tool), that Figma is NOT doing that I'm sure people (myself included) would love to build. But I'm not going to build their rendering engine from scratch—there's a ton of work that went into that and it's why Figma's moat is so big. The OS alternatives are garbage (konva,canvasjs,fabricjs). Paperjs is great but their use case is different.
No offense, I personally think that could be a bigger business than your site generator. Please reach out to me if you guys plan to do so!
Btw, if you guys decide to continue going the site-builder direction—being able to export the HTML is an absolute must.. Let users pay extra for a one-time export, if you must. It's a nightmare trying to get sign off on using something like this if it's a complete walled-garden.
theodraul|1 year ago
It's just an html canvas powered by a low level language through WASM, plus a bridge interface. Perfect use case for Rust.
Rest of Figma is, I guess, just React.
But just as you mentioned I believe there's a lot of business potential there, and someone will get it done sooner or later.
10000truths|1 year ago
The rendered pages have noticeable aliasing when zooming out in the playground. Is there a reason why the WebGL context isn't configured with anti-aliasing enabled?
benshumaker0|1 year ago
lukaqq|1 year ago
benshumaker0|1 year ago
doawoo|1 year ago
throwaway333445|1 year ago
Edit/addition: Congrats on your product! Always great to see a high-quality, pure software project get funded and realized. If I ever do YC (non-ivy so probably not in the cards) I'd probably do something like this.
izakfritz|1 year ago
Maybe one day :)
benshumaker0|1 year ago
hi_hi|1 year ago
Some questions:
- Is there a plan to offer an export option to output the static html?
- What are the constraints around using CSS frameworks, like Bootstrap or Tailwind, especially when exported?
- Are there integration options planned? For example, if I wanted to pull in content from a headless CMS or other data sources.
sdwrj|1 year ago
teaearlgraycold|1 year ago
I tried a very simple example (imported a nav bar, added a container, put some stuff in the container) and the live version was not responsive at all. Nav bar was a fixed width. The whole page was in the upper left corner of my screen. Did I do something wrong?
izakfr|1 year ago
We're currently working on our onboarding to solve this. It should be easier to make a basic responsive page from the templates.
airstrike|1 year ago
drx|1 year ago
Your budget is only 8.33ms if you target 120hz too btw :) And realistically less because you don't get all of it.
ranger_danger|1 year ago
unknown|1 year ago
[deleted]
amne|1 year ago
izakfritz|1 year ago
runlaszlorun|1 year ago
And congrats. I’ve dabbled a little in trying to use WebGL in places where DOM would the typical choice, and quickly ran away. :)
benshumaker0|1 year ago
izakfritz|1 year ago
stoicjumbotron|1 year ago
I'm on S20 FE
benshumaker0|1 year ago
fabmilo|1 year ago
izakfr|1 year ago
What do you mean drawn live? The content is animated, but is still present in the DOM for indexing purposes.
notpushkin|1 year ago
pjmlp|1 year ago
mcluck|1 year ago
joriskok1|1 year ago
izakfr|1 year ago
Here's a good place to start for the basics: https://webglfundamentals.org/
tempaccount420|1 year ago
webprofusion|1 year ago
benshumaker0|1 year ago
suchintan|1 year ago
benshumaker0|1 year ago
We think our ux foundation is stronger. Many high-frequency actions are faster: moving between pages, copying content between them, multi-select editing. Especially if you're used to Figma. A lot of designers feel like Webflow is notoriously cumbersome to use.
But we also want to keep it very close to html/css. We think it's the only way too push power really far. Webflow did that. Framer's diverged quite a bit. We imagine it might go beyond a website builder to be a generally good "design tool for code"
yawnxyz|1 year ago
izakfr|1 year ago
tmalsburg2|1 year ago
izakfr|1 year ago
This makes editing your content and navigating your project easier.
JaggerJo|1 year ago
What language / toolchain are you using?
izakfr|1 year ago
Eventually we will write the frontend in C++ (using emscripten to compile to JS). The UI will use React, but the canvas state will be in C++.
Also, the monolithic backend will be split apart and rewritten in a different language to optimize speed.
We have a lot of work to make it more performant, but it's going to be fun to build :)
ptsd_dalmatian|1 year ago
Btw, your pricing is broken :)
benshumaker0|1 year ago
handfuloflight|1 year ago
izakfritz|1 year ago
Frankly, we've been very focused on making Repaint a great design tool to build websites and haven't thought about hosting that much.
Would you want to self host? Or maybe edit the code output?
garganzol|1 year ago
benshumaker0|1 year ago
steve_adams_86|1 year ago
It's easy to go all out with a desktop design and discover it's not practical for a mobile view, nor is it easy to find ways to scale it down and have it make sense both aesthetically and technically for a smaller screen. On the other hand, it's not so difficult to start with limitations that can then scale out into something else as screen real estate allows.
Are these potential issues mitigated by how the tools allow you to layout and design things in Repaint?
Another thing, what are your plans around accessibility and semantics? How is the SEO for these sites? I noticed "Welcome to the Playground" in the playground is a p tag with an id. Almost everything is divs and p tags. Not to detract from what is clearly incredible software so far; you're all doing an awesome job. I'd be extremely happy with myself if I accomplished this.
edit: I ran a lighthouse test on the preview and I see the SEO and accessibility are higher than I expected. The performance score is excellent. The others aren't great, but they likely beat a lot stuff out there. I mean, visit any recipe website and weep for the modern internet.
edit edit: I'm realizing you could probably generate some decent document structure/semantics by having the user indicate the intent of some root items, like headers, subtitles, and sections. That's plenty to get some great meta and intent, right? You've got the hierarchy of the page, you can infer some info from properties of the containers and text, etc. There's a ton of potential to get excellent results here without too much knowledge or input from the users.
My totally unasked for suggestions:
izakfr|1 year ago
dnpls|1 year ago
izakfr|1 year ago
We plan on giving the users control over what tag each element uses for SEO purposes (h1, section, etc.).
We have some SEO related settings that can be set (descriptions, title, etc.) and plan to add more.
billconan|1 year ago
artur_makly|1 year ago
izakfr|1 year ago
Exuma|1 year ago
I need to integrate a "site builder" for a landing page service. I cant use things like the other options out there because they require actually going to the site. It makes it useless where i want a fully self contained "builder" for a number (bunch) of different landing page domains.
izakfr|1 year ago
hactually|1 year ago
benshumaker0|1 year ago
patrick-fitz|1 year ago
izakfr|1 year ago
samstave|1 year ago
Ill definately be building something with this. Il give more detailed feedback after use - but from vid:
Have you used SPLINE at all and looked at their events menu system for anims in Spline (which BTW you should take a look at how to integrate and work with the Spline folks as their app would be an indeal way to make interactive 3d UI/X on this as well...
But also - (il test this,) but UI scaling for the windows to get them out of way given canvas, the ability to s=zoom a single element/page on the canvas?>
And the ability to float menu panels to a second screen? (I have a USb monitor on laptop, move all the menu panels to that usb monitor and have the canvas full screen laptop)
-Excited to try this out later today.
https://old.reddit.com/r/Spline3D/top/
benshumaker0|1 year ago
I've never of a web app that lets you pull panels to a second screen. Sounds neat though. Is there a good reference?