diff --git a/next-env.d.ts b/next-env.d.ts index a419cbe..ce4e94a 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,7 +1,7 @@ /// /// -import "./.next/dev/types/routes.d.ts"; -import "./.next/dev/types/root-params.d.ts"; +import "./.next/types/routes.d.ts"; +import "./.next/types/root-params.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/public/wallpaper.jpg b/public/wallpaper.jpg new file mode 100644 index 0000000..88e7a3a Binary files /dev/null and b/public/wallpaper.jpg differ diff --git a/src/app/components/Clock.tsx b/src/app/components/Clock.tsx new file mode 100644 index 0000000..814afe5 --- /dev/null +++ b/src/app/components/Clock.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { useEffect, useState } from "react"; + +function format(date: Date) { + return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); +} + +export default function Clock({ + className, + withSeconds = false, +}: { + className?: string; + withSeconds?: boolean; +}) { + const [now, setNow] = useState(() => + typeof window === "undefined" ? null : new Date() + ); + + useEffect(() => { + const id = window.setInterval( + () => setNow(new Date()), + withSeconds ? 1000 : 10000 + ); + return () => window.clearInterval(id); + }, [withSeconds]); + + const text = now + ? withSeconds + ? now.toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }) + : format(now) + : ""; + + return ( + + {text} + + ); +} diff --git a/src/app/components/IosHome.tsx b/src/app/components/IosHome.tsx new file mode 100644 index 0000000..54d70b7 --- /dev/null +++ b/src/app/components/IosHome.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { useState } from "react"; +import { APPS, APP_BY_ID } from "./apps"; +import Clock from "./Clock"; +import { useTheme } from "./useTheme"; +import { WALLPAPER } from "../data"; + +export default function IosHome() { + const { theme, toggle } = useTheme(); + const [openId, setOpenId] = useState(null); + const openApp = openId ? APP_BY_ID[openId] : null; + + return ( +
+ {/* iOS app view */} + {openApp ? ( +
+
+ + {openApp.title} + +
+
{openApp.content}
+
+ ) : ( +
+
+ + + + +
+ + + +
+ {APPS.map((app) => ( + + ))} +
+ +
+
+
+ )} +
+ ); +} diff --git a/src/app/components/SlBackground.tsx b/src/app/components/SlBackground.tsx index 20a8f8b..4f9ad36 100644 --- a/src/app/components/SlBackground.tsx +++ b/src/app/components/SlBackground.tsx @@ -51,6 +51,7 @@ export default function SlBackground() { `}
({ + ...style, + "--panel-color": color, +}); + +export default function TerminalLayout() { + const { theme, toggle } = useTheme(); + + return ( + <> + +
+
+
+ +

dvorakmortonxd.dev

+
+
+ +
+
+ + README.MD + +

$ whoami

+

+ Welcome my personal website! Here I show off my projects and hardware I own, + aswell as my self-hosted services :) +

+
+ +
+
+ + SEARXNG.C + +
+ +
+
+
+ +
+
+ + SOCIALS.JS + +
+ {socials.map((s) => ( + + {s.name} + {s.name} + + ))} +
+
+ mail if u ever wanna contact me:{" "} + dvorak@dvorakmortonxd.dev +
+
+
+ +
+
+ + GYM_SBD_AT_73KG_BW.DB + +
+
+ Squat +
SQUAT
+
125kg
+
5.1.2025
+
+
+ Bench +
BENCH
+
111kg
+
29.5.2026
+
+
+ Deadlift +
DEADLIFT
+
165kg
+
17.12.2024
+
+
+
+
+ +
+
+ + NOW.TXT + +
+

+ martin@dvorakmortonxd: + ~$ cat now.txt +

+
+

+ I'm currently hosting an SMP (dm me on discord). Also I'm pretty + much cooking daily, because im bulking through out the non-summer seasons. + And me and my pal Pepa are working on an + education app so we can study more efficiently, It's called{" "} + maturita.c! +

+
+
+
+
+ +
+
+ + README.MD + +
+

+ martin@dvorakmortonxd: + ~$ cat about_me.md +

+
+

+ Hey, I'm Martin Dvořák — a 17(soon to be 18)-year-old IT student based + in the Czech Republic, specializing in network management and + administration at sssvt.cz. I'm a + sophomore and I have wanted to go to this school since 7th grade (2022) so + I'm happy I got in in 2025, the school is pretty cool so if you are in + middle school and interested in IT, make sure to check it out. I'm a + homelabber and developer heavily focused on self-hosting{" "} + literally everything, writing code (for example games for gamejams), + tinkering with GNU/Linux or Musl/Linux systems and retro hardware. I own a + small collection of laptops ranging from 2009 to 2014 (and ofcourse my 2025 + macbook), most of these found in ewaste. In my free time I mostly spend + time with my gf {"<"}3, I also spend a bit of time setting up my self + hosted stuff (like jellyfin or gitdxd), and also when I'm in my gaming + mood I play terraria (around 1300hr playtime btw) and minecraft modpacks + with mekanism and/or create. I also go to the gym around 3-5 times a week, + running a PPL split focused on strength/powerlifting and especially SBD. I + take a big focus on my health and physique. + +

+
+
+
+
+ +
+
+ + SERVICES.HTML + +
+ + + + + + +
+
+
+ +
+
+ + GITDXD.GIT + +
+

+ GitDXD +

+

+ My Self-hosted Git Instance +

+
+ GitDXD Preview +
+
+

+ My very own forgejo git instance, originally started as a private git + instance for me and my friends to boycott GitHub but I've made it + public now so. Join at{" "} + + git.dvorakmortonxd.dev + + . +

+
+
+
+
+ +
+
+ + CONTRIBUTIONS@GITDXD.GIT + +
+ +
+
+
+ +
+
+ + REVIVAL.INC + +
+

+ Revival inc. +

+
+ revival inc thumbnail +
+

+ What is it? +

+
+

+ It's a game I made for the game jam "Mini Jame Gam #55", the + theme was Necromancy and the special item was Milk, the game also includes + a tutorial so if you wanna try it do it. Check it out at{" "} + + itch.io + {" "} + or play{" "} + + here + + . +

+
+
+
+
+ +
+
+ + RUSTYWOLF.RS + +
+

+ Introducing RustyWolf +

+
+ RustyWolf Browser Preview +
+

+ What makes it so cool??? +

+
+

+ A lightweight browser made in Rust with WebKitGTK. It's the successor + to my previous project Venturesome, aiming to provide a fast and minimalist + browsing experience. It's a perfect browser for old machines that + struggle with modern browsers. Check it out at{" "} + + + GitDXD + + + . +

+
+
+
+
+
+ +
+
+
+ + TECH_LIST.JSON + +

+ All my hardware equipment :) +

+
+ {techProjects.map((project) => ( +
+
+

{project.title}

+

{project.desc}

+
+ ))} +
+
+
+ +
+
+ + PROJECTS.DOCX + +

+ All the stuff I've worked on :)) +

+
+ {codingProjects.map((project, idx) => ( + + +
+
+ +
+
+ + FRIENDS.TSX + +

+ Friend's websites and projects +

+
+ {friends.map((friend, idx) => ( + + } + name={friend.name} + desc={friend.desc} + /> + ))} +
+ +
+

+ Quipee by Bukovina Filip & Vlk Tomáš +

+
+ Quipee Thumbnail +
+ +
+
+
+
+ +
+ v1.2.1 + © 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just follow + the GPL3.0 License) +
+
+ +
+ theme: terminal + + + +
+ + ); +} diff --git a/src/app/components/ThemeRoot.tsx b/src/app/components/ThemeRoot.tsx new file mode 100644 index 0000000..bc40e42 --- /dev/null +++ b/src/app/components/ThemeRoot.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { useTheme } from "./useTheme"; +import TerminalLayout from "./TerminalLayout"; +import WindowsDesktop from "./WindowsDesktop"; +import IosHome from "./IosHome"; + +export default function ThemeRoot() { + const { theme } = useTheme(); + + if (theme === "terminal") { + return ; + } + + return ( + <> +
+ +
+
+ +
+ + ); +} diff --git a/src/app/components/WinWindow.tsx b/src/app/components/WinWindow.tsx new file mode 100644 index 0000000..6f29396 --- /dev/null +++ b/src/app/components/WinWindow.tsx @@ -0,0 +1,109 @@ +"use client"; + +import { useRef, type CSSProperties } from "react"; +import type { AppDef } from "./apps"; + +export interface WinState { + id: number; + appId: string; + x: number; + y: number; + w: number; + h: number; + z: number; + minimized: boolean; + maximized: boolean; +} + +interface Props { + win: WinState; + app: AppDef; + active: boolean; + onFocus: () => void; + onClose: () => void; + onMinimize: () => void; + onToggleMaximize: () => void; + onMove: (x: number, y: number) => void; +} + +export default function WinWindow({ + win, + app, + active, + onFocus, + onClose, + onMinimize, + onToggleMaximize, + onMove, +}: Props) { + const drag = useRef<{ sx: number; sy: number; ox: number; oy: number } | null>(null); + + const style: CSSProperties = win.maximized + ? { left: 0, top: 0, width: "100%", height: "100%", zIndex: win.z } + : { left: win.x, top: win.y, width: win.w, height: win.h, zIndex: win.z }; + + return ( +
+
{ + onFocus(); + if (win.maximized) return; + if ((e.target as HTMLElement).closest(".win-controls")) return; + drag.current = { sx: e.clientX, sy: e.clientY, ox: win.x, oy: win.y }; + e.currentTarget.setPointerCapture(e.pointerId); + }} + onPointerMove={(e) => { + const d = drag.current; + if (!d) return; + onMove(d.ox + (e.clientX - d.sx), d.oy + (e.clientY - d.sy)); + }} + onPointerUp={(e) => { + drag.current = null; + try { + e.currentTarget.releasePointerCapture(e.pointerId); + } catch { + /* ignore */ + } + }} + > + + {app.title} +
+
+
+
{app.content}
+
+ ); +} diff --git a/src/app/components/WindowsDesktop.tsx b/src/app/components/WindowsDesktop.tsx new file mode 100644 index 0000000..3c898b4 --- /dev/null +++ b/src/app/components/WindowsDesktop.tsx @@ -0,0 +1,274 @@ +"use client"; + +import { useRef, useState } from "react"; +import { APPS, APP_BY_ID } from "./apps"; +import WinWindow, { type WinState } from "./WinWindow"; +import Clock from "./Clock"; +import { useTheme } from "./useTheme"; +import { WALLPAPER } from "../data"; + +const TASKBAR_HEIGHT = 40; + +export default function WindowsDesktop() { + const { theme, toggle } = useTheme(); + + const [wins, setWins] = useState(() => [ + { + id: 1, + appId: "welcome", + x: 110, + y: 64, + w: 620, + h: 430, + z: 10, + minimized: false, + maximized: false, + }, + ]); + const [activeId, setActiveId] = useState(1); + const [startOpen, setStartOpen] = useState(false); + const [selectedIcon, setSelectedIcon] = useState(null); + + const idRef = useRef(2); + const zRef = useRef(11); + const spawnRef = useRef(1); + + const focus = (id: number) => { + setActiveId(id); + setWins((prev) => + prev.map((w) => (w.id === id ? { ...w, z: ++zRef.current } : w)) + ); + }; + + const openApp = (appId: string) => { + setStartOpen(false); + const existing = wins.find((w) => w.appId === appId); + if (existing) { + setWins((prev) => + prev.map((w) => + w.id === existing.id ? { ...w, minimized: false, z: ++zRef.current } : w + ) + ); + setActiveId(existing.id); + return; + } + const app = APP_BY_ID[appId]; + if (!app) return; + const n = spawnRef.current++; + const id = idRef.current++; + const maxX = Math.max(20, (typeof window !== "undefined" ? window.innerWidth : 1280) - app.width - 20); + const maxY = Math.max(20, (typeof window !== "undefined" ? window.innerHeight : 800) - TASKBAR_HEIGHT - app.height - 20); + const x = Math.min(maxX, 90 + (n % 8) * 30); + const y = Math.min(maxY, 56 + (n % 8) * 28); + setWins((prev) => [ + ...prev, + { + id, + appId, + x, + y, + w: app.width, + h: app.height, + z: ++zRef.current, + minimized: false, + maximized: false, + }, + ]); + setActiveId(id); + }; + + const closeWin = (id: number) => + setWins((prev) => prev.filter((w) => w.id !== id)); + const minimizeWin = (id: number) => + setWins((prev) => prev.map((w) => (w.id === id ? { ...w, minimized: true } : w))); + const toggleMax = (id: number) => + setWins((prev) => + prev.map((w) => (w.id === id ? { ...w, maximized: !w.maximized } : w)) + ); + const moveWin = (id: number, x: number, y: number) => { + const maxX = + (typeof window !== "undefined" ? window.innerWidth : 1280) - 120; + const maxY = + (typeof window !== "undefined" ? window.innerHeight : 800) - TASKBAR_HEIGHT - 20; + setWins((prev) => + prev.map((w) => + w.id === id + ? { ...w, x: Math.max(-w.w + 120, Math.min(maxX, x)), y: Math.max(0, Math.min(maxY, y)) } + : w + ) + ); + }; + + const taskbarClick = (w: WinState) => { + if (w.minimized) { + setWins((prev) => + prev.map((x) => (x.id === w.id ? { ...x, minimized: false, z: ++zRef.current } : x)) + ); + setActiveId(w.id); + } else if (activeId === w.id) { + minimizeWin(w.id); + } else { + focus(w.id); + } + }; + + const wallpaper = `url('${WALLPAPER}')`; + + return ( +
{ + if (e.target === e.currentTarget) { + setStartOpen(false); + setSelectedIcon(null); + } + }} + > + + ); +} diff --git a/src/app/components/apps.tsx b/src/app/components/apps.tsx new file mode 100644 index 0000000..00d4b3e --- /dev/null +++ b/src/app/components/apps.tsx @@ -0,0 +1,426 @@ +"use client"; + +import Image from "next/image"; +import type { ReactNode } from "react"; +import { + socials, + codingProjects, + techProjects, + friends, + WALLPAPER_CREDIT, +} from "../data"; +import ServiceButton from "./ServiceButton"; +import ContributionHeatmap from "./ContributionHeatmap"; +import JokerLogo from "./JokerLogo"; + +export interface AppDef { + id: string; + title: string; + icon: string; + color: string; + width: number; + height: number; + content: ReactNode; +} + +function WelcomeApp() { + return ( +
+
+ +
+

Welcome to dvorakmortonxd.dev

+

A Windows 7 desktop edition of my personal website.

+
+
+

+ Double-click an icon on the desktop (or open the + Start menu) to launch an application. Everything you used to + scroll through now lives inside its own little window. +

+
    +
  • Drag windows around by their title bar.
  • +
  • Use the buttons at the top-right to minimize, maximize or close.
  • +
  • Search the web from the taskbar at the bottom.
  • +
  • Switch back to the terminal theme from the tray, bottom-right.
  • +
+

+ Wallpaper from{" "} + + wallpaperaccess.com/open-source + + . +

+
+ ); +} + +function AboutApp() { + return ( +
+

+ martin@dvorakmortonxd:~$ + cat about_me.md +

+
+

+ Hey, I'm Martin Dvořák — a 17(soon to be 18)-year-old IT student based in the + Czech Republic, specializing in network management and administration at{" "} + sssvt.cz. I'm a sophomore and I have wanted to + go to this school since 7th grade (2022) so I'm happy I got in in 2025, the + school is pretty cool so if you are in middle school and interested in IT, make + sure to check it out. I'm a homelabber and developer heavily focused on + self-hosting literally everything, writing code (for example games for + gamejams), tinkering with GNU/Linux or Musl/Linux systems and retro hardware. I + own a small collection of laptops ranging from 2009 to 2014 (and ofcourse my 2025 + macbook), most of these found in ewaste. In my free time I mostly spend time with + my gf {'<'}3, I also spend a bit of time setting up my self hosted stuff (like + jellyfin or gitdxd), and also when I'm in my gaming mood I play terraria + (around 1300hr playtime btw) and minecraft modpacks with mekanism and/or create. I + also go to the gym around 3-5 times a week, running a PPL split focused on + strength/powerlifting and especially SBD. I take a big focus on my health and + physique. +

+
+
+ ); +} + +function NowApp() { + return ( +
+

+ martin@dvorakmortonxd:~$ + cat now.txt +

+
+

+ I'm currently hosting an SMP (dm me on discord). Also I'm pretty much + cooking daily, because im bulking through out the non-summer seasons. And me and + my pal Pepa are working on an education app so we + can study more efficiently, It's called{" "} + maturita.c! +

+
+
+ ); +} + +function SocialsApp() { + return ( +
+
+ {socials.map((s) => ( + + {s.name} + {s.name} + + ))} +
+
+ mail if u ever wanna contact me:{" "} + dvorak@dvorakmortonxd.dev +
+
+ ); +} + +function ServicesApp() { + return ( +
+
+ + + + + + +
+
+ ); +} + +function ProjectsApp() { + return ( +
+
+ {codingProjects.map((project, idx) => ( + + +
+ ); +} + +function HardwareApp() { + return ( +
+
+ {techProjects.map((project) => ( +
+
+

{project.title}

+

{project.desc}

+
+ ))} +
+
+ ); +} + +function FriendsApp() { + return ( +
+
+ {friends.map((friend, idx) => ( + + } + name={friend.name} + desc={friend.desc} + /> + ))} +
+ +
+

Quipee by Bukovina Filip & Vlk Tomáš

+
+ Quipee Thumbnail +
+ +
+
+ ); +} + +function GitdxdApp() { + return ( +
+

GitDXD

+

My Self-hosted Git Instance

+
+ GitDXD Preview +
+

+ My very own forgejo git instance, originally started as a private git instance for + me and my friends to boycott GitHub but I've made it public now so. Join at{" "} + git.dvorakmortonxd.dev. +

+
+ ); +} + +function ContributionsApp() { + return ( +
+ +
+ ); +} + +function GymApp() { + return ( +
+
+
+ Squat +
SQUAT
+
125kg
+
5.1.2025
+
+
+ Bench +
BENCH
+
111kg
+
29.5.2026
+
+
+ Deadlift +
DEADLIFT
+
165kg
+
17.12.2024
+
+
+
+ ); +} + +function RevivalApp() { + return ( +
+

Revival Inc.

+
+ revival inc thumbnail +
+

What is it?

+

+ It's a game I made for the game jam "Mini Jame Gam #55", the theme was + Necromancy and the special item was Milk, the game also includes a tutorial so if you + wanna try it do it. Check it out at{" "} + itch.io or play{" "} + here. +

+
+ ); +} + +function RustyWolfApp() { + return ( +
+

Introducing RustyWolf

+
+ RustyWolf Browser Preview +
+

What makes it so cool???

+

+ A lightweight browser made in Rust with WebKitGTK. It's the successor to my + previous project Venturesome, aiming to provide a fast and minimalist browsing + experience. It's a perfect browser for old machines that struggle with modern + browsers. Check it out at{" "} + GitDXD. +

+
+ ); +} + +export const APPS: AppDef[] = [ + { id: "welcome", title: "Welcome", icon: "👋", color: "#2f7fc4", width: 620, height: 430, content: }, + { id: "about", title: "About Me", icon: "🧑‍💻", color: "#0d5aa7", width: 720, height: 470, content: }, + { id: "now", title: "now.txt", icon: "📝", color: "#6a4fb3", width: 560, height: 320, content: }, + { id: "socials", title: "Socials", icon: "🔗", color: "#0a7cc1", width: 700, height: 460, content: }, + { id: "services", title: "Services", icon: "🖥️", color: "#157347", width: 760, height: 480, content: }, + { id: "projects", title: "Projects", icon: "🎮", color: "#b3005f", width: 860, height: 560, content: }, + { id: "hardware", title: "Hardware", icon: "💻", color: "#1257a0", width: 860, height: 560, content: }, + { id: "friends", title: "Friends", icon: "🫂", color: "#c0392b", width: 780, height: 560, content: }, + { id: "gitdxd", title: "GitDXD", icon: "🐙", color: "#333333", width: 780, height: 560, content: }, + { id: "contributions", title: "Contributions", icon: "📊", color: "#157347", width: 900, height: 470, content: }, + { id: "gym", title: "Gym SBD", icon: "🏋️", color: "#c0392b", width: 620, height: 380, content: }, + { id: "revival", title: "Revival Inc.", icon: "🧟", color: "#6a4fb3", width: 740, height: 560, content: }, + { id: "rustywolf", title: "RustyWolf", icon: "🐺", color: "#0a7cc1", width: 780, height: 560, content: }, +]; + +export const APP_BY_ID: Record = Object.fromEntries( + APPS.map((a) => [a.id, a]) +); diff --git a/src/app/components/useTheme.ts b/src/app/components/useTheme.ts new file mode 100644 index 0000000..6296b7d --- /dev/null +++ b/src/app/components/useTheme.ts @@ -0,0 +1,45 @@ +"use client"; + +import { useSyncExternalStore } from "react"; + +export type Theme = "skeuo" | "terminal"; + +const EVENT = "theme-change"; + +function subscribe(callback: () => void) { + window.addEventListener(EVENT, callback); + window.addEventListener("storage", callback); + return () => { + window.removeEventListener(EVENT, callback); + window.removeEventListener("storage", callback); + }; +} + +function getSnapshot(): Theme { + return document.documentElement.getAttribute("data-theme") === "terminal" + ? "terminal" + : "skeuo"; +} + +function getServerSnapshot(): Theme { + return "skeuo"; +} + +export function setTheme(theme: Theme) { + if (typeof document === "undefined") return; + document.documentElement.setAttribute("data-theme", theme); + try { + localStorage.setItem("theme", theme); + } catch { + /* ignore */ + } + window.dispatchEvent(new Event(EVENT)); +} + +export function useTheme() { + const theme = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); + return { + theme, + toggle: () => setTheme(theme === "skeuo" ? "terminal" : "skeuo"), + }; +} diff --git a/src/app/data.ts b/src/app/data.ts new file mode 100644 index 0000000..48925ff --- /dev/null +++ b/src/app/data.ts @@ -0,0 +1,261 @@ +export interface Social { + name: string; + icon: string; + url: string; +} + +export interface CodingProject { + title: string; + desc: string; + img: string; + url: string; +} + +export interface TechProject { + title: string; + desc: string; + image: string; +} + +export interface Friend { + name: string; + url: string; + realUrl: string; + img: string; + desc: string; + iframe: boolean; +} + +export const socials: Social[] = [ + { name: "Instagram (main)", icon: "/instagram.svg", url: "https://www.instagram.com/dvorakmortonxd/" }, + { name: "Instagram (gym)", icon: "/instagram.svg", url: "https://www.instagram.com/dvorakmortonxd2/" }, + { name: "SoundCloud", icon: "/soundcloud.svg", url: "https://soundcloud.com/martin-dvorak-185636305" }, + { name: "TikTok", icon: "/tiktok.svg", url: "https://www.tiktok.com/@dvorakmortonxd" }, + { name: "Snapchat", icon: "/snapchat.svg", url: "https://www.snapchat.com/add/dvorakmortonxd" }, + { name: "GitDXD", icon: "/github.svg", url: "https://git.dvorakmortonxd.dev/dvorakmortonxd" }, + { name: "LinkedIn", icon: "/linkedin.svg", url: "https://www.linkedin.com/in/martin-dvorak-32012a394/" }, + { name: "Itch.io", icon: "/itchio.svg", url: "https://martin-dv.itch.io" }, + { name: "Discord", icon: "/discord.svg", url: "https://discord.com/users/555745543763001364" }, + { name: "Reddit", icon: "/reddit.svg", url: "https://www.reddit.com/user/M4RT1NYT/" }, + { name: "Twitter", icon: "/twitter.svg", url: "https://x.com/pepicskopcecek" }, + { name: "Quipee", icon: "/quip.svg", url: "https://quipee.me/dvorakmortonxd" }, +]; + +export const codingProjects: CodingProject[] = [ + { + title: "Hospital Execution (Unfinished)", + desc: "the first ever real game I made, in pygame. I've abandoned it.", + img: "/coding-1.webp", + url: "https://martin-dv.itch.io/hospital-execution-demo", + }, + { + title: "Underbaranoia (Finished)", + desc: "basically a undertale like infinite fight simulator that gets progressively harder, made in pygame.", + img: "/coding-2.webp", + url: "https://martin-dv.itch.io/underbaranoia", + }, + { + title: "Offline memer (Finished)", + desc: "parody of the discord bot \"Dank Memer\" made in batch. (this was technically my first ever game I published).", + img: "/coding-3.webp", + url: "https://martin-dv.itch.io/offline-memer", + }, + { + title: "4y (Forgotten)", + desc: "just a renamed fork of the ly login manager (based login manager btw I love it), no extra features, just a rename, its actually outdated so dont use it.", + img: "/coding-4.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/4y", + }, + { + title: "4rch linux (Forgotten)", + desc: "same as above, basically just a renamed fork of arch linux with calamares installer, also outdated and not maintained at all so no use please.", + img: "/coding-5.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/4rch-linux", + }, + { + title: "You_Are_An_Idiot_Virus.py (Finished)", + desc: "this is just a python script that just spams blinking \"you are an idiot\" windows, made it as a prank I think, not really sure rn.", + img: "/coding-6.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/uranidiot", + }, + { + title: "Venturesome (Discontinued)", + desc: "a browser I wrote in python using PyQtWebEngine with PyQt5, actually pretty cool and modular but I couldnt get past the stage of adding a tab system, basically surpassed by my other project: RustyWolf.", + img: "/coding-7.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/Venturesome", + }, + { + title: "Mandelbrot set in Pygame (Finished)", + desc: "a python pygame script that renders the mandelbrot set, made it when I was fascinated by how it looks and ngl it still looks cool af.", + img: "/coding-8.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/mandelbrot", + }, + { + title: "Underpygametale (Unfinished)", + desc: "a remake of undertale written in pygame, got it to about the flowey part (at the beginning) and didnt touch it in a long time.", + img: "/coding-9.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/underpygametale", + }, + { + title: "Many discord bots...", + desc: "so many of them, once I (allegedly, pls discord dont ban me) even wrote a \"self-bot\" which auto-advertised a minecraft server on minecraft discord server in lfg-hosting every two hours, around 800 people joined in total.", + img: "/coding-10.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/PYGETEX", + }, + { + title: "MMO minecraft plugin (Unfinished)", + desc: "a minceraft plugin with custom bosses, items, and functions. pretty barebones and basic but I did it all manually before vibecoding was even a thing so what.", + img: "/coding-11.webp", + url: "https://www.youtube.com/watch?v=cSAX5Ds61ac", + }, + { + title: "Many many failed minecraft servers..", + desc: "creative games, softcraft, frostville, eusmp, eurthsmp, softsmp and many other SMPs that died later on. I cant even count how many mc servers I had in total.", + img: "/coding-12.webp", + url: "https://discord.gg/KtHRm9kRmy", + }, + { + title: "Swords and Sandals 2 pygame remake (Unfinished)", + desc: "an unfinished remake of swords and sandals 2 in pygame, I got bored of it and never finished it but ill finish it one day for sure lol.", + img: "/coding-13.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/sas2py", + }, + { + title: "Llama.cpp server", + desc: "my llama.cpp vm running on my proxmox with a gpu passthroughed RTX 3070, dm me if u wanna test it lol.", + img: "/coding-14.webp", + url: "https://ai.dvorakmortonxd.dev/", + }, + { + title: "Batch MSDOS Simulator (Finished)", + desc: "a freshman school project on making games in batch, it was like an OS simulator with a web browser, games, photos, even a video suprise (youll have to try it to figure that one out lol).", + img: "/coding-15.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/DvorakMSDOS", + }, + { + title: "RustyWolf (WIP, Available now!)", + desc: "a browser I made in rust with webkitgtk, I made it to be lightweight and to be able to be ran on macbook unibody 2010 before I realised I got scammed.. It's the successor to my previous project Venturesome :)", + img: "/coding-16.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/RustyWolf", + }, + { + title: "dxdwm (Discontinued)", + desc: "a small x11 window manager written in rust.", + img: "/coding-17.webp", + url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/dxdwm", + }, + { + title: "Revival Inc. (Finished)", + desc: "My game written in pygame and packaged with pygbag made for the Mini Jame Gam #55! tho I only made it in 6 hours lmao", + img: "/revivalinc.webp", + url: "https://dvorakmortonxd.dev/revival-inc", + }, +]; + +export const techProjects: TechProject[] = [ + { + title: "Gentoo Setup", + desc: "my main computer with gentoo and SwayFX. specs: Ryzen 5 3600 (6c/12t), RX 580 8GB ASUS ROG, 16gb of ram and a 240gb sata ssd.", + image: "/gentoo-setup.webp", + }, + { + title: "Proxmox Server", + desc: "my personal proxmox server (dm me on ig if u need a VPS/hosting), specs: Xeon E5 2680 v4 (14c/28t), RTX 3070 (llama.cpp), 68gb ddr4 rdimm ram (2*16gb, 1*32gb, 1*4gb), 256gb of sata m2 space + 1tb hdd + 750gb hdd.", + image: "/proxmox-server.webp", + }, + { + title: "Xbox 360 S (badupdate)", + desc: "xbox 360 slim (trinity) with badupdate exploit, allowing to boot custom software. (not my photo), the specs are XCGPU (3c/6t), 0.5GB of gddr3 ram and a 500gb hdd.", + image: "/xbox360.webp", + }, + { + title: "Lenovo Legion Go S", + desc: "my gaming handheld which I sometimes use as a computer, it has 32gb of unified lpddr5x memory and 1tb of nvme storage, I dualboot artix linux (openrc) with SwayFX and stock SteamOS on it.", + image: "/legiongos.webp", + }, + { + title: "Macbook Air M4 13\"", + desc: "my main device for basically everything on the go except gaming. specs are Apple M4 (cpu:10c,gpu:8c), 16gb of unified ram (lpddr5x), 256gb Storage.", + image: "/macbook-air.webp", + }, + { + title: "Macbook Air 2013 11\"", + desc: "bought this for tinkering lol, specs are intel core i5 (2c/4t), 8gb of ddr3 ram and 250gb ssd, installed arch linux on it with i3wm.", + image: "/macbook-air-11.webp", + }, + { + title: "iPhone 7 128gb", + desc: "somehow found a listing for 4 bucks (refurbed.cz) for it so I got it lol, it has a little dent I marked it on the photo (which isnt mine btw), except cosmetic damage its pretty much fully functional, specs are Apple A10 (4c/4t), 2gb of ram and 128gb of storage", + image: "/iphone-7.webp", + }, + { + title: "Macbook Unibody 2010", + desc: "found random listing on bazos for 15 bucks but after I bought a power adapter it turned out to be non functioning so I got scammed :(", + image: "/macbook2010.webp", + }, + { + title: "ThinkPad T400s 14\"", + desc: "got it from a random guy for 20 bucks, its an old laptop from 2009. I put void linux on it and i3wm on it, specs are intel core 2 duo (2c/2t), 8gb ddr3 ram and 800gb hdd.", + image: "/thinkpadt400s.webp", + }, + { + title: "Asus N56JR 15.6\"", + desc: "one of my first laptops my dad got for me when I was like 12, still works but the battery is KO, specs are intel core i7 4700HQ (4c/8t), 8gb ddr3 ram and 240gb ssd, it currently runs ubuntu linux 24.04LTS and my mom uses it for movies and shows.", + image: "/asuslaptop.webp", + }, + { + title: "Small Unknown XP Acer Laptop", + desc: "found that one in ewaste, I think it has like 2gb of ram and an intel atom, not sure what to do with it yet", + image: "/acerlaptop.webp", + }, + { + title: "Dell Latitude E6320", + desc: "also from ewaste, put mint on it but didnt do anything yet, lowk kinda capable for its time in 2011 so I might put it to use later but the battery is KO.", + image: "/latitude.webp", + }, + { + title: "iPhone 11 128gb", + desc: "my first iphone I got from my parents at 13, rn my dad has it because I switched over to the iphone 16 pro in 2025, specs are Apple A13 (6c/6t), 4gb of ram and 128gb of storage. (NOT MY IMAGE)", + image: "/iphone11.webp", + }, + { + title: "iPhone 16 Pro 128gb", + desc: "originally wanted iphone 13 mini (because of the size) but I somehow decided to get 16 pro, which is a bit smaller than my older iphone 11, specs are Apple A18 pro (6c/6t), (btw this chip is the same chip used in the macbook neo so thats cool) and 8gb of ram and 128gb of storage, my main phone.", + image: "/iphone16pro.webp", + }, + { + title: "Xbox one S 2TB", + desc: "my dad bought it for me also in like 2018 or 2019 and I sometimes play the console edition of minecraft because I like to play the gliding minigame on it when someone comes over.", + image: "/xboxones.webp", + }, +]; + +export const friends: Friend[] = [ + { + name: "Josef Skopec", + url: "/skopec.html", + realUrl: "https://skopec.dev/", + img: "/skopec.svg", + desc: "skopec.dev", + iframe: true, + }, + { + name: "Filip Bukovina", + url: "https://bukovinafilip.com/", + realUrl: "https://bukovinafilip.com/", + img: "/bukovina.svg", + desc: "bukovinafilip.com", + iframe: true, + }, + { + name: "Tomáš Vlk", + url: "https://vlcak.me", + realUrl: "https://vlcak.me", + img: "/vlcak.svg", + desc: "vlcak.me", + iframe: true, + }, +]; + +export const WALLPAPER = "/wallpaper.jpg"; +export const WALLPAPER_CREDIT = "https://wallpaperaccess.com/open-source"; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a89d065..88f886f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -24,7 +24,14 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - + + +