diff --git a/_layouts/kova.html b/_layouts/kova.html new file mode 100644 index 0000000..427e4f5 --- /dev/null +++ b/_layouts/kova.html @@ -0,0 +1,11 @@ +--- +layout: default +--- + + + +
+ {{ content }} +
+ + diff --git a/_tabs/projects.md b/_tabs/projects.md index 4300510..7e0a73b 100644 --- a/_tabs/projects.md +++ b/_tabs/projects.md @@ -3,21 +3,91 @@ icon: fas fa-code-branch order: 4 --- + + A compact overview of what I'm building and the public work that best represents my current engineering focus. +
+

New technical preview

+

Kova Engine

+

A detailed look at the current public-style 2D and 3D examples, engine-user API shape, architecture boundaries, validation approach, capability status, current limitations, and public-source pre-alpha work.

+ Open the Kova technical preview +
+ ## Modular Rust game engine -My main project is a **modular, general-purpose game engine built from scratch in Rust**. +My main project is **Kova**, a modular, general-purpose game engine built from scratch in Rust. It includes custom runtime and ECS architecture, rendering, assets and content, input, scenes, physics, plugins, task systems, voxel capabilities, tooling, testing, and backend-neutral public APIs. The architecture is deliberately layered: high-level engine and gameplay code should not depend directly on backend-specific graphics or windowing handles, and extension points are designed to work for first-party and third-party plugins through the same public interfaces. -The repository is currently private while the engine is being prepared for public release. +The repository is currently private while the engine is being prepared for a public-source pre-alpha release. The current technical preview documents the implemented public application, scene, 2D, 3D, input, camera, transform, and validation paths without presenting the engine as production-ready. ## Freven -**Freven** is a voxel game built on top of my engine and used as a real downstream validation project. +**Freven** is a voxel game built on top of Kova and used as a real downstream validation project. Current work exercises voxel world and chunk management, rendering and collision updates, interaction, world streaming, diagnostics, frame-time performance, and the boundary between reusable engine capabilities and game-specific behavior. diff --git a/assets/css/kova.css b/assets/css/kova.css new file mode 100644 index 0000000..df62da0 --- /dev/null +++ b/assets/css/kova.css @@ -0,0 +1,1217 @@ +:root { + --kova-bg: #09101c; + --kova-panel: rgba(18, 29, 48, 0.78); + --kova-panel-strong: #101c30; + --kova-line: rgba(151, 180, 228, 0.18); + --kova-text: #eef4ff; + --kova-muted: #aab9d1; + --kova-blue: #7c90ff; + --kova-blue-bright: #99aaff; + --kova-cyan: #62d6db; + --kova-green: #63d19e; + --kova-amber: #e5b665; + --kova-gray: #93a0b4; + --kova-shadow: 0 28px 90px rgba(2, 7, 16, 0.38); + --kova-radius: 22px; +} + +main:has(.kova-page) { + flex: 0 0 100%; + max-width: 100%; +} + +main:has(.kova-page) + #panel-wrapper { + display: none; +} + +#tail-wrapper:has(+ .kova-page), +body:has(.kova-page) #tail-wrapper { + max-width: 100%; +} + +.kova-shell { + width: 100%; + padding: 0 0 2rem; +} + +.kova-page { + color: var(--kova-text); + background: + radial-gradient(circle at 82% 8%, rgba(91, 113, 255, 0.18), transparent 29rem), + radial-gradient(circle at 12% 23%, rgba(55, 189, 200, 0.11), transparent 24rem), + linear-gradient(180deg, #0a1220 0%, #07101b 58%, #080e18 100%); + border: 1px solid var(--kova-line); + border-radius: 28px; + box-shadow: var(--kova-shadow); + overflow: clip; + margin: 1.2rem auto 2rem; + max-width: 1380px; +} + +.kova-page *, +.kova-page *::before, +.kova-page *::after { + box-sizing: border-box; +} + +.kova-page h1, +.kova-page h2, +.kova-page h3, +.kova-page p, +.kova-page li, +.kova-page strong, +.kova-page td, +.kova-page th, +.kova-page figcaption { + color: inherit; +} + +.kova-page h1, +.kova-page h2, +.kova-page h3 { + scroll-margin-top: 7rem; +} + +.kova-page h2 { + margin: 0 0 1rem; + font-size: clamp(2rem, 4vw, 3.65rem); + line-height: 1.04; + letter-spacing: -0.04em; +} + +.kova-page h3 { + margin: 0 0 0.65rem; + font-size: 1.15rem; + line-height: 1.28; +} + +.kova-page p { + line-height: 1.72; +} + +.kova-page a { + text-decoration: none; +} + +.kova-page code { + color: #dce5ff; + background: rgba(124, 144, 255, 0.13); + border: 1px solid rgba(124, 144, 255, 0.17); + border-radius: 6px; + padding: 0.08rem 0.34rem; + font-size: 0.9em; +} + +.kova-section-nav { + position: sticky; + top: 0.6rem; + z-index: 20; + display: flex; + gap: 0.4rem; + align-items: center; + width: fit-content; + max-width: calc(100% - 2rem); + margin: 0 auto; + padding: 0.55rem; + overflow-x: auto; + background: rgba(8, 15, 27, 0.86); + border: 1px solid rgba(145, 170, 214, 0.2); + border-radius: 999px; + box-shadow: 0 12px 40px rgba(2, 7, 16, 0.28); + backdrop-filter: blur(16px); + scrollbar-width: none; +} + +.kova-section-nav::-webkit-scrollbar { + display: none; +} + +.kova-section-nav a { + flex: 0 0 auto; + color: var(--kova-muted); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.02em; + padding: 0.56rem 0.82rem; + border-radius: 999px; + transition: color 160ms ease, background 160ms ease; +} + +.kova-section-nav a:hover, +.kova-section-nav a:focus-visible { + color: #fff; + background: rgba(124, 144, 255, 0.14); +} + +.kova-hero { + display: grid; + grid-template-columns: minmax(0, 1.02fr) minmax(380px, 0.98fr); + gap: clamp(2rem, 5vw, 5.5rem); + align-items: center; + min-height: 720px; + padding: clamp(4.3rem, 8vw, 7.8rem) clamp(1.25rem, 5.8vw, 6.8rem) clamp(3.5rem, 7vw, 6.5rem); + position: relative; +} + +.kova-hero::before { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + background-image: + linear-gradient(rgba(138, 165, 214, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(138, 165, 214, 0.035) 1px, transparent 1px); + background-size: 42px 42px; + mask-image: linear-gradient(to bottom, #000 0%, rgba(0, 0, 0, 0.6) 56%, transparent 100%); +} + +.kova-hero-copy, +.kova-hero-media { + position: relative; + z-index: 1; +} + +.kova-eyebrow-row { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-bottom: 1.5rem; +} + +.kova-chip { + display: inline-flex; + align-items: center; + min-height: 1.9rem; + padding: 0.38rem 0.7rem; + color: #c7d4e9; + background: rgba(255, 255, 255, 0.035); + border: 1px solid var(--kova-line); + border-radius: 999px; + font-size: 0.7rem; + font-weight: 750; + letter-spacing: 0.035em; +} + +.kova-chip-accent { + color: #cfd7ff; + background: rgba(124, 144, 255, 0.1); + border-color: rgba(124, 144, 255, 0.26); +} + +.kova-kicker, +.kova-section-label, +.kova-card-label, +.kova-code-label, +.kova-related-type { + margin: 0 0 0.72rem !important; + color: var(--kova-cyan) !important; + font-size: 0.71rem; + font-weight: 800; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.kova-hero h1 { + margin: 0; + font-size: clamp(5.2rem, 12vw, 10.5rem); + line-height: 0.82; + letter-spacing: -0.09em; + background: linear-gradient(135deg, #ffffff 8%, #c8d3ff 46%, #7c90ff 78%, #62d6db 115%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + text-shadow: 0 18px 65px rgba(86, 105, 255, 0.16); +} + +.kova-hero h2 { + max-width: 720px; + margin: 1.5rem 0 1.1rem; + font-size: clamp(1.65rem, 3.2vw, 3rem); + line-height: 1.08; +} + +.kova-lead { + max-width: 760px; + margin-top: 0; + font-size: clamp(1.02rem, 1.45vw, 1.2rem); + color: #d5e0f1 !important; +} + +.kova-hero-copy > p:not(.kova-kicker):not(.kova-lead) { + color: var(--kova-muted); +} + +.kova-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + align-items: center; + margin-top: 2rem; +} + +.kova-button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.95rem; + padding: 0.78rem 1.15rem; + border-radius: 12px; + font-size: 0.86rem; + font-weight: 800; + transition: transform 160ms ease, border-color 160ms ease, background 160ms ease; +} + +.kova-button:hover, +.kova-button:focus-visible { + transform: translateY(-2px); +} + +.kova-button-primary { + color: #07101b !important; + background: linear-gradient(135deg, #a8b5ff, #6edfe1); + border: 1px solid rgba(255, 255, 255, 0.42); + box-shadow: 0 12px 35px rgba(93, 129, 255, 0.22); +} + +.kova-button-secondary { + color: #eef4ff !important; + background: rgba(255, 255, 255, 0.035); + border: 1px solid var(--kova-line); +} + +.kova-text-link { + color: #c8d4e7 !important; + padding: 0.65rem 0.2rem; + font-size: 0.84rem; + font-weight: 750; +} + +.kova-text-link::after, +.kova-related-grid a::after, +.kova-inline-links a::after { + content: " ->"; +} + +.kova-media { + margin: 0; + overflow: hidden; + background: #08111e; + border: 1px solid rgba(147, 174, 221, 0.2); + border-radius: var(--kova-radius); + box-shadow: 0 26px 70px rgba(1, 6, 14, 0.4); +} + +.kova-media .img-link, +.kova-architecture .img-link { + display: block; + width: 100%; + border: 0; + box-shadow: none; +} + +.kova-media img, +.kova-architecture img { + display: block; + width: 100%; + height: auto; + border-radius: 0; + box-shadow: none; + margin: 0; +} + +.kova-media figcaption, +.kova-architecture figcaption { + display: flex; + justify-content: space-between; + gap: 1rem; + align-items: flex-start; + padding: 0.9rem 1rem; + color: #aebcd1 !important; + background: rgba(9, 17, 30, 0.94); + border-top: 1px solid var(--kova-line); + font-size: 0.76rem; + line-height: 1.5; +} + +.kova-placeholder-note { + flex: 0 0 auto; + color: var(--kova-amber) !important; + font-weight: 700; +} + +.kova-hero-media { + transform: perspective(1200px) rotateY(-3deg) rotateX(1deg); +} + +.kova-proof-strip { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + border-top: 1px solid var(--kova-line); + border-bottom: 1px solid var(--kova-line); + background: rgba(4, 10, 19, 0.38); +} + +.kova-proof-strip article { + padding: 1.45rem 1.35rem 1.55rem; + border-right: 1px solid var(--kova-line); +} + +.kova-proof-strip article:last-child { + border-right: 0; +} + +.kova-proof-strip strong { + display: block; + margin-bottom: 0.5rem; + font-size: 0.87rem; +} + +.kova-proof-strip p { + margin: 0; + color: var(--kova-muted) !important; + font-size: 0.78rem; + line-height: 1.55; +} + +.kova-section { + padding: clamp(4.2rem, 8vw, 8rem) clamp(1.25rem, 5.8vw, 6.8rem); + border-top: 1px solid var(--kova-line); +} + +.kova-section-intro { + max-width: 950px; + color: #c5d1e3 !important; + font-size: clamp(1rem, 1.4vw, 1.18rem); +} + +.kova-overview-grid, +.kova-api-section, +.kova-about, +.kova-separation { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(300px, 0.75fr); + gap: clamp(2rem, 6vw, 6rem); + align-items: start; +} + +.kova-overview-grid > div > p:not(.kova-section-label), +.kova-about > div > p:not(.kova-section-label), +.kova-separation > div > p:not(.kova-section-label) { + color: var(--kova-muted); +} + +.kova-status-card, +.kova-controls-card, +.kova-proof-card, +.kova-limit-card, +.kova-callout, +.kova-about-card, +.kova-roadmap-column { + background: var(--kova-panel); + border: 1px solid var(--kova-line); + border-radius: 18px; + padding: 1.35rem; + box-shadow: 0 14px 45px rgba(1, 6, 14, 0.18); +} + +.kova-status-card { + position: sticky; + top: 5.5rem; +} + +.kova-check-list, +.kova-compact-list, +.kova-controls-card ul, +.kova-number-list { + margin: 0; + padding: 0; + list-style: none; +} + +.kova-check-list li, +.kova-compact-list li, +.kova-controls-card li, +.kova-number-list li { + position: relative; + padding: 0.55rem 0 0.55rem 1.25rem; + color: #c2cee0; + border-bottom: 1px solid rgba(151, 180, 228, 0.1); + font-size: 0.86rem; + line-height: 1.5; +} + +.kova-check-list li:last-child, +.kova-compact-list li:last-child, +.kova-controls-card li:last-child, +.kova-number-list li:last-child { + border-bottom: 0; +} + +.kova-check-list li::before, +.kova-compact-list li::before, +.kova-controls-card li::before { + content: ""; + position: absolute; + left: 0; + top: 1.05rem; + width: 0.42rem; + height: 0.42rem; + border-radius: 50%; + background: linear-gradient(135deg, var(--kova-blue), var(--kova-cyan)); + box-shadow: 0 0 0 4px rgba(111, 164, 238, 0.08); +} + +.kova-number-list { + counter-reset: kova-step; + margin: 1.2rem 0 1.5rem; +} + +.kova-number-list li { + counter-increment: kova-step; + padding-left: 2.4rem; +} + +.kova-number-list li::before { + content: counter(kova-step, decimal-leading-zero); + position: absolute; + left: 0; + color: var(--kova-blue-bright); + font-size: 0.72rem; + font-weight: 800; + letter-spacing: 0.08em; +} + +.kova-demo { + position: relative; +} + +.kova-demo-primary { + background: + radial-gradient(circle at 87% 20%, rgba(91, 113, 255, 0.09), transparent 28rem), + rgba(255, 255, 255, 0.008); +} + +.kova-demo-heading { + display: flex; + justify-content: space-between; + gap: 1rem; + align-items: end; + margin-bottom: 0.6rem; +} + +.kova-demo-tag { + display: inline-flex; + align-items: center; + color: #cbd6e9; + background: rgba(255, 255, 255, 0.035); + border: 1px solid var(--kova-line); + border-radius: 999px; + padding: 0.5rem 0.72rem; + font-size: 0.7rem; + font-weight: 750; + white-space: nowrap; +} + +.kova-demo-grid { + display: grid; + grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); + gap: clamp(1.5rem, 4vw, 4rem); + align-items: start; + margin-top: 2.5rem; +} + +.kova-controls-card, +.kova-proof-card, +.kova-limit-card { + margin-top: 1rem; +} + +.kova-code-tabs { + min-width: 0; + border: 1px solid var(--kova-line); + border-radius: 18px; + overflow: hidden; + background: rgba(5, 10, 19, 0.55); +} + +.kova-tab-list { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + background: rgba(13, 22, 37, 0.94); + border-bottom: 1px solid var(--kova-line); +} + +.kova-tab-list button { + border: 0; + border-right: 1px solid var(--kova-line); + background: transparent; + color: #98a9c2; + padding: 0.92rem 0.7rem; + font-size: 0.78rem; + font-weight: 800; +} + +.kova-tab-list button:last-child { + border-right: 0; +} + +.kova-tab-list button[aria-selected="true"] { + color: #fff; + background: linear-gradient(180deg, rgba(124, 144, 255, 0.16), rgba(124, 144, 255, 0.05)); + box-shadow: inset 0 -2px 0 var(--kova-blue); +} + +.kova-tab-list button:focus-visible { + outline: 2px solid var(--kova-cyan); + outline-offset: -3px; +} + +.kova-tab-panel { + padding: 1rem; +} + +.kova-tab-panel[hidden] { + display: none; +} + +.kova-code-label { + padding: 0.2rem 0.15rem 0; +} + +.kova-code-block { + position: relative; + min-width: 0; + margin: 0; + overflow: hidden; + background: #050a12; + border: 1px solid rgba(137, 163, 207, 0.16); + border-radius: 14px; +} + +.kova-code-block + .kova-code-block { + margin-top: 1rem; +} + +.kova-code-block pre, +.kova-terminal pre { + margin: 0; + max-height: 34rem; + overflow: auto; + padding: 1.15rem 1rem; + background: transparent; + border: 0; + border-radius: 0; + scrollbar-color: #2d4261 transparent; +} + +.kova-code-block pre code, +.kova-terminal pre code { + display: block; + width: max-content; + min-width: 100%; + padding: 0; + color: #d9e4f5; + background: transparent; + border: 0; + font-size: 0.76rem; + line-height: 1.68; + tab-size: 4; +} + +.kova-copy { + position: absolute; + top: 0.65rem; + right: 0.65rem; + z-index: 2; + min-width: 3.5rem; + color: #cbd7e9; + background: rgba(17, 30, 49, 0.94); + border: 1px solid rgba(151, 180, 228, 0.2); + border-radius: 8px; + padding: 0.4rem 0.55rem; + font-size: 0.66rem; + font-weight: 800; +} + +.kova-copy:hover, +.kova-copy:focus-visible { + color: #fff; + border-color: rgba(124, 144, 255, 0.55); +} + +.kova-code-note { + margin: 0.8rem 0 0; + color: #91a1b8 !important; + font-size: 0.75rem; + line-height: 1.55 !important; +} + +.kova-callout { + margin-top: 1.5rem; + border-left: 3px solid var(--kova-amber); +} + +.kova-callout p:last-child, +.kova-limit-card p:last-child { + margin: 0; + color: #bdc8d9; + font-size: 0.84rem; +} + +.kova-split { + display: grid; + grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); + gap: clamp(1.5rem, 5vw, 5rem); + align-items: center; + margin-top: 2rem; +} + +.kova-split > div > p { + color: var(--kova-muted); +} + +.kova-split-reverse { + grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); +} + +.kova-list-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + margin-top: 1rem; +} + +.kova-architecture { + margin: 2.5rem 0 0; + overflow: hidden; + background: rgba(4, 10, 18, 0.55); + border: 1px solid var(--kova-line); + border-radius: var(--kova-radius); +} + +.kova-architecture figcaption { + display: block; + text-align: center; +} + +.kova-principles { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1rem; + margin-top: 1rem; +} + +.kova-principles article, +.kova-validation-grid article, +.kova-work-grid article, +.kova-related-grid article { + padding: 1.3rem; + background: rgba(18, 29, 48, 0.62); + border: 1px solid var(--kova-line); + border-radius: 17px; +} + +.kova-principles article > span, +.kova-work-index { + display: block; + margin-bottom: 1.2rem; + color: var(--kova-blue-bright); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 0.72rem; + font-weight: 800; +} + +.kova-principles p, +.kova-validation-grid p, +.kova-work-grid p, +.kova-related-grid p { + margin: 0; + color: var(--kova-muted) !important; + font-size: 0.81rem; + line-height: 1.58; +} + +.kova-api-section { + align-items: center; + background: rgba(255, 255, 255, 0.008); +} + +.kova-muted { + color: var(--kova-muted) !important; +} + +.kova-code-composition { + min-width: 0; +} + +.kova-table-wrap { + margin-top: 2rem; + overflow-x: auto; + border: 1px solid var(--kova-line); + border-radius: 18px; +} + +.kova-status-table { + width: 100%; + min-width: 760px; + margin: 0; + border-collapse: collapse; + background: rgba(8, 15, 26, 0.5); +} + +.kova-status-table th, +.kova-status-table td { + padding: 1rem; + text-align: left; + vertical-align: top; + border-right: 1px solid rgba(151, 180, 228, 0.1); + border-bottom: 1px solid rgba(151, 180, 228, 0.1); + font-size: 0.79rem; + line-height: 1.52; +} + +.kova-status-table th:last-child, +.kova-status-table td:last-child { + border-right: 0; +} + +.kova-status-table tbody tr:last-child td { + border-bottom: 0; +} + +.kova-status-table th { + color: #dbe5f5; + background: rgba(18, 29, 48, 0.9); + font-size: 0.7rem; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.kova-status-table td:nth-child(1) { + width: 24%; + color: #edf3ff; + font-weight: 750; +} + +.kova-status-table td:nth-child(2) { + width: 50%; + color: var(--kova-muted); +} + +.kova-status { + display: inline-flex; + align-items: center; + gap: 0.4rem; + white-space: nowrap; + font-size: 0.7rem; + font-weight: 800; +} + +.kova-status::before { + content: ""; + width: 0.46rem; + height: 0.46rem; + border-radius: 50%; + background: currentColor; + box-shadow: 0 0 0 4px color-mix(in srgb, currentColor 13%, transparent); +} + +.kova-status-validated { color: var(--kova-green); } +.kova-status-foundation { color: #7fb5ff; } +.kova-status-active { color: var(--kova-amber); } +.kova-status-planned { color: var(--kova-gray); } + +.kova-terminal { + margin-top: 2rem; + overflow: hidden; + background: #03070d; + border: 1px solid var(--kova-line); + border-radius: 16px; + box-shadow: 0 20px 50px rgba(1, 5, 12, 0.3); +} + +.kova-terminal-bar { + display: flex; + align-items: center; + gap: 0.45rem; + min-height: 2.55rem; + padding: 0 0.85rem; + background: #0d1726; + border-bottom: 1px solid var(--kova-line); +} + +.kova-terminal-bar span { + width: 0.58rem; + height: 0.58rem; + border-radius: 50%; + background: #52627a; +} + +.kova-terminal-bar span:nth-child(1) { background: #df726e; } +.kova-terminal-bar span:nth-child(2) { background: #d7b865; } +.kova-terminal-bar span:nth-child(3) { background: #6dbf91; } + +.kova-terminal-bar strong { + margin-left: 0.4rem; + color: #9faec3; + font-size: 0.68rem; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.kova-validation-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin-top: 2rem; +} + +.kova-validation-grid strong { + display: block; + margin-bottom: 0.55rem; + font-size: 0.86rem; +} + +.kova-work-grid, +.kova-related-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin-top: 2rem; +} + +.kova-work-grid article, +.kova-related-grid article { + min-height: 100%; +} + +.kova-roadmap-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + margin-top: 2rem; +} + +.kova-roadmap-column { + margin: 0; +} + +.kova-research-note { + margin: 1rem 0 0; + padding: 1rem 1.15rem; + color: #aebdd1 !important; + background: rgba(142, 160, 188, 0.06); + border: 1px solid rgba(142, 160, 188, 0.14); + border-radius: 14px; + font-size: 0.8rem; +} + +.kova-separation { + align-items: center; + background: rgba(255, 255, 255, 0.008); +} + +.kova-separation-diagram { + display: grid; + gap: 0.7rem; + max-width: 410px; + margin-left: auto; +} + +.kova-node { + padding: 1.35rem; + text-align: center; + background: rgba(18, 29, 48, 0.78); + border: 1px solid var(--kova-line); + border-radius: 16px; +} + +.kova-node-primary { + background: linear-gradient(135deg, rgba(124, 144, 255, 0.18), rgba(98, 214, 219, 0.08)); + border-color: rgba(124, 144, 255, 0.3); +} + +.kova-node strong, +.kova-node span { + display: block; +} + +.kova-node strong { + font-size: 1.1rem; +} + +.kova-node span { + margin-top: 0.3rem; + color: var(--kova-muted); + font-size: 0.78rem; +} + +.kova-arrow { + position: relative; + color: #788aa4; + font-size: 0.67rem; + font-weight: 800; + letter-spacing: 0.1em; + text-align: center; + text-transform: uppercase; +} + +.kova-arrow::after { + content: "v"; + display: block; + margin-top: 0.2rem; + color: var(--kova-cyan); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; +} + +.kova-related-type { + color: var(--kova-blue-bright) !important; +} + +.kova-related-grid a, +.kova-inline-links a { + display: inline-block; + margin-top: 1rem; + color: #cfdaec !important; + font-size: 0.78rem; + font-weight: 800; +} + +.kova-about-card { + margin: 0; +} + +.kova-inline-links { + display: flex; + flex-wrap: wrap; + gap: 0.75rem 1rem; + margin-top: 0.6rem; + padding-top: 0.8rem; + border-top: 1px solid rgba(151, 180, 228, 0.1); +} + +.kova-contact { + display: grid; + grid-template-columns: minmax(0, 1.3fr) minmax(260px, 0.7fr); + gap: 2rem; + align-items: center; + padding: clamp(4rem, 8vw, 7rem) clamp(1.25rem, 5.8vw, 6.8rem); + background: + radial-gradient(circle at 85% 22%, rgba(98, 214, 219, 0.14), transparent 22rem), + linear-gradient(135deg, rgba(124, 144, 255, 0.12), rgba(124, 144, 255, 0.02)); + border-top: 1px solid rgba(124, 144, 255, 0.25); +} + +.kova-contact p:not(.kova-section-label):not(.kova-contact-meta) { + color: #c5d1e3; +} + +.kova-contact-meta { + color: #91a3ba !important; + font-size: 0.78rem; + font-weight: 700; +} + +.kova-contact-actions { + display: grid; + gap: 0.75rem; +} + +.kova-disclaimer { + padding: 1.1rem 1.25rem; + color: #8494aa; + background: #050a12; + border-top: 1px solid var(--kova-line); + font-size: 0.68rem; + line-height: 1.5; + text-align: center; +} + +@media (max-width: 1199px) { + .kova-page { + border-radius: 22px; + } + + .kova-hero { + grid-template-columns: minmax(0, 1fr) minmax(330px, 0.9fr); + } + + .kova-principles { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 991px) { + .kova-page { + margin-top: 0.6rem; + } + + .kova-hero, + .kova-overview-grid, + .kova-api-section, + .kova-about, + .kova-separation, + .kova-contact { + grid-template-columns: 1fr; + } + + .kova-hero { + min-height: 0; + } + + .kova-hero-media { + transform: none; + } + + .kova-status-card { + position: static; + } + + .kova-proof-strip { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .kova-proof-strip article:nth-child(2) { + border-right: 0; + } + + .kova-proof-strip article:nth-child(-n + 2) { + border-bottom: 1px solid var(--kova-line); + } + + .kova-demo-grid, + .kova-split, + .kova-split-reverse { + grid-template-columns: 1fr; + } + + .kova-split-reverse > div { + order: 2; + } + + .kova-split-reverse > figure { + order: 1; + } + + .kova-validation-grid, + .kova-work-grid, + .kova-related-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .kova-separation-diagram { + margin-left: 0; + } +} + +@media (max-width: 720px) { + .kova-page { + border-radius: 16px; + } + + .kova-section-nav { + top: 0.35rem; + max-width: calc(100% - 0.8rem); + margin: 0.4rem auto 0; + } + + .kova-hero, + .kova-section, + .kova-contact { + padding-left: 1rem; + padding-right: 1rem; + } + + .kova-hero { + padding-top: 3.3rem; + } + + .kova-hero h1 { + font-size: clamp(4.8rem, 27vw, 7rem); + } + + .kova-actions { + align-items: stretch; + } + + .kova-button { + width: 100%; + } + + .kova-text-link { + width: 100%; + text-align: center; + } + + .kova-media figcaption, + .kova-architecture figcaption { + display: block; + } + + .kova-placeholder-note { + display: block; + margin-top: 0.35rem; + } + + .kova-proof-strip, + .kova-list-grid, + .kova-principles, + .kova-validation-grid, + .kova-work-grid, + .kova-roadmap-grid, + .kova-related-grid { + grid-template-columns: 1fr; + } + + .kova-proof-strip article { + border-right: 0; + border-bottom: 1px solid var(--kova-line); + } + + .kova-proof-strip article:last-child { + border-bottom: 0; + } + + .kova-demo-heading { + display: block; + } + + .kova-demo-tag { + margin-top: 0.4rem; + } + + .kova-tab-list { + display: none; + } + + .kova-tab-panel, + .kova-tab-panel[hidden] { + display: block !important; + padding: 1rem; + border-bottom: 1px solid var(--kova-line); + } + + .kova-tab-panel:last-child { + border-bottom: 0; + } + + .kova-code-block pre code, + .kova-terminal pre code { + font-size: 0.69rem; + } + + .kova-contact-actions { + width: 100%; + } +} + +@media (prefers-reduced-motion: reduce) { + .kova-page *, + .kova-page *::before, + .kova-page *::after { + scroll-behavior: auto !important; + transition-duration: 0.001ms !important; + animation-duration: 0.001ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/assets/img/kova/kova-architecture.svg b/assets/img/kova/kova-architecture.svg new file mode 100644 index 0000000..fed199c --- /dev/null +++ b/assets/img/kova/kova-architecture.svg @@ -0,0 +1,85 @@ + + Kova layered architecture + External projects use a public facade over foundation, backend-neutral domains, plugin and render boundaries, runtime, and WGPU and winit backends. + + + + + + + + + + + + External game or validation project + Consumes public Kova interfaces + + + + + + + + + Public facade and desktop composition + kova_desktop | KovaApp | public plugin groups + + + + + + + + + + Foundation + core | ECS | app | math | tasks | filesystem + + + + + + + + + + Backend-neutral domains + assets | scene | transform | input | camera + mesh | material | physics | diagnostics + + + + + + + + + + Plugins and render pipeline boundaries + public contracts | extraction | planning + + + + + + + + + + Runtime and runners + desktop composition | window and render loop + + + + + + + + + + Backends + WGPU | winit | platform integration + + + diff --git a/assets/img/kova/kova-basic-2d-placeholder.svg b/assets/img/kova/kova-basic-2d-placeholder.svg new file mode 100644 index 0000000..323c6cc --- /dev/null +++ b/assets/img/kova/kova-basic-2d-placeholder.svg @@ -0,0 +1,31 @@ + + Kova Basic 2D illustrated placeholder + A coral rectangle and blue hexagon overlap on a dark background. + + + + + + + + + + + + + + + + + + + + + Basic 2D + Hierarchy, generated geometry, typed color, explicit draw order + + + + MEDIA PLACEHOLDER + + diff --git a/assets/img/kova/kova-basic-3d-placeholder.svg b/assets/img/kova/kova-basic-3d-placeholder.svg new file mode 100644 index 0000000..f63a1c1 --- /dev/null +++ b/assets/img/kova/kova-basic-3d-placeholder.svg @@ -0,0 +1,35 @@ + + Kova Basic 3D illustrated placeholder + A blue cube on a white circular base with an angled perspective composition and visible light. + + + + + + + + + + + + + + + + + + + + + + + + + Basic 3D + Generated mesh, lit material, point light, perspective camera + + + + MEDIA PLACEHOLDER + + diff --git a/assets/img/kova/kova-camera-orbit-placeholder.svg b/assets/img/kova/kova-camera-orbit-placeholder.svg new file mode 100644 index 0000000..5eb6fdb --- /dev/null +++ b/assets/img/kova/kova-camera-orbit-placeholder.svg @@ -0,0 +1,76 @@ + + Kova Camera Orbit illustrated placeholder + A blue cube on a white circular base with a curved orbit path and a camera marker. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Camera Orbit + Public input, camera, scene, and transform APIs + + + + + + + + + + + MEDIA PLACEHOLDER + + diff --git a/assets/img/kova/kova-social-preview.svg b/assets/img/kova/kova-social-preview.svg new file mode 100644 index 0000000..02eecfc --- /dev/null +++ b/assets/img/kova/kova-social-preview.svg @@ -0,0 +1,37 @@ + + Kova Engine technical preview + Kova title, modular Rust game engine foundation subtitle, and illustrated camera orbit scene. + + + + + + + + + + + + + + + + + TECHNICAL PREVIEW + Kova + Modular Rust game engine foundation + Public-style 2D and 3D paths. Explicit backend boundaries. + + + + + + + + + + + + + Illustrated media placeholder + diff --git a/assets/js/kova.js b/assets/js/kova.js new file mode 100644 index 0000000..784783c --- /dev/null +++ b/assets/js/kova.js @@ -0,0 +1,77 @@ +(function () { + "use strict"; + + function activateTab(tabList, nextTab) { + var tabs = Array.prototype.slice.call(tabList.querySelectorAll('[role="tab"]')); + + tabs.forEach(function (tab) { + var selected = tab === nextTab; + var panelId = tab.getAttribute("aria-controls"); + var panel = document.getElementById(panelId); + + tab.setAttribute("aria-selected", selected ? "true" : "false"); + tab.tabIndex = selected ? 0 : -1; + + if (panel) { + panel.hidden = !selected; + } + }); + + nextTab.focus(); + } + + document.querySelectorAll("[data-tabs]").forEach(function (tabsRoot) { + var tabList = tabsRoot.querySelector('[role="tablist"]'); + if (!tabList) { + return; + } + + var tabs = Array.prototype.slice.call(tabList.querySelectorAll('[role="tab"]')); + + tabs.forEach(function (tab, index) { + tab.addEventListener("click", function () { + activateTab(tabList, tab); + }); + + tab.addEventListener("keydown", function (event) { + var nextIndex = index; + + if (event.key === "ArrowRight") { + nextIndex = (index + 1) % tabs.length; + } else if (event.key === "ArrowLeft") { + nextIndex = (index - 1 + tabs.length) % tabs.length; + } else if (event.key === "Home") { + nextIndex = 0; + } else if (event.key === "End") { + nextIndex = tabs.length - 1; + } else { + return; + } + + event.preventDefault(); + activateTab(tabList, tabs[nextIndex]); + }); + }); + }); + + document.querySelectorAll("[data-copy-target]").forEach(function (button) { + button.addEventListener("click", function () { + var targetId = button.getAttribute("data-copy-target"); + var target = document.getElementById(targetId); + + if (!target || !navigator.clipboard) { + return; + } + + navigator.clipboard.writeText(target.textContent || "").then(function () { + var previous = button.textContent; + button.textContent = "Copied"; + window.setTimeout(function () { + button.textContent = previous; + }, 1400); + }).catch(function () { + button.textContent = "Select code"; + }); + }); + }); +})(); diff --git a/projects/kova.md b/projects/kova.md new file mode 100644 index 0000000..f1df42c --- /dev/null +++ b/projects/kova.md @@ -0,0 +1,645 @@ +--- +layout: kova +title: Kova Engine - Modular Rust Game Engine Technical Preview +description: Kova is a modular, general-purpose Rust game engine foundation with public 2D and 3D authoring APIs, explicit backend boundaries, runnable validation examples, and a long-term editor-aware architecture. +permalink: /projects/kova/ +image: + path: /assets/img/kova/kova-social-preview.svg + alt: Kova engine technical preview artwork with a cube and orbit path +--- + +
+ + +
+
+
+ Rust + Private development repository + Preparing for public-source pre-alpha +
+

