HeadlinesBriefing HeadlinesBriefing 12 languages

A Modern Web App in C

Hacker News ·

🇬🇧 English

In 1994, a dynamic website meant writing a C program, placing it in a cgi-bin directory, and letting Apache fork it on each request. Thirty-two years later, the author shipped a commercial web product, marketyour.games, using fundamentally the same technology. The product includes user accounts, a search dashboard for content creators, folders for organizing them, payments through Stripe, and transactional emails through Postmark. It follows progressive enhancement and requires no JavaScript.

The stack is BCHS: OpenBSD, C, httpd, and SQLite. There is no framework, no templating language, and no separate database server. The C program reads CGI environment variables and outputs HTML directly. The binary is statically linked and deployed by replacing a single file, so new requests simply pick up the new version without a server restart or downtime. OpenBSD's pledge and unveil help secure the program, and httpd serves from a chroot. Dependencies are limited to libcurl for outbound requests, libsodium for identifiers, password hashing, and Stripe webhook verification, and libcjson for JSON parsing. A clean build takes a few seconds.

The author values CGI for its fundamentals over frameworks. The 1.1 specification, published in 2004, has not changed, and understanding HTTP is enough to understand CGI. It is language and platform agnostic, and it keeps a clear separation of concerns, with a single web server calling the business logic directly rather than reverse-proxying to a separate application server. Applications are ordinary programs that can be run from a shell and debugged with gdb.

The approach also offers minimal supply chain risk, a meaningful advantage given recent attacks on package repositories. With so few dependencies, there is less exposure to compromised packages. The author argues that CGI's decline was justified in 2004 but does not hold up in 2026, and that a modern web application can indeed be written in C.

View original article →


🇸🇦 العربية

بناء تطبيق ويب حديث بلغة C باستخدام CGI

في عام 1994، كان الموقع الديناميكي يعني كتابة برنامج بلغة C، ووضعه في مجلد cgi-bin، والسماح لـ Apache بتشغيله عبر fork مع كل طلب. وبعد اثنين وثلاثين عامًا، أطلق المؤلف منتج ويب تجاريًا، هو marketyour.games، باستخدام التقنية نفسها تقريبًا. يتضمن المنتج حسابات للمستخدمين، ولوحة بحث لمنشئي المحتوى، ومجلدات لتنظيمهم، ومدفوعات عبر Stripe، ورسائل بريد إلكتروني معاملاتية عبر Postmark. ويتبع المنتج مبدأ التحسين التدريجي ولا يتطلب JavaScript.

المكدس التقني هو BCHS: OpenBSD وC وhttpd وSQLite. لا يوجد إطار عمل، ولا لغة قوالب، ولا خادم قواعد بيانات منفصل. يقرأ برنامج C متغيرات بيئة CGI ويُخرج HTML مباشرة. الملف الثنائي مرتبط بشكل ثابت، ويُنشر باستبدال ملف واحد، فتستخدم الطلبات الجديدة النسخة الجديدة مباشرة دون إعادة تشغيل الخادم أو توقف الخدمة. وتساعد ميزتا pledge وunveil في OpenBSD على تأمين البرنامج، ويقدم httpd المحتوى من بيئة chroot. وتقتصر التبعيات على libcurl للطلبات الصادرة، وlibsodium للمعرّفات وتجزئة كلمات المرور والتحقق من webhooks الخاصة بـ Stripe، وlibcjson لتحليل JSON. ولا يستغرق البناء النظيف سوى بضع ثوانٍ.

يقدّر المؤلف CGI لأسسه أكثر من الأطر البرمجية. فالمواصفة 1.1، التي نُشرت عام 2004، لم تتغير، ويكفي فهم HTTP لفهم CGI. وهو مستقل عن اللغة والمنصة، ويحافظ على فصل واضح للمسؤوليات، إذ يستدعي خادم ويب واحد منطق العمل مباشرة بدلًا من التوجيه العكسي إلى خادم تطبيقات منفصل. والتطبيقات برامج عادية يمكن تشغيلها من الصدفة وتصحيح أخطائها باستخدام gdb.

كما يوفر هذا النهج مخاطر ضئيلة في سلسلة التوريد، وهي ميزة مهمة في ظل الهجمات الأخيرة على مستودعات الحزم. ومع عدد قليل جدًا من التبعيات، تقل فرص التعرض للحزم المخترقة. ويرى المؤلف أن تراجع CGI كان مبررًا عام 2004 لكنه لا يصمد في عام 2026، وأن تطبيق ويب حديثًا يمكن كتابته فعلًا بلغة C.

