{"id":8408,"date":"2026-10-26T15:01:38","date_gmt":"2026-10-26T15:01:38","guid":{"rendered":"https:\/\/robertjwallace.com\/?p=8408"},"modified":"2026-10-26T15:06:55","modified_gmt":"2026-10-26T15:06:55","slug":"building-a-newsletter-builder","status":"publish","type":"post","link":"https:\/\/robertjwallace.com\/es\/building-a-newsletter-builder\/","title":{"rendered":"Building a Newsletter Builder"},"content":{"rendered":"<p class=\"wp-block-paragraph\">One of the programs I have been working on is a newsletter builder. The idea is fairly simple: take a folder of Word documents and photographs and turn it into a club newsletter, with a consistent layout and a PDF ready to distribute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A newsletter involves quite a bit of repetitive work. Articles arrive as separate documents, pictures may be embedded in those documents or supplied separately, and the club information needs to appear in every issue. Then there are headlines, captions, page numbers, and all the little adjustments that make the result look finished.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This seemed like a useful project for AI-assisted programming.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">From Word documents to pages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The builder reads the articles from a folder and extracts their text and embedded pictures. In the browser interface I can arrange the articles, edit the text, choose photographs, and preview the newsletter.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large foobox\" data-foobox-trigger=\"image\"><a href=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles.webp\"><img decoding=\"async\" width=\"1024\" height=\"576\" data-src=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles-1024x576.webp\" alt=\"\" class=\"wp-image-8409 lazyload\" data-srcset=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles-1024x576.webp 1024w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles-300x169.webp 300w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles-768x432.webp 768w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles-18x10.webp 18w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/articles.webp 1265w\" data-sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/576;\"><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>The article workspace, using my \u201cStill Making Things\u201d example newsletter. Articles are arranged on the left, with extracted and uploaded pictures on the right.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is a separate area for the club\u2019s regular material: its logo, officers, standing text, and back pages. Fonts, colours, and other style settings can be reused across issues. The cover has its own headline controls, including alignment and font size.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Although the interface opens in a browser, the program runs locally on the computer. The browser is the control panel. The application itself is written in Rust, and Typst handles the page layout and PDF generation.  The AI made this choice because I asked for the program to be compatible on Macs, Linux and Windows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The small details matter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Much of the recent work has been on the things that become obvious when you actually use the program.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Photographs can be cropped, rotated, brightened, and adjusted for contrast. I added padding around images and made the club logo editable through the same controls. These changes preserve the original image, so trying a different crop does not destroy the starting point.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large foobox\" data-foobox-trigger=\"image\"><a href=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor.webp\"><img decoding=\"async\" width=\"1024\" height=\"576\" data-src=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor-1024x576.webp\" alt=\"\" class=\"wp-image-8410 lazyload\" data-srcset=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor-1024x576.webp 1024w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor-300x169.webp 300w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor-768x432.webp 768w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor-18x10.webp 18w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/photo-editor.webp 1265w\" data-sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/576;\"><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Editing a picture extracted from a Word article: size, alignment, placement, cropping, brightness, contrast, and padding are controlled in one place.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The font controls needed attention too. The program could find the installed fonts, but the dropdowns made it look as though only the defaults were available. Fixing the interface made those choices accessible. This was a simple ask to the AI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Another problem appeared in the PDF page numbering. That turned out to involve a layout decision that could change its own position as the document was composed. The fix needed testing with both ordinary pages and overflowing club information. Getting a document to look right once is useful; getting it to behave when the content changes is the real test.  This illustrated a couple of things, first was that the AI did its own unit tests, but they were mostly for errors that stopped the program, I still had to proof the output.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">More than a PDF<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The builder can also export a Word document for proofreading and files for further work in a page-layout application. An issue can be saved with its articles, photographs, and settings together, ready to reopen later. In addition, it outputs a file that can be imported into Adobe Indesign or the opensource layout program Scribus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large foobox\" data-foobox-trigger=\"image\"><a href=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview.webp\"><img decoding=\"async\" width=\"1024\" height=\"576\" data-src=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview-1024x576.webp\" alt=\"\" class=\"wp-image-8411 lazyload\" data-srcset=\"https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview-1024x576.webp 1024w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview-300x169.webp 300w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview-768x432.webp 768w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview-18x10.webp 18w, https:\/\/robertjwallace-images.s3.us-east-2.amazonaws.com\/wp-content\/uploads\/2026\/10\/pdf-preview.webp 1265w\" data-sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/576;\"><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>The six-page example in the PDF preview, showing its cover and regular club information page.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I am putting together an example newsletter featuring some of my other software projects. That gives me actual articles and pictures to work with, and a practical way to find what still needs improving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is still a work in progress, but it is becoming a useful tool. It also illustrates what I find interesting about working with AI on software: I can start with a specific problem, build something that addresses it, and then refine it by using it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>One of the programs I have been working on is a newsletter builder. The idea is fairly simple: take a folder of Word documents and photographs and turn it into a club newsletter, with a consistent layout and a PDF ready to distribute. A newsletter involves quite a bit of repetitive work. Articles arrive as &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/robertjwallace.com\/es\/building-a-newsletter-builder\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> &#8220;Building a Newsletter Builder&#8221;<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","_eb_attr":"","footnotes":""},"categories":[171,143],"tags":[],"class_list":["post-8408","post","type-post","status-publish","format-standard","hentry","category-ai","category-computer-stuff"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Bob","author_link":"https:\/\/robertjwallace.com\/es\/author\/admin\/"},"_links":{"self":[{"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/posts\/8408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/comments?post=8408"}],"version-history":[{"count":3,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/posts\/8408\/revisions"}],"predecessor-version":[{"id":8416,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/posts\/8408\/revisions\/8416"}],"wp:attachment":[{"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/media?parent=8408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/categories?post=8408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robertjwallace.com\/es\/wp-json\/wp\/v2\/tags?post=8408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}