Adam Grudziński

Other projects ·

Duostrings: offers, emails and one mistake I will not repeat

Duostrings is the website of a music duo that I built from scratch. It is where I first prepared offers and sent them from an address on my own domain. Along the way I also made a mistake: I sent offers by email without knowing that doing so without the recipient's consent is not allowed.

Jump to the article

A music duo needs a few things online: a place where people can see and hear how it plays, a repertoire, information about available dates and an easy way to ask for an offer. I started with an ordinary business card site like that, and ended up with a website that has a panel for managing its content, a library of photos and recordings, PDF offers and email sending. Looking back, Duostrings is where I learned many of the things that today make up Panel Biznesu.

The beginning, or a server problem again

The first version of the site was built at the beginning of February 2026 and went onto the same free hosting service that Algebra was using at the time. On the very first day I wanted the contact form to send me an email through a Gmail inbox. I changed the way it connected to the inbox and extended the waiting time, but nothing helped, until it turned out that the free version of that service simply blocks sending mail this way. That same day I switched emails off, and later I moved the whole site to Cloudflare, a company that provides space for websites and their data.

After the move, the site content and enquiries went into a database, and photos, recordings and files into separate storage, both at Cloudflare. This time the data lived outside the application from the start, not on its disk, as it once had with bookings in Algebra. The site runs on servers spread around the world, so it answers each visitor from somewhere close to them.

Content you can change without a programmer

A musicians' website is alive: dates, repertoire, recordings and concert photos keep changing. I did not want every such change to require a fix in the code, so the site got its own management panel. You edit the content there like in an ordinary text editor, photos and videos go into a library, and every piece in the repertoire has a short, forty-five-second sample. There is also an availability calendar, where a visitor can see straight away whether a date is free, and a switch between the duo's site and a separate wedding offer.

In May I added saving all the content to a Word file and loading it back. It sounds like a small thing, but it lets you correct all the texts at once in a comfortable editor and upload them with one click.

I had a similar idea earlier in Algebra, where the price list was a separate file that I changed without touching the rest of the site. With Duostrings I went further, because now everything could be edited. From a panel like that to Panel Biznesu, where the owner of any small business changes the content of their own website, turned out to be a short road.

Photos and videos that adapt themselves

With a site full of recordings, you quickly find that photos and videos are the heaviest part of it. That is when I came across a service that stores them and serves each device a version in the right size and format: a phone gets a smaller photo than a monitor, and the browser gets the format it handles best. From mid-May all new files went there, and the existing storage served as a backup. Old file addresses led automatically to the new ones, so not a single link on the site broke.

Videos also needed processing, so I set up a separate server in Oracle's cloud for that, which prepared the recordings and sent back the finished file. It worked well, but the number of parts that had to work together kept growing: the site, file storage, the photo and video service, the video server and a job queue between them. At the end of June I simplified all of it. The photo service and the processing server went, and today files go through the site itself straight into storage. The price was a lower file size limit in the library, but every part that is not there is a part that cannot break.

Offers in PDF

I learned the most from the offers. The panel got an offer editor that works like an ordinary word processor, with several ready-made layouts to choose from, settings for how the text looks and a button that fits the whole thing onto an A4 page. Each recipient gets their own PDF file with the date, place and type of event, and the PDF is created in the browser itself, without any outside service. In June German versions arrived: the site in German, offer layouts in the panel and offers with prices in euros, because some events take place on the other side of the border.

Emails from my own address

Offers meant emails too, and not from a private inbox but from an address on the site's domain. Mail coming in to the contact address lands in an ordinary inbox, while outgoing mail goes through a service that sends email on the site's behalf. To keep such mail out of spam, the domain needs an electronic signature that tells the recipient's server the email really came from that domain. Every enquiry from the form is saved, and I get a notification about it by email and on WhatsApp.

Then came campaigns: loading a contact list from a file, messages tailored to each recipient, and an invisible marker that tells you whether an email was opened and distinguishes a real open from automated systems that look into the email on their own, such as mail scanners. Sending ran into limits, because the free version of the email service accepts two emails per second and a hundred per day, and the site itself can only do a limited number of operations in one go. I ended up sending one email at a time, trying again when the server refused, with a default gap of two minutes so as not to spoil the domain's reputation with email providers.

A mistake I will not repeat

With the offers ready and sending working, I did what seemed natural to me: I emailed offers to venues that might be interested. I did not know then that in Poland sending a commercial offer by email requires the recipient's prior consent, even when the recipient is a business. Since November 2024 this has been governed by Poland's Electronic Communications Law, and so-called cold mailing, meaning sending offers to people who did not ask for them, can be penalised.

Technically everything worked flawlessly, and yet the whole campaign was a mistake. I learned from it and changed my approach: instead of sending offers where nobody had asked for them, the site got a separate page for venues with a form in which the owner asks for an offer themselves and agrees to be contacted. Only then does the PDF offer have someone to go to. It is a lesson no programming course will teach you: before you automate something, check whether you are allowed to do it at all.

The form for venues on the Duostrings website: venue details, email address and a consent box for receiving an offer
The form for venues: the owner asks for an offer themselves and ticks consent to be contacted, and only then receives the offer in PDF.

What stayed with me

From Duostrings I took away a whole set of things I had not known before: email from an address on my own domain, sending emails from a website, storing photos and recordings, creating documents in the browser and a panel where content changes without a programmer. I now build Panel Biznesu from the same building blocks, a place where a small business gets a website, PDF offers and contact with its customers all in one.