summaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to 'www')
-rw-r--r--www/.well-known/openpgpkey/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dpbin0 -> 427 bytes
-rw-r--r--www/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dpbin0 -> 427 bytes
-rw-r--r--www/.well-known/openpgpkey/luuduct.ai/policy0
-rw-r--r--www/.well-known/openpgpkey/policy0
-rw-r--r--www/form.css190
-rw-r--r--www/index.html153
-rw-r--r--www/message.html87
-rw-r--r--www/styles.css123
8 files changed, 553 insertions, 0 deletions
diff --git a/www/.well-known/openpgpkey/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp b/www/.well-known/openpgpkey/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp
new file mode 100644
index 0000000..f0fa994
--- /dev/null
+++ b/www/.well-known/openpgpkey/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp
Binary files differ
diff --git a/www/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp b/www/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp
new file mode 100644
index 0000000..f0fa994
--- /dev/null
+++ b/www/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp
Binary files differ
diff --git a/www/.well-known/openpgpkey/luuduct.ai/policy b/www/.well-known/openpgpkey/luuduct.ai/policy
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/www/.well-known/openpgpkey/luuduct.ai/policy
diff --git a/www/.well-known/openpgpkey/policy b/www/.well-known/openpgpkey/policy
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/www/.well-known/openpgpkey/policy
diff --git a/www/form.css b/www/form.css
new file mode 100644
index 0000000..e2e42ae
--- /dev/null
+++ b/www/form.css
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2026 Doan Luu Duc Tai <doan@luuduct.ai>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+.ascii-form-container {
+ width: 80ch;
+ max-width: 100%;
+ margin: 16px 0;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ box-sizing: border-box;
+}
+
+.ascii-box {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+}
+
+.ascii-bar {
+ font: inherit;
+ line-height: 1.2;
+ white-space: pre;
+ user-select: none;
+ color: inherit;
+}
+
+.ascii-body {
+ display: flex;
+ align-items: stretch;
+ min-height: 1.5em;
+ background-repeat: repeat-y;
+ background-position: left top, right top;
+ background-image:
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1ch' height='1.5em'><text x='0' y='1.15em' font-family='monospace' font-size='16px' fill='%23000000'>|</text></svg>"),
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1ch' height='1.5em'><text x='0' y='1.15em' font-family='monospace' font-size='16px' fill='%23000000'>|</text></svg>");
+}
+
+@media (prefers-color-scheme: dark) {
+ .ascii-body {
+ background-image:
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1ch' height='1.5em'><text x='0' y='1.15em' font-family='monospace' font-size='16px' fill='%23ffffff'>|</text></svg>"),
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1ch' height='1.5em'><text x='0' y='1.15em' font-family='monospace' font-size='16px' fill='%23ffffff'>|</text></svg>");
+ }
+}
+
+.ascii-content-padding {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: 0 2ch;
+ box-sizing: border-box;
+}
+
+.ascii-prompt {
+ color: #090;
+ font-weight: bold;
+ user-select: none;
+ margin-right: 1ch;
+}
+
+.ascii-input,
+.ascii-textarea {
+ appearance: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ background: transparent;
+ border: none;
+ outline: none;
+ font: inherit;
+ color: inherit;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+ box-sizing: border-box;
+ border-radius: 0;
+ line-height: 1.5;
+}
+
+.ascii-textarea {
+ display: block;
+ resize: none;
+ overflow-y: hidden;
+ min-height: 6em;
+ field-sizing: content;
+}
+
+.ascii-input::placeholder,
+.ascii-textarea::placeholder {
+ color: #666;
+ opacity: 0.7;
+}
+
+@media (prefers-color-scheme: dark) {
+ .ascii-prompt {
+ color: #0f0;
+ }
+ .ascii-input::placeholder,
+ .ascii-textarea::placeholder {
+ color: #555;
+ }
+}
+
+.ascii-actions {
+ display: flex;
+ gap: 2ch;
+ margin-top: 8px;
+}
+
+.ascii-btn {
+ appearance: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ background: transparent;
+ border: none;
+ outline: none;
+ font: inherit;
+ padding: 0;
+ margin: 0;
+ cursor: pointer;
+ white-space: pre;
+ font-weight: bold;
+}
+
+.ascii-btn-submit {
+ color: #090;
+}
+
+.ascii-btn-reset {
+ color: #a00;
+}
+
+.ascii-btn-submit:hover,
+.ascii-btn-submit:focus {
+ background: #090;
+ color: #fff;
+}
+
+.ascii-btn-reset:hover,
+.ascii-btn-reset:focus {
+ background: #a00;
+ color: #fff;
+}
+
+@media (prefers-color-scheme: dark) {
+ .ascii-btn-submit {
+ color: #0f0;
+ }
+ .ascii-btn-submit:hover,
+ .ascii-btn-submit:focus {
+ background: #0f0;
+ color: #000;
+ }
+ .ascii-btn-reset {
+ color: #f33;
+ }
+ .ascii-btn-reset:hover,
+ .ascii-btn-reset:focus {
+ background: #f33;
+ color: #000;
+ }
+}
+
+.ascii-status {
+ font: inherit;
+ color: #06c;
+ white-space: pre-wrap;
+ padding: 4px 0;
+ user-select: none;
+}
+
+@media (prefers-color-scheme: dark) {
+ .ascii-status {
+ color: #6cf;
+ }
+}
diff --git a/www/index.html b/www/index.html
new file mode 100644
index 0000000..f02c538
--- /dev/null
+++ b/www/index.html
@@ -0,0 +1,153 @@
+<!doctype html>
+<!--
+Copyright (C) 2026 Doan Luu Duc Tai <doan@luuduct.ai>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+-->
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <title>Doan Luu Duc Tai</title>
+
+ <link rel="stylesheet" href="styles.css">
+ </head>
+
+ <body>
+
+ <div id="page">
+
+ <div class="badge">[ JS-free ]</div>
+
+ <div id="content">
+
+ <pre>
+<a href="/" class="logo">
+ ____ ___ _ _ _
+| _ \ / _ \ / \ | \ | |
+| | | | | | |/ _ \ | \| |
+| |_| | |_| / ___ \| |\ |
+|____/ \___/_/ \_\_| \_| LUU DUC TAI
+</a>
+
+<a href="/">Home</a> <a href="#projects">Projects</a> <a href="#services">Services</a> <a href="#contact">Contact</a> <a href="message.html">Message Me</a>
+
+
++------------------------------------------------------------------------------+
+| |
+| Doan Luu Duc Tai |
+| |
+| Email: <a href="mailto:doan@luuduct.ai">doan@luuduct.ai</a> |
+| <a href="https://smp11.simplex.im/a#ikrTZ8sfleSZEifKV2wI8foAVwkbKfOoKc6TO2P4ZT8">SimpleX Chat</a> |
+| <a href="https://signal.me/#eu/Xr5_r_ei8UYUpd7Lus4536PnlKvW28LXBjg3Lb71BtFp4iDVXoRF4ZVPQYw_0Guk">Signal</a> |
+| |
+| GPG: <a href="https://openpgpkey.luuduct.ai/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp?l=doan">8990FFC0F9D95FAA4C04520BADF3DE23F687C623</a> |
+| Cv25519 |
+| |
++------------------------------------------------------------------------------+
+
+
+
+
+<span id="projects">Projects</span>
+________________________________________________________________________________
+
+
+<a href="https://git.doan.luuduct.ai/csprdg/">csprdg</a>
+ Conjecturally Secure Pseudo-Random Document Generator
+
+
+<a href="https://git.doan.luuduct.ai/csprsg/">csprsg</a>
+ Conjecturally Secure Pseudo-Random Spreadsheet Generator
+
+
+<a href="https://git.doan.luuduct.ai/fileshare/">fileshare</a>
+ LAN File Server
+
+
+<a href="https://git.doan.luuduct.ai/vfetch/">vfetch</a>
+ neofetch but the ascii part is a video
+
+
+
+
+<span id="services">Services</span>
+________________________________________________________________________________
+
+
+<a href="https://git.doan.luuduct.ai/">git.doan.luuduct.ai</a>
+* A <a href="https://git.zx2c4.com/cgit">cgit</a> instance, <span class="good">functional without JS</span>.
+
+ Personal Git repositories
+
+
+<a href="https://search.doan.luuduct.ai/">search.doan.luuduct.ai</a>
+* A <a href="https://github.com/searxng/searxng">SearXNG</a> instance, <span class="good">functional without JS</span>.
+
+ Private search engine
+
+
+<a href="https://meet.doan.luuduct.ai/">meet.doan.luuduct.ai</a>
+* A <a href="https://github.com/miroslavpejic85/mirotalk">MiroTalk</a> instance, <span class="warn" title="Practice your due diligence: read the source code, audit dependencies, and check what JavaScript is executed.">JS-required, non-<a href="https://www.gnu.org/software/librejs/index.html">LibreJS</a>-compliant</span>, <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPLv3</a>-licensed.
+
+ Video conferencing
+
+
+
+
+<span id="contact">Contact</span>
+________________________________________________________________________________
+ ___ ___ _ _ _ _ _ _ _ _ ___ _ _ ___ _____ _ ___
+| \ / _ \ /_\ | \| | | | | | | | | | | | \| | | |/ __| |_ _/_\ |_ _|
+| |) | (_) / _ \| .` | | |_| |_| | |_| | | |) | |_| | (__ | |/ _ \ | |
+|___/ \___/_/ \_\_|\_| |____\___/ \___/ |___/ \___/ \___| |_/_/ \_\___|
+
+
+
+Message:
+
+ <a href="message.html">[ Send Encrypted Message ]</a>
+
+
+Email:
+
+ <a href="mailto:doan@luuduct.ai">doan@luuduct.ai</a>
+
+
+GPG:
+
+ <a href="https://openpgpkey.luuduct.ai/.well-known/openpgpkey/luuduct.ai/hu/t76q8xqkeassgy1kr38re1ppj6cpc1dp?l=doan">8990FFC0F9D95FAA4C04520BADF3DE23F687C623</a>
+ Cv25519
+
+
+<a href="https://simplex.chat">SimpleX Chat</a>
+
+ <a href="https://smp11.simplex.im/a#ikrTZ8sfleSZEifKV2wI8foAVwkbKfOoKc6TO2P4ZT8">SimpleX Contact Link</a>
+
+
+<a href="https://signal.org/">Signal</a>
+
+ <a href="https://signal.me/#eu/Xr5_r_ei8UYUpd7Lus4536PnlKvW28LXBjg3Lb71BtFp4iDVXoRF4ZVPQYw_0Guk">@v3QKypba7PzWPAuv2Eu2wRFgUVDuYDhm.73</a>
+
+
+
+
+ </pre>
+
+ </div>
+ </div>
+
+ </body>
+</html>
diff --git a/www/message.html b/www/message.html
new file mode 100644
index 0000000..a463a1c
--- /dev/null
+++ b/www/message.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<!--
+Copyright (C) 2026 Doan Luu Duc Tai <doan@luuduct.ai>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+-->
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <title>Message Me - Doan Luu Duc Tai</title>
+
+ <link rel="stylesheet" href="styles.css">
+ <link rel="stylesheet" href="form.css">
+ </head>
+
+ <body>
+
+ <div id="page">
+
+ <div class="badge">[ JS-free ]</div>
+
+ <div id="content">
+
+ <pre>
+<a href="/" class="logo">
+ ____ ___ _ _ _
+| _ \ / _ \ / \ | \ | |
+| | | | | | |/ _ \ | \| |
+| |_| | |_| / ___ \| |\ |
+|____/ \___/_/ \_\_| \_| LUU DUC TAI
+</a>
+ </pre>
+
+ <form id="message-form" action="/send-message" method="POST" class="ascii-form-container">
+
+ <div class="ascii-box">
+ <div class="ascii-bar">+--[ Reply Contact (Optional) ]------------------------------------------------+</div>
+ <div class="ascii-body">
+ <div class="ascii-content-padding">
+ <span class="ascii-prompt">&gt;</span>
+ <input type="text" id="sender-input" name="sender" class="ascii-input" maxlength="120" autocomplete="off" spellcheck="false">
+ </div>
+ </div>
+ <div class="ascii-bar">+------------------------------------------------------------------------------+</div>
+ </div>
+
+ <div class="ascii-box">
+ <div class="ascii-bar">+--[ Message Body ]------------------------------------------------------------+</div>
+ <div class="ascii-body">
+ <div class="ascii-content-padding">
+ <textarea id="message-input" name="message" class="ascii-textarea" rows="4" required></textarea>
+ </div>
+ </div>
+ <div class="ascii-bar">+------------------------------------------------------------------------------+</div>
+ </div>
+
+ <div class="ascii-actions">
+ <button type="submit" id="submit-btn" class="ascii-btn ascii-btn-submit">[ &lt; SEND &gt; ]</button>
+ <button type="reset" id="reset-btn" class="ascii-btn ascii-btn-reset">[ &lt; CLEAR &gt; ]</button>
+ </div>
+
+ </form>
+
+ <pre>
+________________________________________________________________________________
+
+<a href="/">Return to Home Page</a>
+ </pre>
+
+ </div>
+ </div>
+
+ </body>
+</html>
diff --git a/www/styles.css b/www/styles.css
new file mode 100644
index 0000000..35b7695
--- /dev/null
+++ b/www/styles.css
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2026 Doan Luu Duc Tai <doan@luuduct.ai>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+body {
+ overflow-y: scroll;
+ font: 16px monospace, monospace;
+ margin: 0;
+ padding: 0;
+}
+
+pre {
+ margin: 0;
+ overflow-x: auto;
+}
+
+a {
+ color: #06c;
+ text-decoration: none;
+}
+
+.good {
+ color: #090;
+ font-weight: bold;
+}
+
+.warn {
+ color: #c90;
+ font-weight: bold;
+}
+
+.logo {
+ color: #a00;
+ text-decoration: none;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.badge {
+ position: absolute;
+ top: 16px;
+ left: calc(50% + 280px);
+ color: #090;
+ font-weight: bold;
+ white-space: nowrap;
+}
+
+#page {
+ display: table;
+ margin: 16px auto;
+ position: relative;
+}
+
+#content {
+ max-width: 80ch;
+ width: 100%;
+}
+
+.good a, .warn a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+.good a {
+ text-decoration-style: wavy;
+}
+
+.warn a {
+ text-decoration-style: dotted;
+}
+
+@media (prefers-color-scheme: dark) {
+ body {
+ background: #000;
+ color: #fff;
+ }
+
+ a {
+ color: #6cf;
+ }
+
+ .logo {
+ color: #f33;
+ }
+
+ .badge {
+ color: #0f0;
+ }
+
+ .good {
+ color: #0f0;
+ }
+
+ .warn {
+ color: #ff0;
+ }
+}
+
+@media (max-width: 999px) {
+ body {
+ font-size: 1.94vw;
+ }
+
+ .badge {
+ left: auto;
+ right: 16px;
+ }
+}