I am working on a HTML-to-PDF converter written from scratch in pure Go. I got tired of using headless browsers for various reasons and decided to give it a try and implement something that I can use internally. However the results have far exceed my expectations and I've decided to open source everything. It's around 10x to 15x faster than wkhtmltopdf, which is by far the fastest headless browser converter. It's 80x-100x faster than a pagedjs. It's even 2x faster than PrinceXML, which is pretty much the most mature and reliable HTML-to-PDF converter on the market. It also produces the smallest PDF size.
I started small as a toy project, but gradually implemented full support for proper block context, flexbox layout, CSS variables, tables, etc. to the point where I have almost full support of all major CSS features (even math functions like calc(), min(), max()).
I'm cleaning up the code right now and will upload it later today or maybe tomorrow here: https://github.com/PureGoPDF
Do you intend to one day support all the paged media bits in pagedjs? I assume it works with their polyfill but it’d be great to have a built in more performant option.
Can you give an example? I'm not that familiar with pagedjs, just pulled it for the benchmark.
My library has support for @page rules, but that's actually pretty basic. I needed more advanced headers/footers and added support for in-html headers/footers like this:
In your <body> you cna define headers/footers by wrapping content in a <section> tag. For example:
<body>
<section>
<header>... any HTML here, full CSS support</header>
<div> Some normal flow content</div>
<footer>Your footer HTML</footer>
</section>
</body>
This structure is purely optional, but it's a really convinient way of designing pages with different styles in the same document.
An HTML file can have any number of these sections meaning you can generate a PDF with different headers/footers.
Some other bits: It has support for 100% height that match the entire page, it can handle forced page breaks inside flexbox containers (Chrome doesn't even try ... just ignores it) and also follows page-break: avoid correctly - so it doesn't randomly split table rows for example.
Things like string-set and string (repeating section headers on each page), counter and target-counter (embedding page number references) etc. Prince and pagedjs support all the CSS3 paged media bits I've found myself needing, just wondering if that was on the roadmap.
I had the same thought as you and started working on something that can be described as "AirTable meets Webflow". It's basically a no-code database with drag-and-drop page builder: tables are created and linked together (like in AirTable) and interactive pages are designed to work with that data (like in WebFlow). So in other words users don't directly use a spreadsheet-like UI to work with the data. Instead they use custom-designed pages - it is both much more powerful (e.g. fully scriptable, multiple pages can be linked to form more complex workflows, which wouldn't be even possible with spreadsheets) and yet easier to use. Oh, and it's self-hosted. Judging by the response from users it does seem like something like this is really needed.
I put some pretty crude demos online about a year ago [0] ... back then the idea was to create a more general purpose no-code web app builder, but since then I decided to focus specifically on database applications.
I think one of the reasons for this explosion in new productivity tools we are seeing is the remarkable progress the web platform has made in recent years. I know web developers complain about the rapid speed web technologies are moving, but I personally am amazed by what's possible today. True, it's hard to keep up with everything, but I can't wait to see what will come out of WebComponents and WebAssembly.
Also putting all software in the browser doesn't necessary mean that the users have to give up control over their software and data. Maybe there's a middle ground by making it easy for the end users to run their own software in the browser. At least this is an idea I've been working on for quite some time - a self-hosted visual (no-code) software builder called FormBeaver[0] that let's users build and host their own custom database software without any code. Currently the users need to download it and run the App Builder on their own machine for it to work, but I'm hopeful that in the near future it would be possible to put it entirely in the browser thanks to WebAssembly. The one thing that's missing in the browser right now is an SQL database. I haven't found a way to run SQL in the browser.
Unfortunately, Web SQL Database has been deprecated in favour of IndexedDB, which in my opinion is no real replacement because it's a NoSQL database that's nowhere near as powerful in terms of the queries you can run with it.
However, the deprecation is understandable from a browser vendor's point of view. Maintaining and developing a browser is difficult enough as it is. Having to maintain an RDBMS adds a lot of complexity on top of that for what's probably a marginal use case for most users.
That said, it might be possible to integrate SQLite by using browser extensions. That of course depends on the users' willingness to install a browser extension in order to run your software builder.
This is something I've been working on for quite some time. The goal is to make it easy for anyone to build database apps by first defining a data structure and then creating forms and UI around it. Pretty much anything can be built with FormBolt - from very basic apps to replace excel spreadsheets to complex apps for inventory management, product management, or any custom business processes/data. This is not a tool for visual programming. Instead I think of it as a visual scaffolder - users visually create the app blueprint, which the background service uses to automatically create and deploy a fully functional web app. It offers granular user permissions and it's easy to create different forms/workflows for different user groups.
FormBolt can run locally without a centralized server (all data stored locally) or you can put it on a remote server, enable networking and have your own private cloud app.
As the title it has a visual builder and doesn't require writing any code (for the most basic apps), however writing some JS and SQL is necessary for more advanced functionality. From my experience with it so far I can say that building the usual CRM/project management/invoicing app takes a few hours (from idea to working app). In fact it takes me more time to decide what forms I need for an app than actually building it.
This is what I used to create it:
- Front: VueJS & Semantic UI
- Back: Golang
- Database: PostgreSQL
Visual builders seem like a somewhat controversial topic on HN, but I personally am a huge supporter of the idea. So much so that I invested a lot of time in building a visual builder for database software myself [1].
It's a tool that looks perfect for UX designers, who can use it to build fully functional CRUD apps without writing code.
For example starting with the standard CRM and invoicing apps and going to more complex apps for inventory management, product & project management - virtually any kind of database software can be built without writing code.
This tool (yours?) looks promising and I’ll try it.
I’m skeptical though as I lived through the 90s 4gl database software for PCs like Clarion, FoxPro, Access and others that promised the sane thing but required lots of coding for the final 10% needed to go live.
I agree, I come from a finance background, now designing erp / crm. I can code and I’m expert in SQL and Excel. I’m amazed how primitive software languages, still are and how terrible they are for GUI, all they seeem to offer is - if then else, case, loops, some pattern matching and recursion, they’re all the same - not much better than VB for 20 years ago. SQL is more advanced and powerful. Shame nothing like SQL for UI, HTML is declarative but too dumb and static no equivalent to AI query analyzer to auto layout screens based on constraints and designer inputs from a graphic tool. NO designers should NOT have to use text to design, especially not 3 different primitive languages, ridiculous arrogant way of thinking from coders, who would no doubt struggle to draw a smiley. Anyway rant over, your tool looks amazing from a cursory glance, what tech stack is built on? your website doesn’t say?? can forms / nodes easily connect to Postgres Functions? I use functions for all data IO. Is it easy to port to high performance server stack,from local machine prototype? I’m happy to pay licence fees, just for the tool though, I must have complete control over anything built by it. I have seen a similar python based tool, but it is hosted output only, so of no use to me.
I'm working on such CRUD app builder, which might be interesting to you.
It's self-hosted and because it's written in Golang the entire server is a single binary - users can simply download the binary, run it and that's it.
The data is stored in PostgreSQL. The form builder generates JSON, which is stored in the database and the server builds the resulting app on the fly.
I'm building the first demos as we speak. So far I have an invoicing app with payments tracking, overdue invoices, etc. and a second app, which is Bill of Materials. It can calculate manufacturing costs based on recipes with different inputs like raw materials, processing, other parts and assemblies and so on.
I'll try to put the demos on the site by tomorrow.
It still cannot work with any third-party APIs though, but other than that virtaully anything can be built in a matter of a few hours (maybe a day or two for the more complex and large apps).
Also I've implemented implicit workflows, where what happens is defined in the forms based on what components are inserted into it. There isn't the traditional "when A happens, do B" kind of workflows. IMO the implicit ones are much more pwoerful and flexible.
You can check it here (demos coming soon, currently one one basic tutorial):
https://www.formbolt.com
On creating an app (locally), app error-ed, but the app was visible after refreshing the page, (sorry I couldn't replicate again to get the exact wording).
Might want to add "chmod +x" to the README for non-technical users.
You might want to link to the apps over at localhost:3000 from the app blueprints table.
Loved the:
- single binary deployment
- creation of db using the master pw
- the fact that the data is stored locally and is kept in the db if I ever decide not to use the app
I've been working on a project that does exactly what you described for the last few years. IMHO vue.js/react really changed the game here, especially for CRUD apps.
For example what I did was to code a server part in golang and use vue.js on the frontend and for the app builder. Using the web-based app builder (also 100% vue) the user can design forms. The forms are stored as serialized JSON in the database and the server renders dynamically vue.js components. It's super fast.
And there's a complete freedom to design any form with a 16-column responsive grids and a lot of widgets and styling options. Forms are also nestable (thanks vue!) and completely extendable with custom JS code so it's possible to create a custom widget and then simply import it in other parts of the app.
As I said I think the shadow DOM and frameworks like vue really made the difference. I started without using such frameworks and it was not only tedious, but the resulting app wasn't very interactive and felt like a customized Excel spreadsheet attached on top of a PostgreSQL database.
Now it's a completely different story - it's easy to build fully reactive apps that feel like a "normal" cloud app and are actually pleasant to use. Of course instead of spending few months designing and building it, it was created in a few hours.
So yeah... I think that drag-n-drop builders are definitely coming and will probably eliminate the need to write such apps in coming years.
That's cool -- you should share a link! I've actually also been working on something just like this, which is why I asked for feedback with this. I'll post it on HN tomorrow via a Show HN so we can compare!
For anybody interested -- email is in profile. Happy to give you a sneak peek!
I think if drag and drop builders find an audience it will be in a sweet spot between engineers and clients, maybe used by support engineers or customer success to build and modify applications to client specifications. Technical users will always want more control and in my experience clients are happy to pay for someone else to do the work, even with DND (I've worked at two companies that have built DND form/app builders, neither caught on much with clients).
That's why I don't target primarily developers, but the end-users of such apps. Of course knowing Javascript wouldn't hurt, because it opens a lot of more possibilities to further extend the entire app, but my idea was to make it possible even for non-developers to create apps for CRM, invoicing, accounting or inventory management for their needs. So in my case it's not really visual programming, but a drag-n-drop builder, which also has an integrated code editor in case the user needs it: if they know SQL, awesome - write a custom SQL and it is automatically mapped and available in the forms.
This sweet spot that you talk about between ease of use & flexibility is definitely key.
> I think that drag-n-drop builders are definitely coming and will probably eliminate the need to write such apps in coming years.
I'm honestly more concerned with maintenance costs more than building costs. In my experience the cost of the alpha release goes down with visual editing, but the cost of subsequent releases ramps up over time.
I too am curious about what you've built, feel free to email me (on my profile)...I have been working on Solvent (link in profile) and have been exploring Angular or Vue as the UI building component.
Yes, that's a very early version of the project from one year ago and before migrating to vue.js. I haven't updated the site or the demos since then, but the new one is coming next week.
> I think that drag-n-drop builders are definitely coming and will probably eliminate the need to write such apps in coming years.
People were saying that 10 years ago, they were saying it 20 years ago, the general attitude was even the inspiration for COBOL (that business people could write their own apps). Every single time it ends up being a disaster when it comes to slightly non-trivial use cases.
It's been tried and failed by companies large and small for decades. So what do you know or do differently that they didn't?
I am currently using Linode, but would move to AWS if they offer a cap. 2 years ago I signed up for the free AWS and forgot about it (didn't use it at all). Ended up costing ~60$ before I found out and since then I've avoided it.
I started small as a toy project, but gradually implemented full support for proper block context, flexbox layout, CSS variables, tables, etc. to the point where I have almost full support of all major CSS features (even math functions like calc(), min(), max()).
I'm cleaning up the code right now and will upload it later today or maybe tomorrow here: https://github.com/PureGoPDF
reply