هل يمكن فعلًا بناء تطبيق ويب حديث بلغة C باستخدام CGI؟

نعم. أطلق المؤلف منتج marketyour.games، وهو منتج تجاري يضم حسابات مستخدمين ومدفوعات وبريدًا إلكترونيًا، باستخدام ملف C ثنائي واحد وSQLite وCGI يُقدَّم عبر httpd في OpenBSD.

العربية version →


🇧🇩 বাংলা

CGI ব্যবহার করে C-তে একটি আধুনিক ওয়েব অ্যাপ তৈরি

১৯৯৪ সালে একটি ডায়নামিক ওয়েবসাইট মানে ছিল একটি C প্রোগ্রাম লেখা, সেটি cgi-bin ডিরেক্টরিতে রাখা, এবং প্রতিটি অনুরোধে Apache-কে সেটি fork করতে দেওয়া। বত্রিশ বছর পর, লেখক মূলত একই প্রযুক্তি ব্যবহার করে একটি বাণিজ্যিক ওয়েব পণ্য, marketyour.games, প্রকাশ করেছেন। এই পণ্যে আছে ব্যবহারকারী অ্যাকাউন্ট, কন্টেন্ট নির্মাতাদের জন্য একটি অনুসন্ধান ড্যাশবোর্ড, সেগুলো সাজানোর জন্য ফোল্ডার, Stripe-এর মাধ্যমে পেমেন্ট, এবং Postmark-এর মাধ্যমে লেনদেনভিত্তিক ইমেল। এটি প্রগ্রেসিভ এনহ্যান্সমেন্ট অনুসরণ করে এবং এর জন্য JavaScript প্রয়োজন হয় না।

এই স্ট্যাকের নাম BCHS: OpenBSD, C, httpd এবং SQLite। এখানে কোনো ফ্রেমওয়ার্ক, কোনো টেমপ্লেটিং ভাষা, বা আলাদা কোনো ডেটাবেস সার্ভার নেই। C প্রোগ্রামটি CGI এনভায়রনমেন্ট ভেরিয়েবল পড়ে এবং সরাসরি HTML আউটপুট দেয়। বাইনারিটি স্ট্যাটিকভাবে লিঙ্ক করা এবং একটি একক ফাইল প্রতিস্থাপন করে স্থাপন করা হয়, তাই নতুন অনুরোধগুলো সার্ভার রিস্টার্ট বা ডাউনটাইম ছাড়াই নতুন সংস্করণ ব্যবহার করে। OpenBSD-এর pledge ও unveil প্রোগ্রামটিকে সুরক্ষিত রাখতে সাহায্য করে, এবং httpd একটি chroot থেকে পরিবেশন করে। নির্ভরতা সীমিত: আউটবাউন্ড অনুরোধের জন্য libcurl, শনাক্তকারী, পাসওয়ার্ড হ্যাশিং ও Stripe webhook যাচাইয়ের জন্য libsodium, এবং JSON পার্সিংয়ের জন্য libcjson। একটি পরিষ্কার বিল্ডে কয়েক সেকেন্ড লাগে।

লেখক ফ্রেমওয়ার্কের চেয়ে CGI-এর মৌলিক বিষয়গুলোকে মূল্য দেন। ২০০৪ সালে প্রকাশিত ১.১ স্পেসিফিকেশন অপরিবর্তিত রয়েছে, এবং CGI বুঝতে HTTP বোঝাই যথেষ্ট। এটি ভাষা ও প্ল্যাটফর্ম-নিরপেক্ষ, এবং দায়িত্বের স্পষ্ট বিভাজন বজায় রাখে, যেখানে একটি ওয়েব সার্ভার আলাদা অ্যাপ্লিকেশন সার্ভারে রিভার্স-প্রক্সি না করে সরাসরি ব্যবসায়িক লজিক কল করে। অ্যাপ্লিকেশনগুলো সাধারণ প্রোগ্রাম যা শেল থেকে চালানো যায় এবং gdb দিয়ে ডিবাগ করা যায়।

এই পদ্ধতি সরবরাহ শৃঙ্খলের ঝুঁকিও ন্যূনতম রাখে, যা সাম্প্রতিক প্যাকেজ রিপোজিটরিতে আক্রমণের প্রেক্ষিতে একটি গুরুত্বপূর্ণ সুবিধা। খুব কম নির্ভরতা থাকায় আপসকৃত প্যাকেজের ঝুঁকি কম। লেখক যুক্তি দেন যে ২০০৪ সালে CGI-এর পতন যথার্থ ছিল, কিন্তু ২০২৬ সালে তা টেকে না, এবং একটি আধুনিক ওয়েব অ্যাপ্লিকেশন সত্যিই C-তে লেখা সম্ভব।

CGI ব্যবহার করে C-তে সত্যিই কি একটি আধুনিক ওয়েব অ্যাপ্লিকেশন তৈরি করা যায়?

হ্যাঁ। লেখক marketyour.games প্রকাশ করেছেন, যা ব্যবহারকারী অ্যাকাউন্ট, পেমেন্ট ও ইমেলসহ একটি বাণিজ্যিক পণ্য, এবং এটি একটি একক C বাইনারি, SQLite এবং OpenBSD-এর httpd-এর মাধ্যমে পরিবেশিত CGI ব্যবহার করে তৈরি।

বাংলা version →


🇩🇪 Deutsch

Eine moderne Web-App in C mit CGI entwickeln

Im Jahr 1994 bedeutete eine dynamische Website, ein C-Programm zu schreiben, es in ein cgi-bin-Verzeichnis zu legen und Apache es bei jeder Anfrage per fork ausführen zu lassen. Zweiunddreißig Jahre später hat der Autor mit marketyour.games ein kommerzielles Web-Produkt veröffentlicht, das im Grunde auf derselben Technologie beruht. Das Produkt umfasst Benutzerkonten, ein Suchdashboard für Content-Creator, Ordner zu deren Organisation, Zahlungen über Stripe und transaktionale E-Mails über Postmark. Es folgt dem Prinzip der progressiven Verbesserung und benötigt kein JavaScript.

Der Stack heißt BCHS: OpenBSD, C, httpd und SQLite. Es gibt kein Framework, keine Template-Sprache und keinen separaten Datenbankserver. Das C-Programm liest CGI-Umgebungsvariablen und gibt HTML direkt aus. Das Binary ist statisch gelinkt und wird durch Austausch einer einzigen Datei bereitgestellt, sodass neue Anfragen die neue Version ohne Serverneustart und Ausfallzeit verwenden. Die OpenBSD-Funktionen pledge und unveil helfen, das Programm abzusichern, und httpd liefert aus einem chroot aus. Abhängigkeiten sind auf libcurl für ausgehende Anfragen, libsodium für Identifikatoren, Passwort-Hashing und die Verifizierung von Stripe-Webhooks sowie libcjson für die JSON-Verarbeitung beschränkt. Ein sauberer Build dauert wenige Sekunden.

Der Autor schätzt CGI wegen seiner Grundlagen statt wegen Frameworks. Die 2004 veröffentlichte Spezifikation 1.1 hat sich nicht verändert, und wer HTTP versteht, versteht auch CGI. Es ist sprach- und plattformunabhängig und bewahrt eine klare Trennung der Zuständigkeiten: Ein einzelner Webserver ruft die Geschäftslogik direkt auf, statt per Reverse-Proxy an einen separaten Anwendungsserver weiterzuleiten. Anwendungen sind gewöhnliche Programme, die sich aus einer Shell starten und mit gdb debuggen lassen.

Dieser Ansatz bietet außerdem ein minimales Risiko in der Lieferkette, ein wichtiger Vorteil angesichts aktueller Angriffe auf Paket-Repositories. Mit so wenigen Abhängigkeiten ist die Gefahr durch kompromittierte Pakete geringer. Der Autor argumentiert, dass der Niedergang von CGI 2004 gerechtfertigt war, sich 2026 aber nicht mehr halten lässt und eine moderne Web-Anwendung tatsächlich in C geschrieben werden kann.

Lässt sich mit CGI tatsächlich eine moderne Web-Anwendung in C entwickeln?

Ja. Der Autor hat marketyour.games veröffentlicht, ein kommerzielles Produkt mit Benutzerkonten, Zahlungen und E-Mail, das mit einem einzigen C-Binary, SQLite und über den httpd von OpenBSD ausgelieferten CGI entwickelt wurde.

Deutsch version →


