440 lines
20 KiB
HTML
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 & Barcode Insight</h2>
|
|
<p>QR Scanner that makes you feel safer when scanning QR codes</p>
|
|
<a href="/projects/qrscanner" class="button">QR & 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 & Barcode Insight</h3>
|
|
<p>QR Codes have become a massive security risk. QR & 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&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>
|