2026-01-01 21:37:53 -03:00
|
|
|
<template>
|
|
|
|
|
<div class="page">
|
|
|
|
|
<section class="card hero glass">
|
|
|
|
|
<div>
|
|
|
|
|
<p class="eyebrow">Atlas</p>
|
|
|
|
|
<h1>Apps</h1>
|
2026-01-02 10:27:02 -03:00
|
|
|
<p class="lede">
|
2026-01-02 13:06:52 -03:00
|
|
|
Service shortcuts for Atlas.
|
2026-01-02 10:27:02 -03:00
|
|
|
</p>
|
2026-01-01 21:37:53 -03:00
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
2026-01-02 11:12:43 -03:00
|
|
|
<section class="section-grid">
|
|
|
|
|
<section v-for="section in sections" :key="section.title" class="card category">
|
|
|
|
|
<div class="section-head">
|
|
|
|
|
<div>
|
|
|
|
|
<h2>{{ section.title }}</h2>
|
|
|
|
|
<p class="muted">{{ section.description }}</p>
|
|
|
|
|
</div>
|
2026-01-02 10:27:02 -03:00
|
|
|
</div>
|
|
|
|
|
|
2026-01-02 11:12:43 -03:00
|
|
|
<div v-for="group in section.groups" :key="group.title" class="group">
|
|
|
|
|
<div class="group-title">{{ group.title }}</div>
|
|
|
|
|
<div class="tiles">
|
|
|
|
|
<a
|
|
|
|
|
v-for="app in group.apps"
|
|
|
|
|
:key="app.name"
|
|
|
|
|
class="tile"
|
|
|
|
|
:href="app.url"
|
|
|
|
|
:target="app.target"
|
|
|
|
|
rel="noreferrer"
|
|
|
|
|
>
|
|
|
|
|
<div class="tile-title">{{ app.name }}</div>
|
|
|
|
|
<div class="tile-desc">{{ app.description }}</div>
|
|
|
|
|
</a>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
2026-01-01 21:37:53 -03:00
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2026-01-02 11:12:43 -03:00
|
|
|
const sections = [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
|
|
|
|
title: "Cloud",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Your personal cloud hub: files, photos, mail, calendars, and collaborative documents.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
2026-01-02 11:12:43 -03:00
|
|
|
title: "Nextcloud",
|
|
|
|
|
apps: [
|
|
|
|
|
{
|
|
|
|
|
name: "Cloud",
|
|
|
|
|
url: "https://cloud.bstein.dev",
|
|
|
|
|
target: "_blank",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Storage, mail, photos, and office docs — the main Atlas hub.",
|
2026-01-02 11:12:43 -03:00
|
|
|
},
|
|
|
|
|
],
|
2026-01-02 10:27:02 -03:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "Security",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Passwords for humans, secrets for infrastructure.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
2026-01-02 11:12:43 -03:00
|
|
|
title: "Personal",
|
|
|
|
|
apps: [
|
|
|
|
|
{
|
|
|
|
|
name: "Vaultwarden",
|
|
|
|
|
url: "https://vault.bstein.dev",
|
|
|
|
|
target: "_blank",
|
|
|
|
|
description: "Password manager (Bitwarden-compatible).",
|
|
|
|
|
},
|
2026-01-03 00:57:14 -03:00
|
|
|
{
|
|
|
|
|
name: "Keycloak",
|
2026-01-03 17:24:00 -03:00
|
|
|
url: "https://sso.bstein.dev/realms/atlas/account/#/security/signing-in",
|
2026-01-03 00:57:14 -03:00
|
|
|
target: "_blank",
|
2026-01-03 17:24:00 -03:00
|
|
|
description: "Account security + MFA (2FA) settings (Keycloak).",
|
2026-01-02 11:12:43 -03:00
|
|
|
},
|
|
|
|
|
],
|
2026-01-02 10:27:02 -03:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "Communications",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Chat rooms, calls, and bots. Element X (mobile) is the recommended client.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
2026-01-02 11:12:43 -03:00
|
|
|
title: "Chat",
|
|
|
|
|
apps: [
|
|
|
|
|
{
|
2026-01-02 12:11:40 -03:00
|
|
|
name: "Element X",
|
2026-01-02 11:12:43 -03:00
|
|
|
url: "https://live.bstein.dev",
|
|
|
|
|
target: "_blank",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Matrix rooms with calls powered by Atlas infra.",
|
2026-01-02 11:12:43 -03:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "AI Chat",
|
|
|
|
|
url: "/ai/chat",
|
|
|
|
|
target: "_self",
|
|
|
|
|
description: "Chat with Atlas AI (GPU-accelerated).",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-01-02 10:27:02 -03:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "Streaming",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Stream media and publish uploads into your library.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
2026-01-02 11:12:43 -03:00
|
|
|
title: "Media",
|
|
|
|
|
apps: [
|
|
|
|
|
{
|
|
|
|
|
name: "Jellyfin",
|
|
|
|
|
url: "https://stream.bstein.dev",
|
|
|
|
|
target: "_blank",
|
|
|
|
|
description: "Stream videos to desktop, mobile, and TV.",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "Pegasus",
|
|
|
|
|
url: "https://pegasus.bstein.dev",
|
|
|
|
|
target: "_blank",
|
|
|
|
|
description: "Mobile-friendly upload/publish into Jellyfin.",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-01-02 10:27:02 -03:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "Dev",
|
2026-01-02 12:11:40 -03:00
|
|
|
description: "Build and ship: source control, CI, registry, and GitOps.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
|
|
|
|
{
|
2026-01-03 19:50:12 -03:00
|
|
|
title: "Dev Stack",
|
2026-01-02 11:12:43 -03:00
|
|
|
apps: [
|
|
|
|
|
{ name: "Gitea", url: "https://scm.bstein.dev", target: "_blank", description: "Git hosting and collaboration." },
|
|
|
|
|
{ name: "Jenkins", url: "https://ci.bstein.dev", target: "_blank", description: "CI pipelines and automation." },
|
|
|
|
|
{ name: "Harbor", url: "https://registry.bstein.dev", target: "_blank", description: "Artifact registry." },
|
|
|
|
|
{ name: "GitOps", url: "https://cd.bstein.dev", target: "_blank", description: "GitOps UI for Flux." },
|
2026-01-03 17:24:00 -03:00
|
|
|
{ name: "Vault", url: "https://secret.bstein.dev", target: "_blank", description: "Secrets management for infrastructure and apps." },
|
2026-01-03 19:50:12 -03:00
|
|
|
{ name: "Grafana", url: "https://metrics.bstein.dev", target: "_blank", description: "Dashboards and monitoring." },
|
2026-01-03 17:24:00 -03:00
|
|
|
],
|
|
|
|
|
},
|
2026-01-02 10:27:02 -03:00
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: "Crypto",
|
|
|
|
|
description: "Local infrastructure for crypto workloads.",
|
2026-01-02 11:12:43 -03:00
|
|
|
groups: [
|
2026-01-02 10:27:02 -03:00
|
|
|
{
|
2026-01-02 11:12:43 -03:00
|
|
|
title: "Monero",
|
|
|
|
|
apps: [
|
|
|
|
|
{
|
|
|
|
|
name: "Monero Node",
|
2026-01-02 13:06:52 -03:00
|
|
|
url: "/monero",
|
|
|
|
|
target: "_self",
|
2026-01-02 11:12:43 -03:00
|
|
|
description: "Faster sync using the Atlas Monero node.",
|
|
|
|
|
},
|
|
|
|
|
],
|
2026-01-02 10:27:02 -03:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
];
|
2026-01-01 21:37:53 -03:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.page {
|
|
|
|
|
max-width: 1200px;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
padding: 32px 22px 72px;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-02 11:12:43 -03:00
|
|
|
.section-grid {
|
|
|
|
|
display: grid;
|
|
|
|
|
gap: 14px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@media (min-width: 980px) {
|
|
|
|
|
.section-grid {
|
|
|
|
|
grid-template-columns: 1fr 1fr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-01 21:37:53 -03:00
|
|
|
.hero {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
gap: 18px;
|
|
|
|
|
margin-bottom: 12px;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-02 10:27:02 -03:00
|
|
|
.category {
|
|
|
|
|
padding: 18px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.section-head {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
gap: 18px;
|
|
|
|
|
margin-bottom: 14px;
|
2026-01-03 19:50:12 -03:00
|
|
|
min-height: 92px;
|
2026-01-02 10:27:02 -03:00
|
|
|
}
|
|
|
|
|
|
2026-01-02 11:12:43 -03:00
|
|
|
.group + .group {
|
|
|
|
|
margin-top: 14px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.group-title {
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
color: var(--text-strong);
|
|
|
|
|
margin-bottom: 10px;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-02 10:27:02 -03:00
|
|
|
.muted {
|
|
|
|
|
margin: 6px 0 0;
|
|
|
|
|
color: var(--text-muted);
|
|
|
|
|
max-width: 820px;
|
2026-01-03 19:50:12 -03:00
|
|
|
display: -webkit-box;
|
|
|
|
|
-webkit-line-clamp: 2;
|
|
|
|
|
-webkit-box-orient: vertical;
|
|
|
|
|
overflow: hidden;
|
2026-01-02 10:27:02 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tiles {
|
|
|
|
|
display: grid;
|
2026-01-02 13:06:52 -03:00
|
|
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
2026-01-02 10:27:02 -03:00
|
|
|
gap: 12px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tile {
|
|
|
|
|
display: block;
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
padding: 14px 14px 12px;
|
|
|
|
|
border-radius: 14px;
|
|
|
|
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
|
|
|
background: rgba(255, 255, 255, 0.02);
|
|
|
|
|
transition: border-color 160ms ease, transform 160ms ease;
|
2026-01-03 19:50:12 -03:00
|
|
|
min-height: 112px;
|
2026-01-02 10:27:02 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tile:hover {
|
|
|
|
|
border-color: rgba(120, 180, 255, 0.35);
|
|
|
|
|
transform: translateY(-1px);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tile-title {
|
|
|
|
|
font-weight: 750;
|
|
|
|
|
color: var(--text-strong);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tile-desc {
|
|
|
|
|
margin-top: 6px;
|
|
|
|
|
color: var(--text-muted);
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
line-height: 1.4;
|
2026-01-03 19:50:12 -03:00
|
|
|
display: -webkit-box;
|
|
|
|
|
-webkit-line-clamp: 3;
|
|
|
|
|
-webkit-box-orient: vertical;
|
|
|
|
|
overflow: hidden;
|
2026-01-02 10:27:02 -03:00
|
|
|
}
|
|
|
|
|
|
2026-01-01 21:37:53 -03:00
|
|
|
.eyebrow {
|
|
|
|
|
text-transform: uppercase;
|
|
|
|
|
letter-spacing: 0.08em;
|
|
|
|
|
color: var(--text-muted);
|
|
|
|
|
margin: 0 0 6px;
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
h1 {
|
|
|
|
|
margin: 0 0 6px;
|
|
|
|
|
font-size: 32px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.lede {
|
|
|
|
|
margin: 0;
|
|
|
|
|
color: var(--text-muted);
|
|
|
|
|
max-width: 640px;
|
|
|
|
|
}
|
|
|
|
|
</style>
|