🇪🇸 Español

Cómo crear una aplicación web moderna en C con CGI

En 1994, un sitio web dinámico significaba escribir un programa en C, colocarlo en un directorio cgi-bin y dejar que Apache lo ejecutara con fork en cada solicitud. Treinta y dos años después, el autor lanzó un producto web comercial, marketyour.games, utilizando básicamente la misma tecnología. El producto incluye cuentas de usuario, un panel de búsqueda para creadores de contenido, carpetas para organizarlos, pagos a través de Stripe y correos transaccionales mediante Postmark. Sigue el principio de mejora progresiva y no requiere JavaScript.

La pila tecnológica es BCHS: OpenBSD, C, httpd y SQLite. No hay framework, ni lenguaje de plantillas, ni servidor de base de datos independiente. El programa en C lee las variables de entorno de CGI y genera HTML directamente. El binario está enlazado estáticamente y se despliega reemplazando un único archivo, de modo que las nuevas solicitudes usan la nueva versión sin reiniciar el servidor ni sufrir tiempo de inactividad. Las funciones pledge y unveil de OpenBSD ayudan a proteger el programa, y httpd sirve el contenido desde un chroot. Las dependencias se limitan a libcurl para las solicitudes salientes, libsodium para los identificadores, el hash de contraseñas y la verificación de webhooks de Stripe, y libcjson para el análisis de JSON. Una compilación limpia tarda unos segundos.

El autor valora CGI por sus fundamentos más que por los frameworks. La especificación 1.1, publicada en 2004, no ha cambiado, y comprender HTTP basta para entender CGI. Es independiente del lenguaje y de la plataforma, y mantiene una separación clara de responsabilidades, con un único servidor web que llama directamente a la lógica de negocio en lugar de actuar como proxy inverso hacia un servidor de aplicaciones separado. Las aplicaciones son programas ordinarios que pueden ejecutarse desde una shell y depurarse con gdb.

El enfoque también ofrece un riesgo mínimo en la cadena de suministro, una ventaja significativa tras los recientes ataques a los repositorios de paquetes. Con tan pocas dependencias, hay menos exposición a paquetes comprometidos. El autor sostiene que el declive de CGI estaba justificado en 2004, pero no se sostiene en 2026, y que una aplicación web moderna sí puede escribirse en C.

¿Realmente se puede construir una aplicación web moderna en C usando CGI?

Sí. El autor lanzó marketyour.games, un producto comercial con cuentas de usuario, pagos y correo electrónico, usando un único binario en C, SQLite y CGI servido mediante httpd de OpenBSD.

Español version →


🇫🇷 Français

Créer une application web moderne en C avec CGI

En 1994, un site web dynamique consistait à écrire un programme en C, à le placer dans un répertoire cgi-bin et à laisser Apache le forker à chaque requête. Trente-deux ans plus tard, l'auteur a lancé un produit web commercial, marketyour.games, reposant fondamentalement sur la même technologie. Le produit comprend des comptes utilisateurs, un tableau de bord de recherche pour les créateurs de contenu, des dossiers pour les organiser, des paiements via Stripe et des e-mails transactionnels via Postmark. Il suit le principe de l'amélioration progressive et ne nécessite aucun JavaScript.

La pile technique est BCHS : OpenBSD, C, httpd et SQLite. Il n'y a ni framework, ni langage de templates, ni serveur de base de données séparé. Le programme C lit les variables d'environnement CGI et produit directement du HTML. Le binaire est lié statiquement et déployé en remplaçant un seul fichier : les nouvelles requêtes utilisent simplement la nouvelle version, sans redémarrage du serveur ni interruption de service. Les fonctions pledge et unveil d'OpenBSD contribuent à sécuriser le programme, et httpd sert les contenus depuis un chroot. Les dépendances se limitent à libcurl pour les requêtes sortantes, libsodium pour les identifiants, le hachage des mots de passe et la vérification des webhooks Stripe, et libcjson pour l'analyse JSON. Une compilation complète ne prend que quelques secondes.

L'auteur apprécie CGI pour ses fondamentaux plutôt que pour les frameworks. La spécification 1.1, publiée en 2004, n'a pas changé, et comprendre HTTP suffit à comprendre CGI. Elle est indépendante du langage et de la plateforme, et préserve une séparation claire des responsabilités : un seul serveur web appelle directement la logique métier, au lieu de faire du reverse proxy vers un serveur d'applications distinct. Les applications sont des programmes ordinaires qu'on peut exécuter depuis un shell et déboguer avec gdb.

Cette approche offre également un risque minimal sur la chaîne d'approvisionnement, un avantage notable au vu des récentes attaques contre les dépôts de paquets. Avec si peu de dépendances, l'exposition à des paquets compromis est réduite. L'auteur soutient que le déclin de CGI était justifié en 2004, mais qu'il ne tient plus en 2026, et qu'une application web moderne peut effectivement être écrite en C.

Peut-on vraiment créer une application web moderne en C avec CGI ?

Oui. L'auteur a lancé marketyour.games, un produit commercial doté de comptes utilisateurs, de paiements et d'e-mails, en utilisant un seul binaire C, SQLite et CGI servi par httpd d'OpenBSD.

Français version →


🇮🇳 हिन्दी

CGI के साथ C में एक आधुनिक वेब ऐप बनाना

1994 में, एक गतिशील वेबसाइट का मतलब था एक C प्रोग्राम लिखना, उसे cgi-bin डायरेक्टरी में रखना, और Apache को हर अनुरोध पर उसे fork करने देना। बत्तीस साल बाद, लेखक ने मूल रूप से उसी तकनीक का उपयोग करके एक वाणिज्यिक वेब उत्पाद, marketyour.games, जारी किया। इस उत्पाद में उपयोगकर्ता खाते, कंटेंट क्रिएटर्स के लिए एक खोज डैशबोर्ड, उन्हें व्यवस्थित करने के लिए फ़ोल्डर, Stripe के माध्यम से भुगतान, और Postmark के जरिए ट्रांजेक्शनल ईमेल शामिल हैं। यह प्रोग्रेसिव एन्हांसमेंट का पालन करता है और इसके लिए JavaScript की आवश्यकता नहीं है।

स्टैक BCHS है: OpenBSD, C, httpd और SQLite। इसमें कोई फ्रेमवर्क, कोई टेम्पलेटिंग भाषा, और कोई अलग डेटाबेस सर्वर नहीं है। C प्रोग्राम CGI एनवायरनमेंट वेरिएबल पढ़ता है और सीधे HTML आउटपुट करता है। बाइनरी स्टेटिकली लिंक्ड है और एक ही फ़ाइल को बदलकर तैनात की जाती है, इसलिए नए अनुरोध सर्वर को रीस्टार्ट किए बिना या डाउनटाइम के बिना नया संस्करण अपने आप उठा लेते हैं। OpenBSD के pledge और unveil प्रोग्राम को सुरक्षित रखने में मदद करते हैं, और httpd एक chroot से सेवा देता है। निर्भरताएं सीमित हैं: आउटबाउंड अनुरोधों के लिए libcurl, पहचानकर्ताओं, पासवर्ड हैशिंग और Stripe webhook सत्यापन के लिए libsodium, और JSON पार्सिंग के लिए libcjson। एक साफ़ बिल्ड में कुछ सेकंड लगते हैं।

लेखक फ्रेमवर्क के बजाय CGI के मूल सिद्धांतों को महत्व देते हैं। 2004 में प्रकाशित 1.1 विनिर्देश में कोई बदलाव नहीं हुआ है, और CGI को समझने के लिए HTTP को समझना पर्याप्त है। यह भाषा और प्लेटफ़ॉर्म से स्वतंत्र है, और यह कार्यों के स्पष्ट विभाजन को बनाए रखता है, जिसमें एक ही वेब सर्वर सीधे बिज़नेस लॉजिक को कॉल करता है, न कि किसी अलग एप्लिकेशन सर्वर पर रिवर्स-प्रॉक्सी करता है। एप्लिकेशन साधारण प्रोग्राम हैं जिन्हें शेल से चलाया जा सकता है और gdb से डीबग किया जा सकता है।

यह दृष्टिकोण सप्लाई चेन जोखिम को भी न्यूनतम रखता है, जो हाल के पैकेज रिपॉजिटरी हमलों को देखते हुए एक महत्वपूर्ण लाभ है। बहुत कम निर्भरताएं होने से समझौता किए गए पैकेजों का खतरा कम होता है। लेखक का तर्क है कि 2004 में CGI का पतन उचित था, लेकिन 2026 में यह तर्क टिकता नहीं, और एक आधुनिक वेब एप्लिकेशन वास्तव में C में लिखा जा सकता है।

क्या CGI का उपयोग करके C में सचमुच एक आधुनिक वेब एप्लिकेशन बनाया जा सकता है?

हाँ। लेखक ने marketyour.games जारी किया, जो उपयोगकर्ता खातों, भुगतान और ईमेल वाला एक वाणिज्यिक उत्पाद है, जिसे एक एकल C बाइनरी, SQLite और OpenBSD के httpd के माध्यम से दिए गए CGI का उपयोग करके बनाया गया है।

हिन्दी version →


🇮🇩 Bahasa Indonesia

Membangun Aplikasi Web Modern di C dengan CGI

Pada tahun 1994, situs web dinamis berarti menulis program C, menempatkannya di direktori cgi-bin, dan membiarkan Apache melakukan fork terhadapnya pada setiap permintaan. Tiga puluh dua tahun kemudian, penulis merilis produk web komersial, marketyour.games, dengan menggunakan teknologi yang pada dasarnya sama. Produk ini mencakup akun pengguna, dasbor pencarian untuk kreator konten, folder untuk mengatur mereka, pembayaran melalui Stripe, dan email transaksional melalui Postmark. Produk ini mengikuti prinsip progressive enhancement dan tidak memerlukan JavaScript.

Tumpukan teknologinya disebut BCHS: OpenBSD, C, httpd, dan SQLite. Tidak ada framework, bahasa templating, ataupun server basis data terpisah. Program C membaca variabel lingkungan CGI dan langsung mengeluarkan HTML. Binary-nya ditautkan secara statis dan diterapkan dengan mengganti satu file, sehingga permintaan baru langsung menggunakan versi baru tanpa perlu memulai ulang server atau mengalami downtime. Fitur pledge dan unveil dari OpenBSD membantu mengamankan program, dan httpd melayani dari chroot. Dependensinya terbatas pada libcurl untuk permintaan keluar, libsodium untuk pengidentifikasi, hashing kata sandi, dan verifikasi webhook Stripe, serta libcjson untuk pengurai JSON. Build bersih membutuhkan waktu beberapa detik.

Penulis menghargai CGI karena dasar-dasarnya, bukan framework. Spesifikasi 1.1 yang diterbitkan pada 2004 tidak berubah, dan memahami HTTP sudah cukup untuk memahami CGI. CGI bersifat agnostik terhadap bahasa dan platform, serta menjaga pemisahan tanggung jawab yang jelas, dengan satu web server yang memanggil logika bisnis secara langsung, alih-alih melakukan reverse-proxy ke server aplikasi terpisah. Aplikasinya adalah program biasa yang bisa dijalankan dari shell dan di-debug dengan gdb.

Pendekatan ini juga menawarkan risiko rantai pasokan yang minimal, sebuah keunggulan penting mengingat serangan terbaru terhadap repositori paket. Dengan dependensi yang sangat sedikit, paparan terhadap paket yang disusupi menjadi lebih kecil. Penulis berargumen bahwa kemunduran CGI pada 2004 memang beralasan, tetapi tidak lagi berlaku pada 2026, dan aplikasi web modern memang dapat ditulis dalam C.

Apakah benar aplikasi web modern dapat dibangun dengan C menggunakan CGI?

Ya. Penulis merilis marketyour.games, produk komersial dengan akun pengguna, pembayaran, dan email, menggunakan satu binary C, SQLite, dan CGI yang disajikan melalui httpd OpenBSD.

Bahasa Indonesia version →


🇯🇵 日本語

CGIでC言語によるモダンなWebアプリを構築する

1994年に動的なウェブサイトを作るということは、C言語のプログラムを書き、それをcgi-binディレクトリに置き、リクエストごとにApacheにforkさせることを意味していました。それから32年後、著者はほぼ同じ技術を使って商用のウェブ製品marketyour.gamesを公開しました。この製品には、ユーザーアカウント、コンテンツクリエイター向けの検索ダッシュボード、それらを整理するためのフォルダ、Stripeによる決済、Postmarkによるトランザクションメールが含まれています。プログレッシブエンハンスメントに従っており、JavaScriptは不要です。

スタックはBCHSと呼ばれ、OpenBSD、C、httpd、SQLiteで構成されています。フレームワーク、テンプレート言語、独立したデータベースサーバーはありません。C言語のプログラムはCGI環境変数を読み取り、HTMLを直接出力します。バイナリは静的リンクされ、1つのファイルを置き換えるだけでデプロイできるため、サーバーを再起動したりダウンタイムを発生させたりすることなく、新しいリクエストが新バージョンを使用します。OpenBSDのpledgeとunveilがプログラムの保護に役立ち、httpdはchroot環境から配信します。依存関係は、外向きリクエスト用のlibcurl、識別子・パスワードハッシュ・Stripe webhookの検証用のlibsodium、JSON解析用のlibcjsonに限られています。クリーンビルドは数秒で完了します。

著者はフレームワークよりもCGIの基礎的な仕組みを重視しています。2004年に公開された1.1仕様は変更されておらず、CGIを理解するにはHTTPを理解すれば十分です。CGIは言語やプラットフォームに依存せず、関心の分離を明確に保ちます。単一のウェブサーバーが、別のアプリケーションサーバーへリバースプロキシするのではなく、ビジネスロジックを直接呼び出します。アプリケーションは、シェルから実行でき、gdbでデバッグできる通常のプログラムです。

このアプローチはサプライチェーンのリスクも最小限に抑えます。近年のパッケージリポジトリへの攻撃を考えると、これは大きな利点です。依存関係が極めて少ないため、改ざんされたパッケージにさらされる危険性が低くなります。著者は、CGIの衰退は2004年当時には妥当だったものの、2026年の現在では成り立たず、モダンなウェブアプリケーションは実際にC言語で書けると主張しています。

CGIを使えば、本当にC言語でモダンなウェブアプリケーションを構築できるのですか?

はい。著者は、ユーザーアカウント、決済、メール機能を備えた商用製品marketyour.gamesを、単一のC言語バイナリ、SQLite、そしてOpenBSDのhttpdで配信されるCGIを使って公開しました。

日本語 version →


🇧🇷 Português

Criando um aplicativo web moderno em C com CGI

Em 1994, um site dinâmico significava escrever um programa em C, colocá-lo em um diretório cgi-bin e deixar o Apache executá-lo com fork a cada requisição. Trinta e dois anos depois, o autor lançou um produto web comercial, o marketyour.games, usando basicamente a mesma tecnologia. O produto inclui contas de usuário, um painel de busca para criadores de conteúdo, pastas para organizá-los, pagamentos pelo Stripe e e-mails transacionais pelo Postmark. Ele segue a melhoria progressiva e não exige JavaScript.

A stack é BCHS: OpenBSD, C, httpd e SQLite. Não há framework, linguagem de templates nem servidor de banco de dados separado. O programa em C lê as variáveis de ambiente do CGI e gera HTML diretamente. O binário é linkado estaticamente e implantado substituindo um único arquivo, de modo que novas requisições simplesmente usam a nova versão, sem reinício do servidor ou indisponibilidade. Os recursos pledge e unveil do OpenBSD ajudam a proteger o programa, e o httpd serve a partir de um chroot. As dependências se limitam ao libcurl para requisições de saída, ao libsodium para identificadores, hash de senhas e verificação de webhooks do Stripe, e ao libcjson para análise de JSON. Uma compilação limpa leva alguns segundos.

O autor valoriza o CGI por seus fundamentos, e não por frameworks. A especificação 1.1, publicada em 2004, não mudou, e entender HTTP basta para entender CGI. Ela é independente de linguagem e plataforma, e mantém uma separação clara de responsabilidades, com um único servidor web chamando diretamente a lógica de negócio em vez de fazer proxy reverso para um servidor de aplicações separado. As aplicações são programas comuns que podem ser executados a partir de um shell e depurados com o gdb.

A abordagem também oferece risco mínimo na cadeia de suprimentos, uma vantagem importante diante de ataques recentes a repositórios de pacotes. Com tão poucas dependências, há menos exposição a pacotes comprometidos. O autor argumenta que o declínio do CGI era justificado em 2004, mas não se sustenta em 2026, e que um aplicativo web moderno pode de fato ser escrito em C.

É realmente possível criar um aplicativo web moderno em C usando CGI?

Sim. O autor lançou o marketyour.games, um produto comercial com contas de usuário, pagamentos e e-mail, usando um único binário em C, SQLite e CGI servido pelo httpd do OpenBSD.

Português version →


🇷🇺 Русский

Создание современного веб-приложения на C с CGI