Technical preview

+

Kova

+

A modular, general-purpose game engine foundation written in Rust.

+

Kova explores a library-first engine architecture with public 2D and 3D authoring APIs, explicit plugin and backend boundaries, and validation through real runnable examples.

+

The engine is under active private development. Its current milestone proves the core public application, scene, rendering, input, and transform paths without requiring game code to manage WGPU, winit, or the renderer lifecycle directly.

+ +
+ +
+ Illustrated placeholder for the Kova Camera Orbit demo, showing a blue cube on a circular base with an orbit path +
+ Camera orbit driven through Kova's public app, input, camera, and transform APIs. + Illustrated placeholder. Replace with the current engine capture. +
+
+
+ +
+
+ Runnable 2D and 3D paths +

Public engine APIs are exercised through real desktop examples rather than architecture documents alone.

+
+
+ Backend-hidden user API +

Ordinary example code does not manage WGPU resources, winit events, or manual render lifecycle stages.

+
+
+ Validation-driven development +

Visual examples are paired with deterministic or backend-free smoke paths where practical.

+
+
+ Public release preparation +

The private repository is being prepared for an explicitly unstable public-source pre-alpha release.

+
+
+ +
+
+ +

What Kova is

+

Kova is a general-purpose engine foundation rather than a game-specific framework or renderer experiment.

