added home page

This commit is contained in:
ION606
2025-08-26 13:07:23 -04:00
parent c22bfbb53e
commit 3d786f4fd3
6 changed files with 268 additions and 89 deletions
+3 -2
View File
@@ -39,6 +39,7 @@ http://{$FILES_DOMAIN}:8550 {
reverse_proxy http://lufi:8081
}
http://{$HOMR_DOMAIN} {
respond "KFDJSLKFJSLKFJSLKFDJLKDS" 200
http://{$HOME_DOMAIN}:8550 {
root * /var/www/share
file_server
}
+1 -1
View File
@@ -7,7 +7,7 @@ services:
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro,Z
- caddy-data:/data
- ./public:/var/www/share
- ./public:/var/www/share:ro,Z
environment:
- PASTE_DOMAIN=${PASTE_DOMAIN}
- FILES_DOMAIN=${FILES_DOMAIN}
+14 -4
View File
@@ -1,17 +1,27 @@
import { privateNoteUrl, fileDropUrl, homeDomain } from "./links.js";
import { privateNoteUrl, fileDropUrl, homeDomain, github } from "./links.js";
const yearEl = document.querySelector("#year"),
homeDomainEl = document.querySelector("#home-domain"),
noteLink = document.querySelector('[data-link="note"]'),
dropLink = document.querySelector('[data-link="drop"]');
dropLink = document.querySelector('[data-link="drop"]'),
githubLink = document.querySelector('[data-link="github"]');
// set the current year
if (yearEl) { yearEl.textContent = String(new Date().getFullYear()); }
// set home domain text
if (homeDomainEl) { homeDomainEl.textContent = homeDomain; }
// set home domain text and href
if (homeDomainEl) {
homeDomainEl.textContent = homeDomain.replace(/^https?:\/\//, "");
homeDomainEl.setAttribute("href", homeDomain);
homeDomainEl.setAttribute("target", "_blank");
homeDomainEl.setAttribute("rel", "noopener");
}
// wire up links from config
if (noteLink) { noteLink.setAttribute("href", privateNoteUrl); }
if (dropLink) { dropLink.setAttribute("href", fileDropUrl); }
if (githubLink) {
githubLink.setAttribute("href", github);
githubLink.textContent = github;
}
+35 -20
View File
@@ -3,45 +3,60 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ION606's sharing hub</title>
<meta name="description" content="friendly landing page linking to privatenote and lufi.">
<title>ION606 — Share Portal</title>
<meta name="description" content="ION606 self-hosted Share Portal — quick access to PrivateBin (notes) and LUFI (file drops).">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<!-- all comments are lower case -->
<header class="site-header">
<div class="container">
<h1 class="brand"><span aria-hidden="true"></span> ion606 hub</h1>
<p class="tagline">welcome to my privatenote and lufi instances!</p>
<div class="container header-inner">
<div class="brand-row">
<div class="logo">🔐</div>
<div>
<h1 class="brand">ION606's Share Portal</h1>
<p class="tagline">Selfhosted privacy tools: encrypted notes & secure file drops</p>
</div>
</div>
</div>
</header>
<main class="container">
<section class="card">
<h2>quick links</h2>
<p>pick a destination:</p>
<section class="hero card">
<h2 class="hero-title">Private notes • Encrypted file drops</h2>
<p class="hero-lead">Quick links to your selfhosted services. Nothing stored here — just shortcuts to PrivateBin (endtoend encrypted notes) and LUFI (clientside encrypted file sharing).</p>
<nav class="actions">
<a class="btn" data-link="note" href="#" rel="noopener">open privatenote</a>
<a class="btn secondary" data-link="drop" href="#" rel="noopener">open lufi</a>
<a class="btn" data-link="note" href="#" target="_blank" rel="noopener">Open PrivateBin (notes)</a>
<a class="btn" data-link="drop" href="#" target="_blank" rel="noopener">Open LUFI (file drop)</a>
</nav>
<p class="hint">psst: bookmark this page at <strong id="home-domain">share.ion606.com</strong> for next time.</p>
<p class="hint">Bookmark this page at <a id="home-domain" href="#" target="_blank" rel="noopener"></a></p>
</section>
<section class="card info">
<h3>what are these?</h3>
<ul class="bullets">
<li><strong>privatenote</strong> is an end-to-end encrypted pastebin for sharing text or code snippets securely.</li>
<li><strong>lufi</strong> lets you upload and share files; encryption happens before upload for extra privacy.</li>
</ul>
<section class="cards-grid">
<article class="card feature">
<h3>Why PrivateBin?</h3>
<p>Endtoend encrypted pastes. Paste content is encrypted in your browser before upload — the server never sees plain text.</p>
</article>
<article class="card feature">
<h3>Why LUFI?</h3>
<p>Clientside encrypted file sharing with configurable expiry. Share large files securely without thirdparty hosting.</p>
</article>
<article class="card feature">
<h3>Wanna self-host?</h3>
<p>You can view the source code/instructions at <a data-link="github" href="https://github.com/ION606/tempfiles" target="_blank"></a></p>
</article>
</section>
</main>
<footer class="site-footer">
<div class="container">
<p><span id="year"></span> · served by caddy · made with ❤️</p>
<div class="container footer-inner">
<p><span id="year"></span> · served by caddy · ION606</p>
</div>
</footer>
+2 -2
View File
@@ -1,4 +1,4 @@
export const privateNoteUrl = "https://bin.ion606.com",
fileDropUrl = "https://tfiles.ion606.com",
homeDomain = "share.ion606.com";
homeDomain = "https://share.ion606.com",
github = "https://github.com/ION606/sharing";
+192 -39
View File
@@ -1,91 +1,244 @@
:root {
--bg: #0b0f14;
--panel: #121821;
--text: #e6edf3;
--bg: #071019;
--panel: #0f1720;
--muted: #9fb0c0;
--text: #e6edf3;
--accent: #7cc7ff;
--accent-2: #8ae3cf;
--btn-bg: #1a2330;
--btn-border: #2a374a;
--card-border: rgba(255, 255, 255, .04);
--radius: 12px;
--container-width: 980px;
font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial;
}
* { box-sizing: border-box; }
* {
box-sizing: border-box
}
html, body {
html,
body {
height: 100%;
margin: 0;
padding: 0;
background: radial-gradient(1000px 600px at 10% -10%, rgba(124,199,255,.12), transparent 60%),
radial-gradient(800px 500px at 110% 10%, rgba(138,227,207,.12), transparent 60%), var(--bg);
background:
radial-gradient(800px 500px at 10% -10%, rgba(124, 199, 255, .06), transparent 40%),
radial-gradient(700px 400px at 110% 10%, rgba(138, 227, 207, .04), transparent 40%),
var(--bg);
color: var(--text);
font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
line-height: 1.5;
}
.container {
max-width: 880px;
max-width: var(--container-width);
margin: 0 auto;
padding: 1.25rem;
}
.site-header {
padding: 2.5rem 0 1rem;
text-align: center;
.header-inner {
display: flex;
align-items: center;
justify-content: center;
padding: 2.25rem 0 1rem
}
.brand-row {
display: flex;
gap: 1rem;
align-items: center
}
.logo {
font-size: 2rem
}
.brand {
margin: 0 0 .5rem;
font-size: clamp(1.6rem, 3vw, 2rem);
letter-spacing: .2px;
margin: 0;
font-weight: 800;
font-size: clamp(1.4rem, 3vw, 1.9rem)
}
.tagline {
margin: 0;
color: var(--muted);
font-size: .95rem
}
.card {
background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02));
border: 1px solid rgba(255,255,255,.08);
border-radius: 16px;
background: linear-gradient(180deg, rgba(255, 255, 255, .02), rgba(255, 255, 255, .01));
border: 1px solid var(--card-border);
border-radius: var(--radius);
padding: 1.25rem;
margin: 1rem 0;
box-shadow: 0 10px 30px rgba(0,0,0,.25);
box-shadow: 0 8px 24px rgba(0, 0, 0, .32);
}
.card.info { color: var(--muted); }
.hero {
padding: 1.5rem
}
.hero-title {
margin: .25rem 0 0;
font-size: 1.25rem
}
.hero-lead {
color: var(--muted);
margin: .5rem 0 1rem
}
.actions {
display: flex;
flex-wrap: wrap;
gap: .75rem;
margin: 1rem 0 0;
margin: 2em;
justify-content: space-evenly;
width: 90%;
}
.btn {
display: inline-block;
padding: .9rem 1.1rem;
border-radius: 12px;
background: var(--btn-bg);
border: 1px solid var(--btn-border);
color: var(--text);
padding: .85rem 1.1rem;
border-radius: 10px;
text-decoration: none;
font-weight: 600;
transition: transform .06s ease, background .2s ease, border-color .2s ease;
font-weight: 700;
color: var(--text);
background: var(--panel);
border: 1px solid rgba(255, 255, 255, .06)
}
.btn:hover { transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
/* contrast style for the "Open LUFI (file drop)" button */
[data-link="drop"] {
background: linear-gradient(90deg, rgba(4, 32, 42, 1), rgba(7, 17, 22, 1));
color: var(--accent-2);
border: 1px solid rgba(138, 227, 207, .22);
box-shadow: inset 0 -2px 8px rgba(0, 0, 0, .45), 0 6px 20px rgba(7, 12, 15, .6);
backdrop-filter: blur(6px);
transition: transform .12s ease, box-shadow .12s ease, background .12s ease;
}
.btn.secondary { background: #101723; }
[data-link="drop"]:hover {
transform: translateY(-3px);
box-shadow: inset 0 -2px 10px rgba(0, 0, 0, .5), 0 10px 30px rgba(7, 12, 15, .6);
background: linear-gradient(90deg, rgba(12, 56, 64, 1), rgba(10, 34, 40, 1));
}
.hint { color: var(--muted); font-size: .95rem; }
[data-link="drop"]:active {
transform: translateY(0);
box-shadow: inset 0 -1px 6px rgba(0, 0, 0, .5), 0 4px 12px rgba(7, 12, 15, .5);
}
.bullets { padding-left: 1.1rem; }
/* PrivateBin (notes) */
[data-link="note"] {
background: linear-gradient(90deg, var(--accent), var(--accent-2));
color: #04202a;
border: none;
box-shadow: 0 6px 18px rgba(124, 199, 255, .08);
transition: transform .12s ease, box-shadow .12s ease, background .12s ease;
}
[data-link="note"]:hover {
transform: translateY(-3px);
box-shadow: 0 10px 30px rgba(124, 199, 255, .12);
background: linear-gradient(90deg, rgba(124, 199, 255, .98), rgba(138, 227, 207, .92));
}
[data-link="note"]:active {
transform: translateY(0);
box-shadow: 0 4px 12px rgba(124, 199, 255, .08);
}
.hint {
color: var(--muted);
margin-top: 1rem;
font-size: .95rem
}
.hint a {
color: var(--accent);
text-decoration: none
}
.cards-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1rem;
margin-top: 1rem
}
.feature h3 {
margin: 0 0 .5rem
}
.feature p {
margin: 0;
color: var(--muted)
}
.site-footer {
text-align: center;
padding: 2rem 0 3rem;
color: var(--muted);
font-size: .95rem;
text-align: center
}
.footer-inner {
display: flex;
justify-content: center
}
/* GitHub link (inline, subtle CTA) */
[data-link="github"] {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.75rem;
border-radius: 10px;
text-decoration: none;
font-weight: 700;
font-size: 0.95rem;
color: var(--muted);
background: transparent;
border: 1px solid rgba(255, 255, 255, .03);
transition: background .12s ease, color .12s ease, transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
[data-link="github"]::before {
content: "🐙";
display: inline-block;
font-size: 1rem;
line-height: 1;
transform: translateY(-1px);
}
[data-link="github"]:hover {
background: linear-gradient(180deg, rgba(255, 255, 255, .02), rgba(255, 255, 255, .01));
color: var(--text);
border-color: rgba(255, 255, 255, .06);
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, .32);
}
[data-link="github"]:active {
transform: translateY(0);
box-shadow: 0 4px 12px rgba(0, 0, 0, .2);
}
/* small screens */
@media (max-width:520px) {
.brand {
font-size: 1.25rem
}
.logo {
font-size: 1.6rem
}
.actions {
flex-direction: column
}
.btn {
width: 100%;
text-align: center
}
}