В 1994 году динамический сайт означал написание программы на C, размещение её в каталоге cgi-bin и позволение Apache запускать её через fork при каждом запросе. Тридцать два года спустя автор выпустил коммерческий веб-продукт marketyour.games, использующий по сути ту же технологию. Продукт включает учётные записи пользователей, поисковую панель для создателей контента, папки для их организации, платежи через Stripe и транзакционные письма через Postmark. Он следует принципу прогрессивного улучшения и не требует JavaScript.

Стек называется BCHS: OpenBSD, C, httpd и SQLite. Здесь нет фреймворка, языка шаблонов и отдельного сервера баз данных. Программа на C читает переменные окружения CGI и выводит HTML напрямую. Бинарный файл статически скомпонован и развёртывается заменой одного файла, поэтому новые запросы сразу используют новую версию без перезапуска сервера и простоя. Функции pledge и unveil в OpenBSD помогают защитить программу, а httpd обслуживает контент из chroot. Зависимости ограничены libcurl для исходящих запросов, libsodium для идентификаторов, хеширования паролей и проверки webhook Stripe, а также libcjson для разбора JSON. Чистая сборка занимает несколько секунд.

Автор ценит CGI за его основы, а не за фреймворки. Спецификация 1.1, опубликованная в 2004 году, не менялась, и для понимания CGI достаточно знать HTTP. Он не зависит от языка и платформы и сохраняет чёткое разделение ответственности: один веб-сервер напрямую вызывает бизнес-логику, а не проксирует запросы на отдельный сервер приложений. Приложения представляют собой обычные программы, которые можно запускать из командной оболочки и отлаживать с помощью gdb.

Такой подход также даёт минимальный риск для цепочки поставок, что особенно важно на фоне недавних атак на репозитории пакетов. При таком малом числе зависимостей меньше вероятность попадания скомпрометированных пакетов. Автор утверждает, что упадок CGI был оправдан в 2004 году, но не выдерживает критики в 2026 году, и современное веб-приложение действительно можно написать на C.

Действительно ли можно создать современное веб-приложение на C с помощью CGI?

Да. Автор выпустил marketyour.games, коммерческий продукт с учётными записями пользователей, платежами и электронной почтой, созданный с использованием одного бинарного файла на C, SQLite и CGI, обслуживаемого через httpd OpenBSD.

Русский version →


🇨🇳 简体中文

使用CGI构建现代Web应用:C语言实践

1994年,动态网站意味着编写一个C程序,将其放入cgi-bin目录,并让Apache为每个请求fork它。三十二年后,作者使用基本相同的技术发布了一款商业Web产品marketyour.games。该产品包括用户账户、面向内容创作者的搜索仪表板、用于整理内容的文件夹、通过Stripe完成的支付,以及通过Postmark发送的事务性邮件。它遵循渐进式增强原则,无需JavaScript。

其技术栈为BCHS:OpenBSD、C、httpd和SQLite。没有框架,没有模板语言,也没有独立的数据库服务器。C程序读取CGI环境变量并直接输出HTML。该二进制文件为静态链接,通过替换单个文件进行部署,因此新请求会直接使用新版本,无需重启服务器,也不会造成停机。OpenBSD的pledge和unveil有助于保护程序安全,httpd则在chroot环境中提供服务。依赖项仅限于用于出站请求的libcurl、用于标识符、密码哈希和Stripe webhook验证的libsodium,以及用于JSON解析的libcjson。一次完整的干净构建只需几秒钟。

作者看重CGI的基础性而非框架。发布于2004年的1.1规范至今未变,理解HTTP便足以理解CGI。它与语言和平台无关,并保持清晰的关注点分离:单一Web服务器直接调用业务逻辑,而不是反向代理到独立的应用服务器。应用程序就是可以在shell中运行、并用gdb调试的普通程序。

这种方法还将供应链风险降至最低,这在近期针对软件包仓库的攻击背景下尤为有价值。依赖项越少,遭到恶意软件包入侵的风险敞口就越小。作者认为,CGI在2004年式微是有道理的,但在2026年已站不住脚,并主张现代Web应用确实可以用C语言编写。

真的可以用C语言和CGI构建现代Web应用吗?

可以。作者使用单个C二进制文件、SQLite以及通过OpenBSD的httpd提供的CGI,发布了marketyour.games这一商业产品,其中包括用户账户、支付和邮件功能。

简体中文 version →