+

Its public surface is being designed so that an external project can construct an application, compose plugins, author scenes, create assets, respond to input, and run through a normal desktop path without reaching into backend implementation details.

+

The current codebase includes engine foundation, ECS and application layers, public scene and transform authoring, 2D and 3D rendering paths, input and camera APIs, assets, materials, meshes, diagnostics, desktop runtime composition, and optional voxel extension work.

+

Kova remains pre-alpha. The current examples prove selected vertical paths. They do not yet claim that the engine can ship a complete production game.

+
+ +
+ +
+ +

Public-style code, visible output

+

The examples live outside engine crates and use the same public facades intended for external projects. Each one targets a small, inspectable vertical path instead of hiding missing functionality behind demo-only helpers.

+
+ +
+
+
+ +

Camera Orbit

+
+ Interactive 3D +
+ +

A small interactive 3D example built entirely through public Kova app, desktop, input, scene, mesh, material, light, camera, and transform APIs. Mouse input updates the camera's local transform while Kova's normal transform propagation derives the global state before extraction and rendering.

+ +
+
+
+ Illustrated placeholder for the Kova Camera Orbit demo +
+ Slow horizontal orbit with a small pitch change and a loop back toward the starting view. + Replace with WebM, MP4, and poster assets. +
+
+ +
+

Controls

+
    +
  • Move the mouse to orbit around the scene
  • +
  • Press Escape to release the cursor
  • +
  • Click the left mouse button to capture it again
  • +
  • Vertical rotation is clamped to prevent inversion
  • +
+
+ +
+

What it proves

+
    +
  • Public KovaApp construction and desktop plugin composition
  • +
  • Ordinary Startup and Update systems
  • +
  • Keyboard, mouse button, and mouse motion resources
  • +
  • Public camera, transform, material, mesh, and light authoring
  • +
  • Cursor capture through a public window-facing contract
  • +
  • No direct WGPU, winit, or manual renderer lifecycle usage
  • +
+
+
+ +
+
+ + + +
+ +
+

Application and system composition

+
+ +
use kova_desktop::prelude::*;
+
+let mut app = KovaApp::new();
+app.add_plugins(
+    KovaDesktopPlugins::new()
+        .with_window_title(WindowTitle::new("Kova Camera Orbit"))
+        .with_window_size(WindowSize::new(960, 540)),
+)?;
+
+app.world_mut()
+    .insert_resource(CameraOrbitSettings::default());
+app.world_mut()
+    .insert_resource(CameraOrbitState::from_settings(
+        CameraOrbitSettings::default(),
+    ));
+
+app.add_systems(Startup, setup_camera_orbit_scene);
+app.add_systems(Update, update_camera_orbit);
+app.run()?;
+
+

Representative excerpt from the current private example. Error handling and cursor-state setup are shortened here for readability.

+
+ + + + +
+
+ + +
+ +
+
+
+ +

Basic 3D

+
+ Lit 3D scene +
+ +
+
+ Illustrated placeholder of a blue cube on a white circular base for the Kova Basic 3D example +
+ A blue cube on a white circular base rendered by the Kova Basic 3D example. + Replace with kova-basic-3d.webp. +
+
+ +
+

The Basic 3D example is a minimal static desktop scene authored through the same public APIs intended for external engine users.

+

It creates generated meshes, lit standard materials, ambient lighting, a photometric point light, a perspective camera, and local transforms before running through Kova's public desktop path.

+ +
+ +
let mut app = KovaApp::new();
+app.add_plugins(
+    KovaDesktopPlugins::new()
+        .with_window_title(WindowTitle::new("Kova Basic 3D"))
+        .with_window_size(WindowSize::new(960, 540)),
+)?;
+app.add_systems(Startup, setup_basic_3d_scene);
+app.run()?;
+
+ +
+ +
let camera_transform =
+    Transform3d::from_xyz(-2.5, 4.5, 9.0)
+        .looking_at(Vec3::ZERO, Vec3::Y);
+
+scene.camera_3d_local(camera, camera_transform);
+
+
+
+ +
+
+

What it proves

+
    +
  • One normal public desktop runner path
  • +
  • Generated meshes with position and normal data
  • +
  • Public lit material descriptors and camera authoring
  • +
  • Local-to-global transform propagation
  • +
  • A lit forward rendering path
  • +
  • No manual prepare, queue, render, or present calls
  • +
+
+ +
+
+ +
+
+
+ +

Basic 2D

+
+ Ordered 2D scene +
+ +
+
+

The Basic 2D example validates a separate 2D authoring path rather than presenting 2D objects as dummy 3D geometry.

+

A translated and rotated root owns two child draws. Explicit DrawOrder2d values prove that visible ordering is independent of entity creation order.

+ +
+ +
world.spawn(KovaDesktopScene2d::default_camera())?;
+
+let root = world.spawn((
+    Transform2d::from_translation_xy(-0.65, -0.20)
+        .with_rotation(AngleRadians::new(0.12)),
+    GlobalTransform2d::IDENTITY,
+))?;
+
+let front = world.spawn((
+    Mesh2d::new(front_mesh),
+    MeshMaterial2d::new(front_material),
+    DrawOrder2d::new(10),
+    Transform2d::from_translation_xy(0.75, 0.15)
+        .with_rotation(AngleRadians::new(-0.22)),
+    GlobalTransform2d::IDENTITY,
+))?;
+
+world.insert_component(front, Parent::new(root))?;
+
+
+ +
+ Illustrated placeholder of a coral rectangle and blue hexagon for the Kova Basic 2D example +
+ A coral rectangle and blue hexagon rendered through Kova's public 2D APIs. + Replace with kova-basic-2d.webp. +
+
+
+ +
+
+

What it proves

+
    +
  • An orthographic public 2D camera
  • +
  • Generated rectangle and regular-polygon meshes
  • +
  • Typed sRGB colors and unlit material descriptors
  • +
  • Explicit 2D draw ordering
  • +
  • Parent-child transform propagation
  • +
  • A dedicated 2D path without transform-Z ordering hacks
  • +
+
+ +
+
+ +
+ +

Architecture

+

Kova is divided by ownership and dependency boundaries rather than by arbitrary feature folders. User-facing domain APIs remain separate from WGPU, winit, and platform-specific resource ownership. Runtime and backend crates may use those dependencies, but gameplay-facing code should not need to understand them.

+ +
+ Layered Kova architecture from external projects through public facade, foundation, backend-neutral domains, plugin boundaries, runtime, and backends +
Optional first-party voxel extensions use the same public extension direction and remain outside core identity.
+
+ +
+
+ 01 +

Backend-hidden gameplay APIs

+

Gameplay-facing and domain APIs should not expose WGPU objects, winit events, backend resource handles, or manual rendering lifecycle operations.

+
+
+ 02 +

Public extension symmetry

+

First-party plugins should use the same public extension mechanisms intended for future third-party plugins. Kova should not rely on privileged internal plugin paths.

+
+
+ 03 +

Product-neutral engine core

+

Kova remains independent from the Freven game, platform, content, and publishing policy. Freven acts as a downstream pressure test rather than defining the engine's public identity.

+
+
+ 04 +

Library-first, editor-aware

+

The runtime should remain usable without an editor. Editor architecture is being planned early, but it is not allowed to become a hidden requirement for building or running a project.

+
+
+
+ +
+
+ +

What engine-user code should look like

+

Kova's high-level examples are intentionally written to resemble external user code.

+
    +
  1. Construct a KovaApp
  2. +
  3. Compose public plugins
  4. +
  5. Register startup and update systems
  6. +
  7. Author assets and scene entities
  8. +
  9. Respond to public input resources
  10. +
  11. Run through a public desktop path
  12. +
+

It should not need to allocate GPU buffers manually, own a surface or swapchain, call extraction stages, invoke prepare or present functions, process raw winit events, or import product-specific Freven types.

+
+ +
+
+ +
let mut app = KovaApp::new();
+
+app.add_plugins(KovaDesktopPlugins::new())?;
+app.add_systems(Startup, setup_scene);
+app.add_systems(Update, update_gameplay);
+
+app.run()?;
+
+

The exact public API remains pre-alpha and may change, but the architectural boundary is deliberate.

+
+
+ +
+ +

Current capability status

+
+ + + + + + + + + + + + + + + + + + + + + + +
AreaCurrent evidenceStatus
Application and plugin compositionKovaApp, schedules, and desktop plugin groups used by runnable examplesWorking foundation
ECS and resource modelPublic world, components, resources, systems, and hierarchy pathsWorking foundation
Desktop runnerReal WGPU and winit desktop path behind public composition APIsWorking foundation
3D scene authoringBasic 3D and Camera Orbit examplesValidated example
2D scene authoringBasic 2D example with hierarchy and draw orderingValidated example
Input and camera controlMouse, keyboard, cursor capture, and orbit cameraValidated example
Meshes, materials, and lightingGenerated geometry, lit and unlit materials, ambient and point lightWorking vertical path
Transform hierarchyPublic local and global 2D and 3D propagationValidated example
Asset identity and catalog workLogical identities, production catalog, and deterministic variant resolutionActive development
External project useClean external-consumer validation pathActive validation
EditorArchitecture and authoring tools plannedNot yet a release claim
Public source releaseLicensing, security, CI, docs, and release audit gateIn preparation
+
+
+ +
+ +

Built through validation, not diagrams alone

+

Kova's architecture is pressure-tested with small external-style applications and focused validation packages. The visual examples are kept outside engine crates and consume public interfaces. When an example discovers missing reusable functionality, that gap is fixed or tracked in the owning engine layer rather than hidden inside example-specific code.

+

Where practical, the same authored paths are paired with backend-free or bounded smoke validation so that CI can check application, scene, and frame behavior without requiring an interactive desktop.

+ +
+
examples
+
cargo +stable run --locked -p kova_example_camera_orbit
+cargo +stable run --locked -p kova_example_basic_3d
+cargo +stable run --locked -p kova_example_basic_2d
+
+

The repository is still private. These commands document the current internal examples and will become usable from a clean public checkout after the public-source release gate is completed.

+ +
+
Public facades

Examples use intended public entry points instead of backend shortcuts.

+
Dependency direction

Engine crates do not depend on example packages.

+
Backend-free checks

Visible windows are avoided when a smoke path can validate the same authored state.

+
Boundary checks

Backend-specific types are checked at layer boundaries.

+
Documented friction

API gaps discovered by examples are recorded rather than concealed.

+
External-consumer gate

Clean use outside the engine workspace is treated as a release requirement.

+
+
+ +
+ +

Current work

+

With the M2 public API validation milestone complete, current work is split between public-source release preparation, ordinary engine ergonomics, and the production content path. Recent work focuses on explicit logical asset identity, immutable production catalogs, deterministic asset variant resolution, and reproducible external-consumer validation.

+ +
+
+ 01 +

Production content architecture

+

Establishing stable logical asset identity, catalog ownership, and deterministic resolution before expanding the authoring and import workflow.

+
+
+ 02 +

External consumer path

+

Ensuring that a project outside the engine workspace can use documented public interfaces without relying on private repository structure or internal hooks.

+
+
+ 03 +

Public-source pre-alpha gate

+

Preparing licensing and provenance, security reporting, public CI, documentation, contribution workflows, distribution rules, launch examples, and a final release audit.

+
+
+
+ +
+ +

Pre-alpha means explicit limitations

+
+
+

Current limitations

+
    +
  • The repository remains private
  • +
  • Public APIs are unstable and may change
  • +
  • Kova does not yet claim that an external developer can ship a complete game
  • +
  • The editor is not production-ready and is not presented as a finished product
  • +
  • Current examples prove selected vertical paths, not complete production workflows
  • +
  • Some system-parameter ergonomics still require lower-level public World access
  • +
  • The current Basic 3D path does not prove production shadows, HDR, automatic exposure, or tonemapping
  • +
  • Packaging and distribution remain part of later readiness work
  • +
+
+
+

Active directions

+
    +
  • Production content loading and external project workflows
  • +
  • Ordinary engine-user API ergonomics
  • +
  • Editor pre-alpha architecture and tools
  • +
  • Broader renderer and material readiness
  • +
  • Audio, animation, runtime UI, and gameplay-support systems
  • +
  • Networking and server-authoritative architecture
  • +
  • Scripting, modding, and data-driven authoring
  • +
  • Optional voxel extensions as an extensibility pressure test
  • +
  • Structured interfaces for future tooling and automation
  • +
+
+
+

Structured, inspectable engine operations may later support external tools and coding agents, but agent-facing integration is currently a research direction rather than a released feature.

+
+ +
+
+ +

Engine foundation and downstream pressure test

+

Kova and Freven are deliberately separated.

+

Kova owns the reusable engine, public APIs, runtime composition, renderer boundaries, examples, and validation infrastructure.

+

Freven is a downstream game and product that can pressure-test Kova through the same public interfaces intended for other projects. Game-specific content, account systems, launcher behavior, publishing, moderation, and product policy remain outside the Kova engine repository.

+

This separation helps prevent one game's requirements from becoming accidental engine architecture.

+
+
+
KovaReusable engine foundation
+ +
FrevenGame and product pressure test
+
+
+ +
+ +

Work around engines and difficult boundaries

+ +
+ +
+
+ +

Built by Danylo Yenikeiev

+

I am a software engineer based in Poland, working across Rust, Python, TypeScript, backend systems, networking, Linux, Docker, and developer tooling.

+

Kova is my long-term engine architecture project. Building it requires work across public API design, ECS and application lifecycle, rendering boundaries, scene and transform systems, assets, input, validation infrastructure, and downstream project compatibility.

+
+
+

Open to contract and long-term work

+
    +
  • Game-engine and runtime development
  • +
  • Editor and developer tooling
  • +
  • Engine, DCC, and SDK integrations
  • +
  • Plugins and extension infrastructure
  • +
  • Networking and local services
  • +
  • Lifecycle and reliability work
  • +
  • Automation and tool-facing interfaces
  • +
  • Difficult cross-system debugging
  • +
+ +
+
+ +
+
+ +

Working on an engine, tool, or integration?

+

I am interested in technically demanding contract and long-term work around engines, editor tooling, plugins, SDKs, runtime infrastructure, and developer automation.

+

The Kova repository remains private during active development, but I can provide a focused private code walkthrough or discuss the architecture for a relevant technical opportunity.

+

Based in Poland | Europe/Warsaw | Available for remote contract work

+
+ +
+ + +