diff --git a/src/components/Nav.astro b/src/components/Nav.astro index 610af0a..08f494c 100644 --- a/src/components/Nav.astro +++ b/src/components/Nav.astro @@ -3,6 +3,7 @@ const currentPath = Astro.url.pathname; const links = [ { href: "/", label: "home" }, + { href: "/start", label: "start" }, { href: "/about", label: "about" }, { href: "/projects", label: "projects" }, { href: "/now", label: "now" }, diff --git a/src/pages/start.astro b/src/pages/start.astro new file mode 100644 index 0000000..65412a8 --- /dev/null +++ b/src/pages/start.astro @@ -0,0 +1,616 @@ +--- +import BaseLayout from "../layouts/BaseLayout.astro"; +import projects from "../data/projects.json"; +import { getCollection, type CollectionEntry } from "astro:content"; + +type Project = { + name: string; + description: string; + tags: string[]; + status: "stable" | "wip" | "concept"; + links: { + site?: string; + gitea?: string; + github?: string; + }; +}; + +const posts = (await getCollection("blog", ({ data }) => !data.draft)).sort( + (a, b) => b.data.date.valueOf() - a.data.date.valueOf(), +); + +const recommendedPosts = posts.slice(0, 3); + +const typedProjects = projects as Project[]; +const highlightedProjectNames = ["GuardDen", "openrabbit", "DevDen"]; + +const highlightedProjects = highlightedProjectNames + .map((name) => typedProjects.find((project) => project.name === name)) + .filter((project): project is Project => Boolean(project)); + +function formatDate(date: CollectionEntry<"blog">["data"]["date"]) { + return date.toISOString().split("T")[0]; +} + +function getProjectLink(project: Project) { + return project.links.site || project.links.gitea || project.links.github || "/projects"; +} + +function getProjectLinkLabel(project: Project) { + if (project.links.site) return "visit"; + if (project.links.gitea) return "gitea"; + if (project.links.github) return "github"; + return "projects"; +} +--- + + + + +
+
+
+

New here?

+

Start Here

+
==============================
+

+ This page is a small orientation point for first-time visitors. If + you have just found Hidden Den, this is the quickest way to get a + feel for what kind of place it is and where you might want to wander + next. +

+
+ +
+

What Hidden Den Is

+

+ Hidden Den is Latte's personal corner of the internet: part + writing space, part workshop, part quiet place to think out loud. It + holds projects, experiments, infrastructure-minded notes, and the + kind of personal web presence that does not need to behave like a + brand. +

+

+ The site leans toward privacy, ownership, and human-scale spaces + online. It is built to feel warm and readable rather than optimized, + noisy, or extractive. More cozy tech wizard than cyberpunk hacker. +

+
+

+ If you want the short version: this is a personal site for + writing, building, self-hosting, and keeping a small piece of the + web genuinely personal. +

+
+
+ +
+
+ + See all posts +
+

+ A few good starting points from the blog. These give a feel for the + den so far without asking you to dig through everything first. +

+ + {recommendedPosts.length === 0 ? ( +

The den is still quiet on the writing front.

+ ) : ( +
    + {recommendedPosts.map((post) => ( +
  • +
    +
    + posted + +
    +

    + {post.data.title} +

    +

    {post.data.description}

    +
    +
  • + ))} +
+ )} +
+ +
+

Explore The Site

+

+ If you would rather browse by section, these are the best places to + continue. +

+ + +
+ +
+
+

Projects Worth Seeing

+ Browse all projects +
+

+ A small curated subset, just enough to sketch the shape of the work + without turning this page into a full catalog. +

+ +
    + {highlightedProjects.map((project) => ( +
  • + +
  • + ))} +
+
+ + +
+
+
+ +