Files
website/dist/projects/index.html
2025-09-29 11:24:54 +02:00

440 lines
20 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<!-- CSS -->
<link rel="stylesheet" href="https://static.janishutz.com/css/slider.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/side-by-side.css">
<!-- SEO -->
<title>Projects | janishutz.com</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<meta name="keywords" content="projects" />
<meta name="description" content="An overview of Janis Hutz's most important projects" />
<meta name="og:title" content="Projects | janishutz.com" />
<meta name="og:description" content="An overview of Janis Hutz's most important projects" />
<meta name="og:image" content="https://static.janishutz.com/logo.jpg" />
<meta name="og:type" content="website" />
<meta name="og:url" content="https://janishutz.com/projects" />
<meta name="og:locale" content="en_GB" />
<meta property="twitter:card" content="summary_large_image">
<meta name="theme-color" content="#152b5c">
<style>
#yt-embed {
width: 70vw;
height: 40vw;
}
.side-by-side {
margin-top: 20px;
}
</style>
</head>
<body>
<nav><script>
// Themeing
let loadedTheme = localStorage.getItem( 'theme' ) ?? 'auto';
var theme = loadedTheme;
let loadTheme = () => {
loadedTheme = localStorage.getItem( 'theme' ) ?? 'auto';
if ( loadedTheme === 'auto' ) {
if ( window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {
theme = 'dark_mode';
} else {
theme = 'light_mode';
}
}
if ( theme === 'dark_mode' ) {
document.documentElement.classList.remove( 'light' );
document.documentElement.classList.add( 'dark' );
} else {
document.documentElement.classList.add( 'light' );
document.documentElement.classList.remove( 'dark' );
theme === 'light_mode';
}
}
loadTheme();
setTimeout( () => {
document.querySelector( 'body' ).classList.add( 'loaded' );
}, 500 );
function changeTheme () {
theme = document.getElementById( 'theme-select' ).value;
localStorage.setItem( 'theme', theme );
loadTheme();
}
</script>
<div class="nav-placeholder"></div>
<div class="nav-top-bar">
<a href="/" class="logo-wrapper">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="logo">
</a>
<!-- <img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="logo"> -->
<div class="nav-toggle" onclick="openMenu( 'toggle' )">
<span class="line" id="line1"></span>
<span class="line" id="line2"></span>
<span class="line" id="line3"></span>
</div>
</div>
<div class="nav-menu">
<div class="nav-link-wrapper">
<a class="nav-link-header" href="/projects">
<span class="material-symbols-outlined nav-icon">lightbulb</span>
<div>Projects</div>
</a>
<div class="nav-link-dropdown">
<a href="/projects">View all</a>
<a href="/projects/storagemanager">StorageManager</a>
<a href="/projects/qrscanner">QR & Barcode Insight</a>
<a href="/projects/libreevent">libreǝvent</a>
<a href="/projects/musicplayer">MusicPlayer</a>
<a href="https://conductorcalc.com" target="_blank">ConductorCalc</a>
</div>
</div>
<div class="nav-link-wrapper">
<a class="nav-link-header" href="/services">
<span class="material-symbols-outlined nav-icon">build</span>
<div>Services</div>
</a>
<div class="nav-link-dropdown">
<a href="https://store.janishutz.com">Store</a>
<a href="https://account.janishutz.com">Account</a>
<a href="https://development.janishutz.com">Custom Websites</a>
</div>
</div>
<a href="/" class="logo-wrapper">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="logo">
</a>
<div class="nav-link-wrapper">
<a class="nav-link-header" href="/about">
<span class="material-symbols-outlined nav-icon">info</span>
<div>About</div>
</a>
<div class="nav-link-dropdown">
<a href="/about">About janishutz.com</a>
<a href="/about/aboutme">About Janis Hutz</a>
<a href="https://blog.janishutz.com" target="_blank">Blog</a>
<a href="/legal">Legal</a>
</div>
</div>
<div class="nav-link-wrapper">
<a class="nav-link-header" href="/support">
<span class="material-symbols-outlined nav-icon">support_agent</span>
<div>Support</div>
</a>
<div class="nav-link-dropdown">
<a href="https://support.janishutz.com" target="_blank">Support Hub</a>
<a href="https://support.janishutz.com/knowledgebase.php" target="_blank">Knowledgebase</a>
<a href="/support/old">Old websites</a>
</div>
</div>
</div>
<script>
const toggle = document.getElementsByClassName( 'nav-toggle' )[ 0 ];
const menu = document.getElementsByClassName( 'nav-menu' )[ 0 ];
const bar = document.getElementsByClassName( 'nav-top-bar' )[ 0 ];
function openMenu( action ) {
if ( action === 'toggle' ) {
if ( menu.classList.contains( 'active' ) ) {
openMenu( 'close' );
} else {
openMenu( 'open' );
}
} else if ( action === 'close' ) {
menu.classList.remove( 'active' );
toggle.classList.remove( 'active' );
document.body.classList.remove( 'no-scroll' );
} else if ( action === 'open' ) {
document.body.classList.add( 'no-scroll' );
toggle.classList.add( 'active' );
menu.classList.add( 'active' );
bar.classList.remove( 'slide-up' );
menu.classList.remove( 'slide-up' );
}
}
let oldScroll = 0;
document.addEventListener( 'scroll', () => {
if ( oldScroll < window.scrollY && window.innerHeight * 0.2 < window.scrollY ) {
bar.classList.add( 'slide-up' );
menu.classList.add( 'slide-up' );
} else if ( oldScroll > window.scrollY ) {
bar.classList.remove( 'slide-up' );
menu.classList.remove( 'slide-up' );
}
oldScroll = window.scrollY;
} );
// TODO: Hide menu on when scrolling down
</script>
</nav>
<div class="slider">
<div class="slider-container">
<div class="slider-element current"
style="background-image: url( 'https://store-cdn.janishutz.com/assets/libreevent/libreevent-title.jpg' );">
<a href="/projects/libreevent" class="button offset-button">libreǝvent</a>
</div>
<div class="slider-element"
style="background-image: url( 'https://static.janishutz.com/assets/projects/conductorcalc-title.jpg' );">
<div class="slider-info">
<h2>ConductorCalc</h2>
<p>Professional Wire Calculation software</p>
<a href="https://conductorcalc.com" class="button" target="_blank">ConductorCalc</a>
</div>
</div>
<div class="slider-element"
style="background-image: url( 'https://static.janishutz.com/assets/projects/storagemanager-title.jpg' );">
<div class="slider-info">
<h2>StorageManager</h2>
<p>Solving your storage management issues</p>
<a href="/projects/storagemanager" class="button">StorageManager</a>
</div>
</div>
<div class="slider-element"
style="background-image: url( 'https://static.janishutz.com/assets/projects/qrscanner-title.jpg' );">
<div class="slider-info">
<h2>QR &amp; Barcode Insight</h2>
<p>QR Scanner that makes you feel safer when scanning QR codes</p>
<a href="/projects/qrscanner" class="button">QR &amp; Barcode Insight</a>
</div>
</div>
<div class="slider-element"
style="background-image: url( 'https://static.janishutz.com/assets/projects/musicplayer-title.jpg' );">
<div class="slider-info">
<h2>MusicPlayer</h2>
<p>Your one-stop solution for the music at your next party</p>
<a href="/projects/musicplayer" class="button">MusicPlayer</a>
</div>
</div>
</div>
<span class="slider-controls slider-control-left material-symbols-outlined"
onclick="sliderControl( 'previous' )">arrow_back</span>
<span class="slider-controls slider-control-right material-symbols-outlined"
onclick="sliderControl( 'next' )">arrow_forward
</div>
</div>
<div class="content" style="margin-top: 50px;">
<h1>Projects</h1>
<p>Discover my software projects</p>
<hr class="divider" style="margin-top: 50px;">
<h2 id="foss">Open Source Projects</h2>
<p>Projects you can use for free, that have their source code publicly available and you can help develop</p>
<p>You may find all of them <a href="https://github.com/janishutz?tab=repositories" target="_blank">here</a></p>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://libreevent.janishutz.com/assets/logo.png" alt="libreevent logo"
class="project-logo small-logo">
<h3>libreevent</h3>
<p>Tired of paying for event management software and want to gain control over your data? libreevent is
a powerful tool to sell tickets for your next event. Complete with mobile apps for entry control</p>
<a href="/projects/libreevent" class="button">Details</a>
</div>
<div class="side-by-side-item right">
<img src="https://github.com/janishutz/MusicPlayerV2/raw/master/assets/logo.png"
alt="musicplayer logo" class="project-logo small-logo">
<h3>MusicPlayer</h3>
<p>A browser-based Music Player with remote playlist sharing and support for your local playlists, as
well as Apple Music</p>
<a href="/projects/musicplayer" class="button">Details</a>
</div>
</div>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://static.janishutz.com/assets/logos/impress.jpg" alt="impress.js logo" class="project-logo small-logo">
<h3>impress</h3>
<p>A JavaScript library to create fancy browser-based presentations in 3D. Not my own project, but one I occasionally contribute to</p>
<a href="https://github.com/impress/impress.js" class="button" target="_blank">GitHub</a>
</div>
<div class="side-by-side-item right">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="project-logo small-logo">
<h3>Arch-Dev-VM</h3>
<p>Looking for an easy to set up Arch Linux virtual machine for development? The scripts here allow you
to set up an Arch Linux Virtual Machine in under 1 hour, of which most time is waiting for downloads
to finish.</p>
<a href="https://github.com/janishutz/arch-dev-vm" class="button" target="_blank">GitHub</a>
</div>
</div>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://raw.githubusercontent.com/janishutz/BiogasControllerApp/refs/heads/main/BiogasControllerAppLogo.png"
alt="biogascontrollerapp logo" class="project-logo small-logo">
<h3>BiogasControllerApp</h3>
<p>A small KivyMD-based application to control a small Biogas Plant in the subject ENATECH at
Kantonsschule Wohlen</p>
<a href="/projects/biogascontrollerapp" class="button">Details</a>
</div>
<div class="side-by-side-item right">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="project-logo small-logo">
<h3>Configurations, etc</h3>
<p>Various configuration files I personally use are available on my personal Gitea instance</p>
<a href="https://git.janishutz.com/janishutz?tab=repositories" class="button" target="_blank">Git</a>
</div>
</div>
<hr class="divider" style="margin-top: 75px;">
<h2 id="ios">iOS Apps</h2>
<p>Apps designed for your phone and tablet</p>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://static.janishutz.com/assets/logos/storagemanager.jpg" alt="StorageManager logo" class="project-logo small-logo">
<h3>StorageManager</h3>
<p>Missing stock keeping in your home storage? Keep throwing food away because it went bad?
StorageManager aims to help you with this by providing easy to use tools to keep track of what you
have</p>
<a href="/projects/storagemanager" class="button">Details</a>
</div>
<div class="side-by-side-item right">
<img src="https://static.janishutz.com/assets/logos/qrscanner.jpg" alt="QR & Barcode Insight logo" class="project-logo small-logo">
<h3>QR &amp; Barcode Insight</h3>
<p>QR Codes have become a massive security risk. QR &amp; Barcode Insight helps protect you by showing
you the unfiltered content of QR codes as well as the option to check the scanned links with
Google's Safe Search API</p>
<a href="/projects/qrscanner" class="button">Details</a>
</div>
</div>
<hr class="divider" style="margin-top: 75px;">
<h2 id="proprietary">Proprietary Software</h2>
<p>Cross-Platform apps, available in browsers or even app stores!</p>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://cdn.conductorcalc.com/logo.jpg" alt="impress.js logo" class="project-logo small-logo">
<h3>ConductorCalc</h3>
<p>Your all-in-one solution for calculating parameters when designing high-voltage lines</p>
<a href="https://conductorcalc.com" target="_blank" class="button">Details</a>
</div>
<div class="side-by-side-item right">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="project-logo small-logo">
<h3>Store</h3>
<p>The way to buy my software and support the development of my open source software</p>
<a href="https://store.janishutz.com" class="button" target="_blank">Store</a>
</div>
</div>
<div class="side-by-side">
<div class="side-by-side-item left">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="project-logo small-logo">
<h3>Accounts</h3>
<p>Tired of creating lots of accounts? All my services rely on a single account backend, not requiring
you to create a new account for each</p>
<a href="https://account.janishutz.com" class="button" target="_blank">Account</a>
</div>
<div class="side-by-side-item right">
<img src="https://static.janishutz.com/assets/logos/lsh.png" alt="Language School Hossegor logo" class="project-logo small-logo">
<h3>Language School Hossegor Booking System</h3>
<p>A fully featured booking system for a French language school, written from scratch specifically for
their purposes with a highly customizable booking process.</p>
<a href="/projects/languageschoolhossegor-booking" class="button">Details</a>
</div>
</div>
</div>
<footer><div class="footer-container">
<img src="https://static.janishutz.com/logo.jpg" alt="janishutz.com logo" class="logo">
<div class="footer-text-container">
<div class="footer-category">
<h3>Projects</h3>
<a href="/projects">View all</a>
<a href="/projects/storagemanager">StorageManager</a>
<a href="/projects/qrscanner">QR & Barcode Insight</a>
<a href="/projects/libreevent">libreǝvent</a>
<a href="/projects/musicplayer">MusicPlayer</a>
<a href="/projects/biogascontrollerapp">BiogasControllerApp</a>
</div>
<div class="footer-category">
<h3>Info</h3>
<a href="/about">About janishutz.com</a>
<a href="/about/aboutme">About Janis Hutz</a>
<div class="theme-selector">
<span class="material-symbols-outlined" id="theme-switcher-icon">light_mode</span>
<select id="theme-select" onchange="changeTheme()">
<option value="auto">Auto</option>
<option value="light_mode">Light</option>
<option value="dark_mode">Dark</option>
</select>
</div>
</div>
<div class="footer-category">
<h3>Support</h3>
<a href="https://support.janishutz.com">Get support</a>
<a href="https://support.janishutz.com/knowledgebase.php">Knowledgebase</a>
<a href="/support/support-status">Support status</a>
</div>
<div class="footer-category">
<h3>Legal</h3>
<a href="/legal/privacy">Privacy Policy</a>
<a href="/legal/tos">Terms of Service</a>
<a href="/legal/returns">Return policy</a>
<a href="/support/support-status">Support Status</a>
<div onclick="showAnalytics()" style="cursor: pointer;">Analytics</div>
</div>
<div class="analytics-notice" id="analytics">
<h2>Analytics</h2>
<p>This website uses privacy preserving product analytics allowing me to analyze aggregated statistics for this website. All data collected will not allow me to uniquely identify you. <br><a href="/legal/privacy">Privacy Policy</a></p>
<!-- Matomo stuff -->
<div id="matomo-opt-out">
Loading...
</div>
<script src="https://analytics.janishutz.com/index.php?module=CoreAdminHome&action=optOutJS&divId=matomo-opt-out&language=auto&fontColor=000000&fontSize=12px&fontFamily=monospace&showIntro=1"></script>
<!-- Matomo Image Tracker-->
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.janishutz.com/matomo.php?idsite=2&amp;rec=1" style="border:0" alt="" />
<!-- End Matomo -->
<button class="analytics-button" onclick="closeAnalytics()"><span class="material-symbols-outlined">close</span></button>
<div class="small-symbol" onclick="showAnalytics()" title="Change your analytics preferences"><span class="material-symbols-outlined">Analytics</span></div>
</div>
</div>
<script>
function closeAnalytics () {
document.getElementById( 'analytics' ).classList.remove( 'show' );
localStorage.setItem( 'analytics-dismissed', 'true' );
}
function showAnalytics () {
document.getElementById( 'analytics' ).classList.add( 'show' );
}
if ( !localStorage.getItem( 'analytics-dismissed' ) ) {
document.getElementById( 'analytics' ).classList.add( 'show' );
}
// Show which theme is loaded
document.getElementById( 'theme-select' ).value = loadedTheme;
</script>
</div>
</footer>
<script src="https://static.janishutz.com/js/yt-embed.js"></script>
<script src="https://static.janishutz.com/js/slider.js"></script>
<script>
activateSlider(7500);
</script>
</body>
</html>