Browse Source

Merge pull request 'complete rewrite' (#8) from develop into master

Reviewed-on: https://git.sp-codes.de/samuel-p/sp-codes.de/pulls/8
master
Samuel Philipp 1 week ago
parent
commit
e147e06ff2
49 changed files with 3770 additions and 4560 deletions
  1. +40
    -2
      .drone.yml
  2. +23
    -0
      .eleventy.js
  3. +2
    -0
      README.md
  4. +0
    -254
      gulpfile.js
  5. +0
    -0
      img/bg.png
  6. BIN
      img/matrix.png
  7. +0
    -0
      img/samuel.png
  8. +0
    -0
      img/sp-codes.jpg
  9. +2513
    -3874
      package-lock.json
  10. +18
    -20
      package.json
  11. +190
    -0
      scss/main.scss
  12. +60
    -0
      sites/_data/services.json
  13. +21
    -0
      sites/_data/site.js
  14. +10
    -0
      sites/_data/strings.json
  15. +82
    -0
      sites/_includes/layouts/base.njk
  16. +10
    -0
      sites/_includes/layouts/home.njk
  17. +10
    -0
      sites/_includes/layouts/services.njk
  18. +22
    -0
      sites/_includes/profiles.html
  19. +13
    -0
      sites/_includes/services-extended.html
  20. +10
    -0
      sites/_includes/services-simple.html
  21. +8
    -0
      sites/de/404.md
  22. +3
    -0
      sites/de/de.json
  23. +42
    -0
      sites/de/imprint.html
  24. +37
    -0
      sites/de/index.html
  25. +229
    -0
      sites/de/privacy.html
  26. +14
    -0
      sites/de/services.html
  27. +62
    -0
      sites/de/services/connectivitycheck.md
  28. +19
    -0
      sites/de/services/firefox-sync.md
  29. +24
    -0
      sites/de/services/gitea.md
  30. +18
    -0
      sites/de/services/invidious.md
  31. +21
    -0
      sites/de/services/matrix.md
  32. +25
    -0
      sites/de/services/searx.md
  33. +8
    -0
      sites/en/404.md
  34. +3
    -0
      sites/en/en.json
  35. +8
    -0
      sites/en/imprint.html
  36. +38
    -0
      sites/en/index.html
  37. +8
    -0
      sites/en/privacy.html
  38. +13
    -0
      sites/en/services.html
  39. +60
    -0
      sites/en/services/connectivitycheck.md
  40. +19
    -0
      sites/en/services/firefox-sync.md
  41. +23
    -0
      sites/en/services/gitea.md
  42. +17
    -0
      sites/en/services/invidious.md
  43. +21
    -0
      sites/en/services/matrix.md
  44. +26
    -0
      sites/en/services/searx.md
  45. BIN
      src/font/minotaur.ttf
  46. +0
    -51
      src/imprint.html
  47. +0
    -95
      src/index.html
  48. +0
    -184
      src/privacy.html
  49. +0
    -80
      src/scss/main.scss

+ 40
- 2
.drone.yml View File

@ -1,5 +1,6 @@
kind: pipeline
name: default
type: docker
name: build-develop
steps:
- name: build
@ -7,7 +8,37 @@ steps:
commands:
- npm install
- npm run build
- name: deploy
image: alpine
environment:
FTP_HOST:
from_secret: FTP_HOST
FTP_USERNAME:
from_secret: FTP_USERNAME
FTP_PASSWORD:
from_secret: FTP_PASSWORD
commands:
- which lftp || ( apk --update add lftp )
- lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ dev.sp-codes.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST
when:
event:
- push
trigger:
branch:
- develop
---
kind: pipeline
type: docker
name: build-master
steps:
- name: build
image: node
commands:
- npm install
- npm run build
- name: deploy
image: alpine
environment:
@ -19,4 +50,11 @@ steps:
from_secret: FTP_PASSWORD
commands:
- which lftp || ( apk --update add lftp )
- lftp -e "mirror -R ./dist/ sp-codes.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST
- lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ sp-codes.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST
when:
event:
- push
trigger:
branch:
- master

+ 23
- 0
.eleventy.js View File

@ -0,0 +1,23 @@
const eleventyNavigationPlugin = require("@11ty/eleventy-navigation");
module.exports = function(eleventyConfig) {
eleventyConfig.addWatchTarget("./scss/");
eleventyConfig.addPlugin(eleventyNavigationPlugin);
eleventyConfig.setUseGitIgnore(false);
eleventyConfig.addPassthroughCopy({
"img": "img",
"font": "font",
"node_modules/@fortawesome/fontawesome-free/webfonts/": "font",
"node_modules/flag-icon-css/flags/4x3/(de|us)*": "flags"
});
return {
dir: {
input: "sites",
includes: "_includes",
layouts: "_includes/layouts",
output: "dist"
}
};
};

+ 2
- 0
README.md View File

@ -1,5 +1,7 @@
# sp-codes.de
[![Build Status](https://ci.sp-codes.de/api/badges/samuel-p/sp-codes.de/status.svg)](https://ci.sp-codes.de/samuel-p/sp-codes.de)
Website for sp-codes.de
[GitHub](https://github.com/samuel-p/sp-codes.de)

+ 0
- 254
gulpfile.js View File

@ -1,254 +0,0 @@
/**
* Settings
* Turn on/off build features
*/
var settings = {
clean: true,
scripts: true,
styles: true,
copy: true,
reload: true
};
/**
* Paths to project folders
*/
var paths = {
input: 'src/',
output: 'dist/',
scripts: {
input: 'src/js/*.js',
output: 'dist/js/'
},
styles: {
input: 'src/scss/*.scss',
output: 'dist/css/'
},
copy: {
input: [
'src/*.html',
// 'src/.htaccess',
'src/{img,font}/**/*',
'node_modules/@fortawesome/fontawesome-free/*fonts/**/*'
],
output: 'dist/'
},
reload: './dist/'
};
/**
* Template for banner to add to file headers
*/
var banner = {
main:
'/*!' +
' <%= package.name %> v<%= package.version %>' +
' | (c) ' + new Date().getFullYear() + ' <%= package.author.name %>' +
' | <%= package.license %> License' +
' | <%= package.repository.url %>' +
' */\n'
};
/**
* Gulp Packages
*/
// General
var {src, dest, watch, series, parallel} = require('gulp');
var del = require('del');
var flatmap = require('gulp-flatmap');
var lazypipe = require('lazypipe');
var rename = require('gulp-rename');
var header = require('gulp-header');
var package = require('./package.json');
// Scripts
var concat = require('gulp-concat');
var uglify = require('gulp-terser');
var optimizejs = require('gulp-optimize-js');
// Styles
var sass = require('gulp-sass');
var postcss = require('gulp-postcss');
var prefix = require('autoprefixer');
var minify = require('cssnano');
var tildeImporter = require('node-sass-tilde-importer');
// BrowserSync
var browserSync = require('browser-sync');
/**
* Gulp Tasks
*/
// Remove pre-existing content from output folders
var cleanDist = function (done) {
// Make sure this feature is activated before running
if (!settings.clean) return done();
// Clean the dist folder
del.sync([
paths.output
]);
// Signal completion
return done();
};
// Repeated JavaScript tasks
var jsTasks = lazypipe()
.pipe(header, banner.main, {package: package})
.pipe(optimizejs)
.pipe(dest, paths.scripts.output)
.pipe(rename, {suffix: '.min'})
.pipe(uglify)
.pipe(optimizejs)
.pipe(header, banner.main, {package: package})
.pipe(dest, paths.scripts.output);
// minify, and concatenate scripts
var buildScripts = function (done) {
// Make sure this feature is activated before running
if (!settings.scripts) return done();
// Run tasks on script files
return src(paths.scripts.input)
.pipe(flatmap(function(stream, file) {
// If the file is a directory
if (file.isDirectory()) {
// Setup a suffix variable
var suffix = '';
// If separate polyfill files enabled
if (settings.polyfills) {
// Update the suffix
suffix = '.polyfills';
// Grab files that aren't polyfills, concatenate them, and process them
src([file.path + '/*.js', '!' + file.path + '/*' + paths.scripts.polyfills])
.pipe(concat(file.relative + '.js'))
.pipe(jsTasks());
}
// Grab all files and concatenate them
// If separate polyfills enabled, this will have .polyfills in the filename
src(file.path + '/*.js')
.pipe(concat(file.relative + suffix + '.js'))
.pipe(jsTasks());
return stream;
}
// Otherwise, process the file
return stream.pipe(jsTasks());
}));
};
// Process, and minify Sass files
var buildStyles = function (done) {
// Make sure this feature is activated before running
if (!settings.styles) return done();
// Run tasks on all Sass files
return src(paths.styles.input)
.pipe(sass({
importer: tildeImporter,
outputStyle: 'expanded',
sourceComments: true
}))
.pipe(postcss([
prefix({
cascade: true,
remove: true
})
]))
.pipe(header(banner.main, {package: package}))
.pipe(dest(paths.styles.output))
.pipe(rename({suffix: '.min'}))
.pipe(postcss([
minify({
discardComments: {
removeAll: true
}
})
]))
.pipe(dest(paths.styles.output));
};
// Copy static files into output folder
var copyFiles = function (done) {
// Make sure this feature is activated before running
if (!settings.copy) return done();
// Copy static files
return src(paths.copy.input)
.pipe(dest(paths.copy.output));
};
// Watch for changes to the src directory
var startServer = function (done) {
// Make sure this feature is activated before running
if (!settings.reload) return done();
// Initialize BrowserSync
browserSync.init({
server: {
baseDir: paths.reload
}
});
// Signal completion
done();
};
// Reload the browser when files change
var reloadBrowser = function (done) {
if (!settings.reload) return done();
browserSync.reload();
done();
};
// Watch for changes
var watchSource = function (done) {
watch(paths.input, series(exports.default, reloadBrowser));
done();
};
/**
* Export Tasks
*/
// Default task
// gulp
exports.default = series(
cleanDist,
parallel(
buildScripts,
buildStyles,
copyFiles
)
);
// Watch and reload
// gulp watch
exports.watch = series(
exports.default,
startServer,
watchSource
);

src/img/bg.png → img/bg.png View File


BIN
img/matrix.png View File

Before After
Width: 520  |  Height: 520  |  Size: 4.3 KiB

src/img/samuel.png → img/samuel.png View File


src/img/sp-codes.jpg → img/sp-codes.jpg View File


+ 2513
- 3874
package-lock.json
File diff suppressed because it is too large
View File


+ 18
- 20
package.json View File

@ -3,34 +3,32 @@
"version": "1.0.0",
"description": "website for sp-codes.de",
"scripts": {
"start": "gulp watch",
"build": "gulp"
"compile-sass": "node-sass --output-style compressed --importer=node_modules/node-sass-tilde-importer scss/main.scss dist/css/main.css",
"watch:eleventy": "eleventy --serve",
"watch:sass": "npm run compile-sass -- --watch",
"start": "npm-run-all compile-sass --parallel watch:*",
"build": "npm run compile-sass && eleventy && npm run move-index",
"move-index": "cpx dist/de/index.html dist/"
},
"author": "samuel-p",
"repository": {
"type": "git",
"url": "https://git.sp-codes.de/samuel-p/sp-codes.de"
},
"optionalDependencies": {
"browser-sync": "2.26.7"
},
"devDependencies": {
"gulp": "4.0.2",
"del": "3.0.0",
"lazypipe": "1.0.1",
"gulp-flatmap": "1.0.2",
"gulp-header": "2.0.5",
"gulp-rename": "1.4.0",
"gulp-concat": "2.6.1",
"gulp-terser": "1.1.7",
"gulp-optimize-js": "1.1.0",
"gulp-sass": "4.0.2",
"gulp-postcss": "8.0.0",
"cssnano": "4.1.10",
"autoprefixer": "9.6.1",
"browser-sync": "2.26.7",
"node-sass-tilde-importer": "^1.0.2"
"@11ty/eleventy": "^0.11.0",
"@11ty/eleventy-navigation": "^0.1.5",
"cpx": "^1.5.0",
"node-sass": "^4.14.1",
"node-sass-tilde-importer": "^1.0.2",
"npm-run-all": "^4.1.5"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^5.11.2",
"bootstrap": "^4.3.1",
"jquery": "^3.4.1"
"@fortawesome/fontawesome-free": "^5.13.1",
"bootstrap": "^4.5.0",
"flag-icon-css": "^3.5.0"
}
}

+ 190
- 0
scss/main.scss View File

@ -0,0 +1,190 @@
@import "~bootstrap/scss/bootstrap-grid";
@import "~bootstrap/scss/bootstrap-reboot";
@import "~bootstrap/scss/utilities/align";
@import "~bootstrap/scss/utilities/spacing";
@import "~bootstrap/scss/utilities/display";
@import "~bootstrap/scss/utilities/text";
@import "~bootstrap/scss/utilities/float";
$fa-font-path: "../font";
@import "~@fortawesome/fontawesome-free/scss/fontawesome";
@import "~@fortawesome/fontawesome-free/scss/solid";
@import "~@fortawesome/fontawesome-free/scss/brands";
@import "~@fortawesome/fontawesome-free/scss/regular";
$flag-icon-rect-path: '';
@import "~flag-icon-css/sass/flag-icon";
html, body {
height: 100%;
display: flex;
flex-direction: column;
}
body {
background-image: url("../img/bg.png");
color: #fff;
min-height: 100vh;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.content {
flex: 1;
padding: 2%;
}
.highlight {
color: #fea500;
}
a {
color: #fea500;
&:hover {
color: darken(#fea500, .5);
}
}
.logo {
display: block;
margin: 0 auto;
max-width: 256px;
max-height: 256px;
background-color: #ffffff;
border-radius: 50%;
border: 2px solid #000000;
}
.menu {
a {
color: #ffffff;
}
.active a {
font-weight: bold;
}
}
.menu-top {
border-bottom: 1px solid #ffffff;
}
.menu-bottom {
border-top: 1px solid #ffffff;
}
.border-top-bottom {
border-top: 1px solid #ffffff;
border-bottom: 1px solid #ffffff;
}
.border-top {
border-top: 1px solid #ffffff;
}
.border-bottom {
border-bottom: 1px solid #ffffff;
}
.heading {
text-align: center;
a {
color: #ffffff;
}
}
.flex-grow {
flex: 1;
}
@media (max-width: 767.98px) {
.sp-codes {
font-size: 3rem;
}
.logo {
max-width: 128px;
max-height: 128px;
}
.fa-4x {
font-size: 2em;
}
}
.service {
background-color: #222;
border: 1px solid #fff;
height: 100%;
.link {
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
}
.inner {
position: relative;
pointer-events: none;
z-index: 1;
padding: 1rem;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
height: 100%;
a {
pointer-events: all;
}
}
&.flat {
.inner {
flex-direction: row;
pointer-events: all;
text-decoration: none;
h2 {
margin-left: 0.5rem;
}
}
}
}
.contact-links a {
color: #ffffff !important;
}
.matrix-icon {
margin: 0 8px;
width: 4em;
height: 4em;
}
@media (max-width: 767.98px) {
.matrix-icon {
width: 2em;
height: 2em;
}
}
code {
background-color: #fea500;
color: #000000;
padding: 1px 3px;
border-radius: 4px;
}
pre {
background-color: #fea500;
color: #000000;
padding: 1px 3px;
border-radius: 4px;
code {
background-color: initial;
padding: initial;
border-radius: initial;
}
}

+ 60
- 0
sites/_data/services.json View File

@ -0,0 +1,60 @@
[
{
"id": "searx",
"name": "Searx",
"icon": "fas fa-search",
"url": "https://searx.sp-codes.de",
"summary": {
"de": "Eine privatsphären-respektierende, hackbare Metasuchmaschine.",
"en": "A privacy-respecting, hackable metasearch engine."
}
},
{
"id": "invidious",
"name": "Invidious",
"icon": "fab fa-youtube",
"url": "https://invidious.sp-codes.de",
"summary": {
"de": "Ein alternatives YouTube-Frontend.",
"en": "An alternative YouTube-Frontend."
}
},
{
"id": "connectivitycheck",
"name": "Captive Portal Check",
"icon": "fas fa-wifi",
"summary": {
"de": "Eine datenschutzfreundliches Tool, um Anmeldeseiten in WLAN-Netzwerken zu erkennen.",
"en": "A privacy friendly Service to detect captive portals in WIFI networks."
}
},
{
"id": "matrix",
"name": "Matrix",
"icon": "fas fa-comments",
"url": "https://chat.sp-codes.de",
"summary": {
"de": "Ein offenes Netzwerk für sichere, dezentralisierte Kommunikation.",
"en": "An open network for secure, decentralized communication."
}
},
{
"id": "gitea",
"name": "Gitea",
"icon": "fas fa-code",
"url": "https://git.sp-codes.de",
"summary": {
"de": "Eine leichtgewichtige Code-Hosting-Plattform für git.",
"en": "A lightweight code hosting platform for git."
}
},
{
"id": "firefox-sync",
"name": "Firefox Sync",
"icon": "fab fa-firefox",
"summary": {
"de": "Ein Service um Firefox Einstellungen, Lesezeichen, offene Tabs und vieles mehr über verschiedene Geräte zu synchronisieren.",
"en": "A service to sync Firefox settings, bookmarks, open tabs and much more between multiple devices."
}
}
]

+ 21
- 0
sites/_data/site.js View File

@ -0,0 +1,21 @@
module.exports = {
title: "sp-codes",
description: "Samuel Philipp - Software Engineer from Magdeburg",
url: "https://sp-codes.de",
baseUrl: "/",
author: "Samuel Philipp",
buildTime: new Date(),
languages: [
{
label: "English",
code: "en",
icon: "us"
},
{
label: "Deutsch",
code: "de",
icon: "de"
}
]
};

+ 10
- 0
sites/_data/strings.json View File

@ -0,0 +1,10 @@
{
"imprint": {
"de": "Impressum",
"en": "Imprint"
},
"privacy": {
"de": "Datenschutz",
"en": "Privacy"
}
}

+ 82
- 0
sites/_includes/layouts/base.njk View File

@ -0,0 +1,82 @@
---
title: sp-codes
---
<!doctype html>
<html lang="{{ locale }}" prefix="og: http://ogp.me/ns#">
<head>
<title>sp-codes - {{ title }}</title>
<base href="/">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="fragment" content="!">
<meta name="target" content="all">
<meta name="audience" content="all">
<meta name="coverage" content="Worldwide">
<meta name="distribution" content="Global">
<meta name="rating" content="general">
<meta name="url" content="https://sp-codes.de/">
<meta name="subject" content="sp-codes">
<meta name="description" content="Samuel Philipp - Software Engineer from Magdeburg">
<meta name="author" content="Samuel Philipp">
<meta property="og:type" content="website">
<meta property="og:locale" content="de">
<meta property="og:url" content="https://sp-codes.de/">
<meta property="og:title" content="sp-codes">
<meta property="og:description" content="Samuel Philipp - Software Engineer from Magdeburg">
<meta property="og:site_name" content="sp-codes">
<meta property="og:image" content="https://sp-codes.de/img/sp-codes.jpg">
<!--<meta property="og:updated_time" content="">-->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="sp-codes">
<meta name="twitter:description" content="Samuel Philipp - Software Engineer from Magdeburg">
<meta name="twitter:image" content="https://sp-codes.de/img/sp-codes.jpg">
<link rel="shortcut icon" href="img/samuel.png">
<link rel="stylesheet" href="/css/main.css">
</head>
<body>
<div class="d-flex justify-content-start flex-wrap p-2 menu menu-top">
{%- for entry in collections.all | eleventyNavigation %}
{% if entry.url.includes(locale) %}
<div{% if entry.url == page.url %} class="active"{% endif %}>
<a href="{{ entry.url | url }}" class="mr-2">
{% if entry.icon %}<span class="fas fa-{{ entry.icon }} mr-2"></span>{% endif %}{{ entry.title }}
</a>
</div>
{% endif %}
{%- endfor %}
<div class="flex-grow-1"></div>
{% for language in site.languages %}
{% set translatedUrl = "/" + language.code + "/" %}
{% for item in collections.all %}
{% if item.data.key == key and item.data.locale == language.code and not item.data.hidden %}
{% set translatedUrl = item.url %}
{% endif %}
{% endfor%}
<div {% if language.code == locale %} class="active"{% endif %}>
<a href="{{ translatedUrl | url }}" class="ml-3">
<span class="flag-icon flag-icon-{{ language.icon }}" title="{{ language.label }}"></span>
</a>
</div>
{% endfor %}
</div>
<div class="content">
<div class="container">
{{ content | safe }}
</div>
</div>
<div class="d-flex justify-content-start flex-wrap p-2 menu menu-bottom">
<div class="d-flex justify-content-start flex-wrap">
<div class="mr-3">Made with <span class="fas fa-heart highlight"></span> in Germany</div>
<div class="mr-3"><span class="far fa-copyright mr-2"></span>Samuel Philipp</div>
</div>
<div class="flex-sm-grow-1"></div>
<div class="d-flex justify-content-sm-start flex-wrap">
<div class="mr-3"><a href="/{{locale}}/imprint"><span class="fas fa-info-circle mr-2"></span>{{strings.imprint[locale]}}</a></div>
<div class="mr-3"><a href="/{{locale}}/privacy"><span class="fas fa-user-secret mr-2"></span>{{strings.privacy[locale]}}</a></div>
<div><a target="_blank" href="https://git.sp-codes.de/samuel-p/sp-codes.de"><span class="fas fa-code mr-2"></span>Code</a></div>
</div>
</div>
</body>
</html>

+ 10
- 0
sites/_includes/layouts/home.njk View File

@ -0,0 +1,10 @@
---
layout: base.njk
---
<div class="row py-5">
<div class="col">
<img class="logo" src="/img/samuel.png">
</div>
</div>
{{ content | safe }}

+ 10
- 0
sites/_includes/layouts/services.njk View File

@ -0,0 +1,10 @@
---
layout: base.njk
---
<a class="float-right mt-3" href="https://status.sp-codes.de" target="_blank"><i class="fas fa-heartbeat mr-2"></i>Status</a>
{{ content | safe }}
<div class="row">
{% include 'services-extended.html' %}
</div>

+ 22
- 0
sites/_includes/profiles.html View File

@ -0,0 +1,22 @@
<div class="d-flex justify-content-center flex-wrap my-3 contact-links">
<div class="m-2"><a href="mailto:mail@sp-codes.de"><span
class="fas fa-fw fa-4x fa-envelope"></span></a></div>
<div class="m-2"><a href="https://matrix.to/#/@samuel-p:matrix.sp-codes.de">
<img class="matrix-icon" src="img/matrix.png" alt=""></a></div>
<div class="m-2"><a rel="me" href="https://social.tchncs.de/@samuel_p"><span
class="fab fa-fw fa-4x fa-mastodon"></span></a></div>
<div class="m-2"><a href="https://stackoverflow.com/users/9662601/samuel-p"><span
class="fab fa-fw fa-4x fa-stack-overflow"></span></a></div>
<div class="m-2"><a href="https://gitlab.com/samuel-p"><span
class="fab fa-fw fa-4x fa-gitlab"></span></a></div>
<div class="m-2"><a href="https://github.com/samuel-p"><span
class="fab fa-fw fa-4x fa-github"></span></a></div>
<div class="m-2"><a href="https://hub.docker.com/u/samuelph"><span
class="fab fa-fw fa-4x fa-docker"></span></a></div>
</div>
<div class="d-flex justify-content-center mb-3">
<div class="lead text-center">
<a href="https://samuel-philipp.de">samuel-philipp.de</a>
</div>
</div>

+ 13
- 0
sites/_includes/services-extended.html View File

@ -0,0 +1,13 @@
{%- for service in services %}
<div class="col-12 col-md-6 col-lg-4 p-3">
<div class="service">
<a class="link" href="/{{locale}}/services/{{service.id}}"></a>
<div class="inner">
<i class="{{service.icon}} fa-4x"></i>
<h2 class="mt-2">{{service.name}}{% if service.url %} <a href="{{service.url}}" target="_blank"><i
class="fas fa-external-link-alt"></i></a>{% endif %}</h2>
<div>{{service.summary[locale]}}</div>
</div>
</div>
</div>
{%- endfor %}

+ 10
- 0
sites/_includes/services-simple.html View File

@ -0,0 +1,10 @@
{%- for service in services %}
<div class="col-12 col-md-6 p-3">
<div class="service flat">
<a class="link inner" href="/{{locale}}/services/{{service.id}}">
<i class="{{service.icon}} fa-fw fa-2x"></i>
<h2 class="mt-2">{{service.name}}</h2>
</a>
</div>
</div>
{%- endfor %}

+ 8
- 0
sites/de/404.md View File

@ -0,0 +1,8 @@
---
layout: base.njk
key: 404
title: Nicht gefunden
---
# Nicht gefunden
Diese Seite existiert (noch) nicht. Schau später nochmal vorbei, oder fang von vorne an: [Home](/{{locale}}/)

+ 3
- 0
sites/de/de.json View File

@ -0,0 +1,3 @@
{
"locale": "de"
}

+ 42
- 0
sites/de/imprint.html View File

@ -0,0 +1,42 @@
---
layout: base.njk
title: Impressum
---
<h1>Impressum</h1>
<div class="mb-3 border-bottom">
<h2>Angaben gemäß § 5 TMG:</h2>
<p>Samuel Philipp
Otto-von-Guericke-Straße 40a<br/>
39104 Magdeburg<br/>
Deutschland</p>
<h2>Kontaktmöglichkeiten</h2>
<p><strong>E-Mail-Adresse</strong>: <a href="mailto:info@sp-codes.de" target="_blank">info@sp-codes.de</a></p>
<!--<p><strong>Kontaktformular</strong>: <a href="https://sp-codes.de/contact" target="_blank">https://sp-codes.de/contact</a></p>-->
</div>
<div class="mb-3 border-bottom">
<h2>Haftungs- und Urheberrechtshinweise</h2>
<p><strong>Haftungsausschluss:</strong> Die Inhalte dieses Onlineangebotes wurden sorgfältig und nach unserem
aktuellen Kenntnisstand erstellt, dienen jedoch nur der Information und entfalten keine rechtlich bindende
Wirkung, sofern es sich nicht um gesetzlich verpflichtende Informationen (z.B. das Impressum, die
Datenschutzerklärung, AGB oder Widerrufsbelehrungen für Verbraucher) handelt. Wir behalten uns vor, die
Inhalte
vollständig oder teilweise zu ändern oder zu löschen, soweit vertragliche Verpflichtungen unberührt bleiben.
Alle Angebote sind freibleibend und unverbindlich. </p>
<p><strong>Links auf fremde Webseiten:</strong> Inhalte fremder Webseiten, auf die wir direkt oder indirekt
verweisen, liegen außerhalb unseres Verantwortungsbereiches und machen wir uns nicht zu Eigen. Für alle
Inhalte
und insbesondere für Schäden, die aus der Nutzung der in den verlinkten Webseiten aufrufbaren Informationen
entstehen, haftet allein der Anbieter der verlinkten Webseiten.</p>
<p><strong>Urheberrechte und Markenrechte:</strong> Alle auf dieser Website dargestellten Inhalte, wie Texte,
Fotografien, Grafiken, Marken und Warenzeichen sind durch die jeweiligen Schutzrechte (Urheberrechte,
Markenrechte) geschützt. Die Verwendung, Vervielfältigung usw. unterliegen unseren Rechten oder den Rechten
der
jeweiligen Urheber bzw. Rechteverwalter.</p>
<p><strong>Hinweise auf Rechtsverstöße:</strong> Sollten Sie innerhalb unseres Internetauftritts Rechtsverstöße
bemerken, bitten wir Sie uns auf diese hinzuweisen. Wir werden rechtswidrige Inhalte und Links nach
Kenntnisnahme unverzüglich entfernen.</p>
</div>
<p><a href="https://datenschutz-generator.de/?l=de"
title="Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken." target="_blank"
rel="noopener noreferrer nofollow">Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke</a>
</p>

+ 37
- 0
sites/de/index.html View File

@ -0,0 +1,37 @@
---
layout: home.njk
key: home
title: Home
eleventyNavigation:
key: home
title: Home
icon: home
---
<div class="row justify-content-center py-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading">Willkommen bei sp&#8209;codes!</h1>
<p class="lead text-center mb-2">
Schön, dass du hergefunden hast. Mein Name ist Samuel Philipp und ich bin ein Software Engineer aus
Magdeburg. Auf dieser Seite findest du Informationen über mich und eine Übersicht über die von mir
bereitgestellten Dienste. Schau dich gerne um oder nutze die verschiedenen Tools.
</p>
</div>
</div>
<div class="row justify-content-center py-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading"><a href="/{{locale}}/services">Dienste</a></h1>
<div class="row">
{% include services-simple.html %}
</div>
</div>
</div>
<div class="row justify-content-center pt-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading">Profile & Kontakt</h1>
<p class="lead text-center mb-2">
Du hast einen Fehler gefunden, Verbesserungsvorschläge, oder eine andere Frage? Nimm gerne
über eine der folgenden Plattformen Kontakt mit mir auf. Ich freue mich auf deine Nachricht!
</p>
</div>
</div>
{% include profiles.html %}

+ 229
- 0
sites/de/privacy.html View File

@ -0,0 +1,229 @@
---
layout: base.njk
title: Datenschutzerklärung
---
<h1>Datenschutzerklärung</h1>
<p>Stand: 29. Juni 2020</p>
<h2>Inhaltsübersicht</h2>
<ul>
<li><a href="/{{locale}}/privacy#m1">Verantwortlicher</a></li>
<li><a href="/{{locale}}/privacy#m2">Übersicht der Verarbeitungen</a></li>
<li><a href="/{{locale}}/privacy#m3">Maßgebliche Rechtsgrundlagen</a></li>
<li><a href="/{{locale}}/privacy#m4">Sicherheitsmaßnahmen</a></li>
<li><a href="/{{locale}}/privacy#m5">Bereitstellung des Onlineangebotes und Webhosting</a></li>
<li><a href="/{{locale}}/privacy#m6">Löschung von Daten</a></li>
<li><a href="/{{locale}}/privacy#m7">Änderung und Aktualisierung der Datenschutzerklärung</a></li>
<li><a href="/{{locale}}/privacy#m8">Rechte der betroffenen Personen</a></li>
</ul>
<div class="mb-3 border-bottom">
<h2 id="m1">Verantwortlicher</h2>
<p>
Samuel Philipp<br>
Otto-von-Guericke-Straße 40a<br>
39104 Magdeburg, Deutschland<br>
</p>
<p>
<strong>E-Mail-Adresse:</strong> info@sp-codes.de<br>
<strong>Impressum:</strong> <a href="/{{locale}}/imprint"
target="_blank">http://sp-codes.de/{{locale}}/imprint</a>
</p>
</div>
<h2 id="m2">Übersicht der Verarbeitungen</h2>
<div class="mb-3 border-bottom">
<p>Die nachfolgende Übersicht fasst die Arten der verarbeiteten Daten und die Zwecke ihrer Verarbeitung zusammen und
verweist auf die betroffenen Personen.</p>
<h3>Arten der verarbeiteten Daten</h3>
<ul>
<li>Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos).</li>
<li>Meta-/Kommunikationsdaten (z.B. Geräte-Informationen, IP-Adressen).</li>
<li>Nutzungsdaten (z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).</li>
</ul>
<h3>Kategorien betroffener Personen</h3>
<ul>
<li>Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).</li>
</ul>
<h3 id="m3">Maßgebliche Rechtsgrundlagen</h3>
<p>Im Folgenden teilen wir die Rechtsgrundlagen der
Datenschutzgrundverordnung (DSGVO), auf deren Basis wir die personenbezogenen Daten verarbeiten, mit. Bitte
beachten
Sie, dass zusätzlich zu den Regelungen der DSGVO die nationalen Datenschutzvorgaben in Ihrem bzw. unserem Wohn-
und
Sitzland gelten können. Sollten ferner im Einzelfall speziellere Rechtsgrundlagen maßgeblich sein, teilen wir
Ihnen
diese in der Datenschutzerklärung mit.</p>
<ul>
<li><strong>Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO)</strong> - Die Verarbeitung ist zur
Wahrung
der berechtigten Interessen des Verantwortlichen oder eines Dritten erforderlich, sofern nicht die
Interessen
oder Grundrechte und Grundfreiheiten der betroffenen Person, die den Schutz personenbezogener Daten
erfordern,
überwiegen.
</li>
</ul>
<p><strong>Nationale Datenschutzregelungen in Deutschland</strong>: Zusätzlich zu den Datenschutzregelungen der
Datenschutz-Grundverordnung gelten nationale Regelungen zum Datenschutz in Deutschland. Hierzu gehört
insbesondere
das Gesetz zum Schutz vor Missbrauch personenbezogener Daten bei der Datenverarbeitung (Bundesdatenschutzgesetz
BDSG). Das BDSG enthält insbesondere Spezialregelungen zum Recht auf Auskunft, zum Recht auf Löschung, zum
Widerspruchsrecht, zur Verarbeitung besonderer Kategorien personenbezogener Daten, zur Verarbeitung für andere
Zwecke und zur Übermittlung sowie automatisierten Entscheidungsfindung im Einzelfall einschließlich Profiling.
Des
Weiteren regelt es die Datenverarbeitung für Zwecke des Beschäftigungsverhältnisses (§ 26 BDSG), insbesondere im
Hinblick auf die Begründung, Durchführung oder Beendigung von Beschäftigungsverhältnissen sowie die Einwilligung
von
Beschäftigten. Ferner können Landesdatenschutzgesetze der einzelnen Bundesländer zur Anwendung gelangen.</p>
</div>
<div class="mb-3 border-bottom">
<h2 id="m4">Sicherheitsmaßnahmen</h2>
<p>Wir treffen nach Maßgabe der gesetzlichen Vorgaben unter Berücksichtigung des
Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der
Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeiten und des Ausmaßes der Bedrohung der Rechte
und
Freiheiten natürlicher Personen geeignete technische und organisatorische Maßnahmen, um ein dem Risiko
angemessenes
Schutzniveau zu gewährleisten.</p>
<p>Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten
durch
Kontrolle des physischen und elektronischen Zugangs zu den Daten als auch des sie betreffenden Zugriffs, der
Eingabe, der Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren
eingerichtet, die eine Wahrnehmung von Betroffenenrechten, die Löschung von Daten und Reaktionen auf die
Gefährdung
der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der
Entwicklung
bzw. Auswahl von Hardware, Software sowie Verfahren entsprechend dem Prinzip des Datenschutzes, durch
Technikgestaltung und durch datenschutzfreundliche Voreinstellungen.</p>
</div>
<div class="mb-3 border-bottom">
<h2 id="m5">Bereitstellung des Onlineangebotes und Webhosting</h2>
<p>Um unser Onlineangebot sicher und effizient
bereitstellen zu können, nehmen wir die Leistungen von einem oder mehreren Webhosting-Anbietern in Anspruch, von
deren Servern (bzw. von ihnen verwalteten Servern) das Onlineangebot abgerufen werden kann. Zu diesen Zwecken
können
wir Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste sowie
Sicherheitsleistungen und technische Wartungsleistungen in Anspruch nehmen.</p>
<p>Zu den im Rahmen der Bereitstellung des Hostingangebotes verarbeiteten Daten können alle die Nutzer unseres
Onlineangebotes betreffenden Angaben gehören, die im Rahmen der Nutzung und der Kommunikation anfallen. Hierzu
gehören regelmäßig die IP-Adresse, die notwendig ist, um die Inhalte von Onlineangeboten an Browser ausliefern
zu
können, und alle innerhalb unseres Onlineangebotes oder von Webseiten getätigten Eingaben.</p>
<p><strong>E-Mail-Versand und -Hosting</strong>: Die von uns in Anspruch genommenen Webhosting-Leistungen umfassen
ebenfalls den Versand, den Empfang sowie die Speicherung von E-Mails. Zu diesen Zwecken werden die Adressen der
Empfänger sowie Absender als auch weitere Informationen betreffend den E-Mailversand (z.B. die beteiligten
Provider)
sowie die Inhalte der jeweiligen E-Mails verarbeitet. Die vorgenannten Daten können ferner zu Zwecken der
Erkennung
von SPAM verarbeitet werden. Wir bitten darum, zu beachten, dass E-Mails im Internet grundsätzlich nicht
verschlüsselt versendet werden. Im Regelfall werden E-Mails zwar auf dem Transportweg verschlüsselt, aber
(sofern
kein sogenanntes Ende-zu-Ende-Verschlüsselungsverfahren eingesetzt wird) nicht auf den Servern, von denen sie
abgesendet und empfangen werden. Wir können daher für den Übertragungsweg der E-Mails zwischen dem Absender und
dem
Empfang auf unserem Server keine Verantwortung übernehmen.</p>
<p><strong>Erhebung von Zugriffsdaten und Logfiles</strong>: Wir selbst (bzw. unser Webhostinganbieter) erheben
Daten zu
jedem Zugriff auf den Server (sogenannte Serverlogfiles). Zu den Serverlogfiles können die Adresse und Name der
abgerufenen Webseiten und Dateien, Datum und Uhrzeit des Abrufs, übertragene Datenmengen, Meldung über
erfolgreichen
Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite) und im
Regelfall IP-Adressen und der anfragende Provider gehören.</p>
<p>Die Serverlogfiles können zum einen zu Zwecken der Sicherheit eingesetzt werden, z.B., um eine Überlastung der
Server
zu vermeiden (insbesondere im Fall von missbräuchlichen Angriffen, sogenannten DDoS-Attacken) und zum anderen,
um
die Auslastung der Server und ihre Stabilität sicherzustellen.</p>
<ul class="m-elements">
<li><strong>Verarbeitete Datenarten:</strong> Inhaltsdaten (z.B. Texteingaben, Fotografien, Videos),
Nutzungsdaten
(z.B. besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten), Meta-/Kommunikationsdaten (z.B.
Geräte-Informationen, IP-Adressen).
</li>
<li><strong>Betroffene Personen:</strong> Nutzer (z.B. Webseitenbesucher, Nutzer von Onlinediensten).</li>
<li><strong>Rechtsgrundlagen:</strong> Berechtigte Interessen (Art. 6 Abs. 1 S. 1 lit. f. DSGVO).</li>
</ul>
</div>
<div class="mb-3 border-bottom">
<h2 id="m6">Löschung von Daten</h2>
<p>Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen
Vorgaben gelöscht, sobald deren zur Verarbeitung erlaubten Einwilligungen widerrufen werden oder sonstige
Erlaubnisse entfallen (z.B., wenn der Zweck der Verarbeitung dieser Daten entfallen ist oder sie für den Zweck
nicht
erforderlich sind).</p>
<p>Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind,
wird
deren Verarbeitung auf diese Zwecke beschränkt. D.h., die Daten werden gesperrt und nicht für andere Zwecke
verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen
oder
deren Speicherung zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte
einer anderen natürlichen oder juristischen Person erforderlich ist.</p>
<p>Weitere Hinweise zu der Löschung von personenbezogenen Daten können ferner im Rahmen der einzelnen
Datenschutzhinweise dieser Datenschutzerklärung erfolgen.</p>
</div>
<div class="mb-3 border-bottom">
<h2 id="m7">Änderung und Aktualisierung der Datenschutzerklärung</h2>
<p>Wir bitten Sie, sich regelmäßig über den Inhalt
unserer Datenschutzerklärung zu informieren. Wir passen die Datenschutzerklärung an, sobald die Änderungen der
von
uns durchgeführten Datenverarbeitungen dies erforderlich machen. Wir informieren Sie, sobald durch die
Änderungen
eine Mitwirkungshandlung Ihrerseits (z.B. Einwilligung) oder eine sonstige individuelle Benachrichtigung
erforderlich wird.</p>
<p>Sofern wir in dieser Datenschutzerklärung Adressen und Kontaktinformationen von Unternehmen und Organisationen
angeben, bitten wir zu beachten, dass die Adressen sich über die Zeit ändern können und bitten die Angaben vor
Kontaktaufnahme zu prüfen.</p>
</div>
<div class="mb-3 border-bottom">
<h2 id="m8">Rechte der betroffenen Personen</h2>
<p>Ihnen stehen als Betroffene nach der DSGVO verschiedene Rechte zu,
die sich insbesondere aus Art. 15 bis 21 DSGVO ergeben:</p>
<ul>
<li><strong>Widerspruchsrecht: Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation
ergeben,
jederzeit gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten, die aufgrund von Art. 6 Abs.
1
lit. e oder f DSGVO erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmungen
gestütztes
Profiling. Werden die Sie betreffenden personenbezogenen Daten verarbeitet, um Direktwerbung zu betreiben,
haben
Sie das Recht, jederzeit Widerspruch gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten zum
Zwecke derartiger Werbung einzulegen; dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung
in
Verbindung steht.</strong></li>
<li><strong>Widerrufsrecht bei Einwilligungen:</strong> Sie haben das Recht, erteilte Einwilligungen jederzeit
zu
widerrufen.
</li>
<li><strong>Auskunftsrecht:</strong> Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende
Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopie der
Daten
entsprechend den gesetzlichen Vorgaben.
</li>
<li><strong>Recht auf Berichtigung:</strong> Sie haben entsprechend den gesetzlichen Vorgaben das Recht, die
Vervollständigung der Sie betreffenden Daten oder die Berichtigung der Sie betreffenden unrichtigen Daten zu
verlangen.
</li>
<li><strong>Recht auf Löschung und Einschränkung der Verarbeitung:</strong> Sie haben nach Maßgabe der
gesetzlichen
Vorgaben das Recht, zu verlangen, dass Sie betreffende Daten unverzüglich gelöscht werden, bzw. alternativ
nach
Maßgabe der gesetzlichen Vorgaben eine Einschränkung der Verarbeitung der Daten zu verlangen.
</li>
<li><strong>Recht auf Datenübertragbarkeit:</strong> Sie haben das Recht, Sie betreffende Daten, die Sie uns
bereitgestellt haben, nach Maßgabe der gesetzlichen Vorgaben in einem strukturierten, gängigen und
maschinenlesbaren Format zu erhalten oder deren Übermittlung an einen anderen Verantwortlichen zu fordern.
</li>
<li><strong>Beschwerde bei Aufsichtsbehörde:</strong> Sie haben ferner nach Maßgabe der gesetzlichen Vorgaben
das
Recht, bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat Ihres gewöhnlichen Aufenthaltsorts,
Ihres
Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes Beschwerde einzulegen, wenn Sie der Ansicht sind,
dass
die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen die DSGVO verstößt.
</li>
</ul>
</div>
<p><a href="https://datenschutz-generator.de/?l=de"
title="Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken." target="_blank"
rel="noopener noreferrer nofollow">Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke</a>
</p>

+ 14
- 0
sites/de/services.html View File

@ -0,0 +1,14 @@
---
layout: services.njk
key: services
title: Dienste
eleventyNavigation:
key: services
title: Dienste
icon: server
order: 2
---
<h1>Dienste</h1>
<p>In meiner Freizeit stelle ich verschiedene quelloffene Dienste für die freie Nutzung bereit. Hier findest du eine
Übersicht der einzelnen Services und jeweils eine kurze Beschreibung. Alle Services werden in Deutschland
gehostet. Fühl dich frei davon Gebrauch zu machen.</p>

+ 62
- 0
sites/de/services/connectivitycheck.md View File

@ -0,0 +1,62 @@
---
layout: base.njk
key: connectivitycheck
title: Captive Portal Check
---
# Captive Portal Check
Ein Captive Portal ist eine Anmeldeseite in öffentlichen WLAN-Netzwerken um den Internet-Zugriff an die Zustimmung bestimmter Nutzungsregeln zu binden. Wenn du in einem öffentlichen Netzwerk eine Anmeldeseite angezeigt bekommst, nutzt dein Gerät dafür einen Captive Portal Check. Dieser ermöglicht es dem Gerät herauszufinden, ob du einen direkten Internetzugang hast oder nicht. Unter Android wird hierfür beispielsweise eine Anfrage an einen Google-Server gestellt.
__Seit Mitte 2019 stelle ich einen freien Captive Portal Check zur Verfügung: [https://connectivitycheck.sp-codes.de/generate204](https://connectivitycheck.sp-codes.de/generate204)__ Gerne kannst du ihn nutzen, wenn du möchtest.
## Einrichtung in Android
Um den Captive Portal Check in Android zu ändern, benötigt man eine Terminal-App oder eine Verbindung über ADB zu einem Computer.
Nun können die folgenden Befehle mit der jeweiligen Methode ausgeführt werden, um `http` zu verwenden:
```
# settings put global captive_portal_use_https 0
# settings put global captive_portal_http_url "http://connectivitycheck.sp-codes.de/generate204"
```
Um `https` zu verwenden müssen die beiden folgenden Befehle genutzt werden:
```
# settings put global captive_portal_use_https 1
# settings put global captive_portal_https_url "https://connectivitycheck.sp-codes.de/generate204"
```
Eventuell musst du dein Gerät anschließend neu starten.
Wenn du AFWall+ verwendest musst du _[1000] Android-System_ und eventuell _[10040] CaptivePortalLogin_ Internetzugriff gewähren.
## Einrichtung in Ubuntu
Unter Ubuntu muss die Datei `/etc/NetworkManager/NetworkManager.conf` geändert werden. Füge die folgenden Zeilen hinzu, oder passe sie entsprechend an:
```
[connectivity]
uri=https://connectivitycheck.sp-codes.de/generate204
```
Starte den _network-manager_ neu:
```
sudo service network-manager restart
```
## Einrichtung in Firefox
Tippe [about:config](about:config) in die Adresszeile von Firefox und suche anschließend nach `captivedetect.canonicalURL` und `network.connectivity-service`. Setze die URL-Werte auf `https://connectivitycheck.sp-codes.de/generate204`, die Domain-Werte auf `connectivitycheck.sp-codes.de`. Das war es schon.
## Weitere nützliche Links
* [Captive Portal Wikipedia](https://de.wikipedia.org/wiki/Captive_Portal)
* [Quellcode](https://git.sp-codes.de/samuel-p/connectivity-check)
* [Docker Image](https://hub.docker.com/r/samuelph/connectivity-check)
* [Setup on Android](https://android.stackexchange.com/a/186995/288049)
* [Setup on Ubuntu](https://askubuntu.com/q/1167177/920103)
* [Captive Portal Kuketz Blog](https://www.kuketz-blog.de/android-captive-portal-check-204-http-antwort-von-captiveportal-kuketz-de/)

+ 19
- 0
sites/de/services/firefox-sync.md View File

@ -0,0 +1,19 @@
---
layout: base.njk
key: firefox-sync
title: Firefox Sync
---
# Firefox Sync
Nutzt du Firefox auf mehreren Geräten zum Surfen? Dann kannst du mit Firefox Sync deine Browserdaten (Lesezeichen, offene Tabs, die Suchhistorie, uvm.) zwischen all deinen Geräten synchronisieren.
Dafür benötigst du zunächst einen Firefox-Account und musst dich auf deinen Geräten damit anmelden. Standardmäßig nutzt du dann automatisch den Sync-Service von Mozilla. Möchtest du einen anderen Server nutzen kannst du das in den Einstellungen ändern.
__Seit Februar 2020 biete ich einen öffentlichen Service für Firefox-Sync an.__ Gerne kannst du ihn nutzen um deine Daten zwischen deinen Geräten zu synchronisieren.
Tippe dafür [about:config](about:config) in die Adresszeile von Firefox und suche anschließend nach `identity.sync.tokenserver.uri` und setze den Wert auf `https://sync.firefox.sp-codes.de/token/1.0/sync/1.5`. Du nutzt nun den eingetragenen Sync-Service.
## Weitere nützliche Links
* [Firefox Sync](https://www.mozilla.org/de/firefox/accounts/)
* [Quellcode](https://github.com/mozilla-services/syncserver)

+ 24
- 0
sites/de/services/gitea.md View File

@ -0,0 +1,24 @@
---
layout: base.njk
key: gitea
title: Gitea
---
# Gitea
Gitea ist eine einfache Code-Hosting-Plattform wie GitHub oder GitLab. Sie ist opensource und wird kontinuierlich weiterentwickelt. __Seit Ende 2019 betreibe ich eine eigene Gitea Instanz, in der ich meine Projekte verwalte.__ So zum Beispiel auch diese Webseite. Schau dir gerne mal den Quelltext an und lass mir Feedback da.
Zusätzlich zu Gitea betreibe ich noch Drone, eine Plattform, die Gitea um viele Continuous Integration Funktionen erweitert und beispielsweise automatisierte Builds und Deploys ermöglicht.
Schau gerne mal vorbei und melde dich an, falls du Lust hast ein Projekt zu entwickeln. Die Registrierung ist seit März 2020 geöffnet.
__Zu Gitea geht's hier lang: [git.sp-codes.de](https://git.sp-codes.de)__
__Wenn du bei Drone vorbeischauen willst geht das hier: [ci.sp-codes.de](https://ci.sp-codes.de)__
## Weitere nützliche Links
* [Gitea Webseite](https://gitea.io/en-us/)
* [Quellcode von Gitea](https://github.com/go-gitea/gitea)
* [Drone Webseite](https://drone.io/)
* [Quellcode von Drone](https://github.com/drone/drone)

+ 18
- 0
sites/de/services/invidious.md View File

@ -0,0 +1,18 @@
---
layout: base.njk
key: invidious
title: Invidious
---
# Invidious
Invidious ist ein alternatives Frontend für YouTube.
Da nur die nötigsten Verbindungen zu YouTube aufgebaut werden und viele sogar vom Server selber übernommen werden erhöht Invidious die Privatsphäre der Nutzer.
__Seit Dezember 2019 betreibe ich eine öffentliche Invidious Instanz.__ Fühl dich frei dort ein paar Videos anzuschauen.
__Jetzt das erste Video schauen auf [invidious.sp-codes.de](https://invidious.sp-codes.de).__
## Weitere nützliche Links
* [Liste weiterer öffentlicher Server](https://github.com/omarroth/invidious/wiki/Invidious-Instances)
* [Quellcode von Invidious](https://github.com/omarroth/invidious)

+ 21
- 0
sites/de/services/matrix.md View File

@ -0,0 +1,21 @@
---
layout: base.njk
key: matrix
title: Matrix
---
# Matrix
[Matrix](https://matrix.org) ist eine moderne, quelloffene Software für dezentrale Kommunikation (wie E-Mail). Matrix bietet von Haus aus Sprach- und Videoanrufe, inklusive Ende-zu-Ende Verschlüsselung und vieles mehr. Das Entscheidende ist, dass es nicht den einen Matrix-Server gibt, den alle Nutzer verwenden müssen, wie das beispielsweise bei WhatsApp, Telegram und vielen anderen verbreiteten Messengern der Fall ist.
Da Matrix dezentral funktioniert können sich die Nutzer einen öffentlichen Server aussuchen oder ihren eigenen erstellen und trotzdem mit allen Matrix-Nutzern kommunizieren, nicht nur mit denen des eigenen Servers. Die verschickten Nachrichten werden so nur auf den beteiligten Servern gespeichert. Auch die Anrufe laufen nur über die beteiligten Server.
__Seit Anfang 2020 betreibe ich einen öffentlichen Matrix-Server: [matrix.sp-codes.de](https://matrix.sp-codes.de/) Und eine öffentliche Riot-Web Instanz: [chat.sp-codes.de](https://chat.sp-codes.de/)__
Melde dich gerne auf meinem Server an oder suche dir einen aus der unten verlinkten Liste heraus. Ich freue mich auf deine Nachricht an [@samuel-p:matrix.sp-codes.de](https://matrix.to/#/@samuel-p:matrix.sp-codes.de).
## Weitere nützliche Links
* [Verschiedene Apps](https://matrix.org/clients)
* [Liste öffentlicher Räume](https://view.matrix.org/)
* [Liste öffentlicher Matrix-Server](https://www.hello-matrix.net/public_servers.php)
* [Matrix FAQ](https://matrix.org/faq/)

+ 25
- 0
sites/de/services/searx.md View File

@ -0,0 +1,25 @@
---
layout: base.njk
key: searx
title: Searx
---
# Searx
Searx ist eine freie Metasuchmaschine, das heißt sie nutzt für die Suche öffentliche Suchmaschinen, wie Google, DuckDuckGo, StartPage und viele andere.
Um die Privatsphäre der Benutzer zu schützen, gibt Searx weder die IP-Adresse, noch die Suchhistorie an die Suchmaschinen weiter, von denen die Ergebnisse abgefragt werden. Searx selber speichert ebenfalls keine Suchanfragen oder andere Logs. Zusätzlch stellt Searx eine Vielzahl an Einstellungsmöglichkeiten bereit, beispielsweise können die Sprache und die verwendeten Suchmaschinen für jede Suchanfrage konfiguriert werden.
Außerdem stellt Searx einen Proxy bereit über den viele Suchergebnisse auch anonym aufgerufen werden können. Klicke dafür nicht auf den Direktlink, sonden auf `proxied` in der unteren rechten Ecke des Suchergebnisses.
__Seit November 2019 betreibe ich eine öffentliche Searx Instanz.__ Schau gerne mal vorbei um Antworten auf deine Fragen zu erhalten. Bei Fragen oder Problemen schreib mir gerne.
__Hier gehts zu Searx: [searx.sp-codes.de](https://searx.sp-codes.de)__
## Weitere nützliche Links
* [Searx Webseite](https://asciimoo.github.io/searx/)
* [Benutzer-Dokumentation](https://asciimoo.github.io/searx/user/index.html)
* [Standardsuchmaschine in Firefox festlegen](https://support.mozilla.org/de/kb/suchmaschinen-in-firefox-hinzufuegen-oder-entfernen)
* [Standardsuchmaschine in Chrome festlegen](https://support.google.com/chrome/answer/95426?co=GENIE.Platform%3DDesktop&hl=de)
* [Liste weiterer öffentlicher Server](https://searx.space/)
* [Quellcode von Searx](https://github.com/asciimoo/searx)

+ 8
- 0
sites/en/404.md View File

@ -0,0 +1,8 @@
---
layout: base.njk
key: 404
title: Not Found
---
# Not Found
This page does not exist (yet). Come back later or take a look at the beginning: [Home](/{{locale}}/)

+ 3
- 0
sites/en/en.json View File

@ -0,0 +1,3 @@
{
"locale": "en"
}

+ 8
- 0
sites/en/imprint.html View File

@ -0,0 +1,8 @@
---
layout: base.njk
title: sp-codes
---
<div class="legal">
<h1>Imprint</h1>
<p>Sorry, this document is only available in German so far. Read it <a href="/de/imprint">here</a>.</p>
</div>

+ 38
- 0
sites/en/index.html View File

@ -0,0 +1,38 @@
---
layout: home.njk
key: home
title: Home
eleventyNavigation:
key: home
title: Home
icon: home
---
<div class="row justify-content-center py-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading">Welcome to sp&#8209;codes!</h1>
<p class="lead text-center mb-2">
Glad you found your way here. My name is Samuel Philipp and I am a software engineer from Magdeburg.
On this site you will find information about me and an overview of the services I provide. Feel free
to look around or use the various services.
</p>
</div>
</div>
<div class="row justify-content-center py-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading"><a href="/{{locale}}/services">Services</a></h1>
<div class="row">
{% include services-simple.html %}
</div>
</div>
</div>
<div class="row justify-content-center pt-4 border-top">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="heading">Profiles & Contact</h1>
<p class="lead text-center mb-2">
You have found a mistake, suggestions, or any other question? Feel free to contact me via one of the
following platforms. I look forward to your message!
</p>
</div>
</div>
{% include profiles.html %}

+ 8
- 0
sites/en/privacy.html View File

@ -0,0 +1,8 @@
---
layout: base.njk
title: sp-codes
---
<body class="legal">
<h2>Privacy</h2>
<p>Sorry, this document is only available in German so far. Read it <a href="/de/privacy">here</a>.</p>
</body>

+ 13
- 0
sites/en/services.html View File

@ -0,0 +1,13 @@
---
layout: services.njk
key: services
title: Services
eleventyNavigation:
key: services
title: Services
icon: server
order: 2
---
<h1>Services</h1>
<p>In my spare time I provide various open source services for free. Here you can find an overview of the individual
services and a short description for each of them. All services are hosted in Germany. Feel free to use it.</p>

+ 60
- 0
sites/en/services/connectivitycheck.md View File

@ -0,0 +1,60 @@
---
layout: base.njk
key: connectivitycheck
title: Captive Portal Check
---
# Captive Portal Check
A captive portal is a login page in public WLAN networks to restrict Internet access to the approval of certain terms of use. When you see a login page on a public network, your device uses a captive portal check. This allows the device to find out whether you have direct Internet access or not. In Android, for example, your device sends a request to a Google server.
Since mid 2019 I provide a free Captive Portal Check: [https://connectivitycheck.sp-codes.de/generate204](https://connectivitycheck.sp-codes.de/generate204) You are welcome to use it.
## Setup in Android
To change the Captive Portal Check in Android, you need a terminal app or a connection via ADB to a computer.
To use `http` you can run the following commands with the respective method:
```
# settings put global captive_portal_use_https 0
# settings put global captive_portal_http_url "http://connectivitycheck.sp-codes.de/generate204"
```
To use `https` you can use the following two commands:
```
# settings put global captive_portal_use_https 1
# settings put global captive_portal_https_url "https://connectivitycheck.sp-codes.de/generate204"
```
Maybe you have to reboot your phone after updating the settings.
If you are using AFWall+ you need to give access to _[1000] Android-System_ and in some cases _[10040] CaptivePortalLogin_ to make it work.
## Setup in Ubuntu
In Ubuntu, the file `/etc/NetworkManager/NetworkManager.conf` must be changed. Add or change the following lines:
```
[connectivity]
uri=https://connectivitycheck.sp-codes.de/generate204
```
Restart the network-manager:
```
sudo service network-manager restart
```
## Setup in Firefox
Type [about:config](about:config) in the Firefox address bar and search for `captivedetect.canonicalURL` and `network.connectivity-service`. Set the URL values to `https://connectivitycheck.sp-codes.de/generate204`, the domain values to `connectivitycheck.sp-codes.de`. That's it.
## More useful links
* [Captive Portal Wikipedia](https://en.wikipedia.org/wiki/Captive_portal)
* [Source code](https://git.sp-codes.de/samuel-p/connectivity-check)
* [Docker Image](https://hub.docker.com/r/samuelph/connectivity-check)
* [Setup on Android](https://android.stackexchange.com/a/186995/288049)
* [Setup on Ubuntu](https://askubuntu.com/q/1167177/920103)
* [Captive Portal Kuketz Blog](https://www.kuketz-blog.de/android-captive-portal-check-204-http-antwort-von-captiveportal-kuketz-de/)

+ 19
- 0
sites/en/services/firefox-sync.md View File

@ -0,0 +1,19 @@
---
layout: base.njk
key: firefox-sync
title: Firefox Sync
---
# Firefox Sync
Do you use Firefox on more than one device for surfing? Then Firefox Sync lets you synchronize your browser data (bookmarks, open tabs, search history, and more) between all your devices.
To do this, you first need a Firefox account and must log in to your devices. By default, you will then automatically use the Mozilla sync service. If you want to use a different server you can change this in the settings.
__Since February 2020 I offer a public service for Firefox-Sync.__ You can use it to synchronize your data between your devices.
Therefore type [about:config](about:config) in the Firefox address bar, search for `identity.sync.tokenserver.uri` and set the value to `https://sync.firefox.sp-codes.de/token/1.0/sync/1.5`. You are now using the entered sync service.
## More useful links
* [Firefox Sync](https://www.mozilla.org/de/firefox/accounts/)
* [Source code](https://github.com/mozilla-services/syncserver)

+ 23
- 0
sites/en/services/gitea.md View File

@ -0,0 +1,23 @@
---
layout: base.njk
key: gitea
title: Gitea
---
# Gitea
Gitea is a simple code hosting platform like GitHub or GitLab. It is open source and under continuous development. __Since the end of 2019 I have my own Gitea instance, to manage my projects.__ For example this website. Feel free to have a look at the source code and leave some feedback.
In addition to Gitea, I also run Drone, a platform that extends Gitea with many continuous integration features, such as automated builds and deploys.
Feel free to visit and sign up if you're interested in developing a project. The registration is open since March 2020.
__To get to Gitea click here: [git.sp-codes.de](https://git.sp-codes.de)__
__If you want to check out Drone, click here: [ci.sp-codes.de](https://ci.sp-codes.de)__
## More useful links
* [Gitea website](https://gitea.io/en-us/)
* [Source code of Gitea](https://github.com/go-gitea/gitea)
* [Drone Website](https://drone.io/)
* [Source code of Drone](https://github.com/drone/drone)

+ 17
- 0
sites/en/services/invidious.md View File

@ -0,0 +1,17 @@
---
layout: base.njk
key: invidious
title: Invidious
---
# Invidious
Invidious is an alternative YouTube-Frontend. It establishes only the most necessary connections to YouTube and many of them are even made by the server itself. So Invidious increases the privacy of the users.
__Since December 2019 I run a public Invidious instance.__ Feel free to watch some videos there.
__Watch your first video on [invidious.sp-codes.de](https://invidious.sp-codes.de).__
## More useful links
* [List of other public servers](https://github.com/omarroth/invidious/wiki/Invidious-Instances)
* [Source code of Invidious](https://github.com/omarroth/invidious)

+ 21
- 0
sites/en/services/matrix.md View File

@ -0,0 +1,21 @@
---
layout: base.njk
key: matrix
title: Matrix
---
# Matrix
Matrix is a modern, open source software for decentralized communication (like e-mail). Matrix offers end-to-end encryption, voice and video calls and much more. However, the most important thing is that there is not one Matrix server that all users have to use, like WhatsApp, Telegram and many other popular messengers.
Users can choose a public server or create their own and still communicate with all Matrix users, not just those on their own server. The messages are only stored on the participating servers. Calls also go only through the participating servers.
__Since the beginning of 2020 I run a public Matrix server: [matrix.sp-codes.de](https://matrix.sp-codes.de/) And a public Riot-Web instance: [chat.sp-codes.de](https://chat.sp-codes.de/)__
Feel free to create an account on my server or choose one from the list linked below. I look forward to hear from you [@samuel-p:matrix.sp-codes.de](https://matrix.to/#/@samuel-p:matrix.sp-codes.de).
## More useful links
* [Various Apps](https://matrix.org/clients)
* [List of public rooms](https://view.matrix.org/)
* [List of public matrix servers](https://www.hello-matrix.net/public_servers.php)
* [Matrix FAQ](https://matrix.org/faq/)

+ 26
- 0
sites/en/services/searx.md View File

@ -0,0 +1,26 @@
---
layout: base.njk
key: searx
title: Searx
---
# Searx
Searx is a free meta search engine, which uses other public search engines like Google, DuckDuckGo, StartPage and many others.
In order to protect the privacy of the users, Searx does not give the IP address, or the search history to the search engines it retrieves the results from. Searx itself also does not store any search queries or other logs. Additional it offers a variety of settings, for example, the language and the search engines can be configured for each search query.
Searx also provides a proxy through which many search results can be accessed anonymously. Instead of clicking on the direct link, use the `proxied` button in the bottom right corner of the search result.
__Since November 2019 I run a public Searx instance.__ Feel free to check it out and get answers to your questions. If you have any questions or problems, feel free to contact me.
Here is the link to Searx: [searx.sp-codes.de](https://searx.sp-codes.de)
## More useful links
* [Searx Website](https://asciimoo.github.io/searx/)
* [User-Documentation](https://asciimoo.github.io/searx/user/index.html)
* [Set default search engine in Firefox](https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox)
* [Set default search engine in Chrome](https://support.google.com/chrome/answer/95426?co=GENIE.Platform%3DDesktop&hl=en)
* [List of other public servers](https://searx.space/)
* [Source code of Searx](https://github.com/asciimoo/searx)

BIN
src/font/minotaur.ttf View File


+ 0
- 51
src/imprint.html View File

@ -1,51 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>sp-codes - Impressum</title>
<link rel="shortcut icon" href="img/samuel.png">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="stylesheet" href="css/main.min.css">
</head>
<body class="legal">
<h1>Impressum</h1>
<h2 id="m46">Diensteanbieter</h2>
<p>Samuel Philipp</p>
<p>Otto-von-Guericke-Straße 40a<br/>
39104 Magdeburg<br/>
Deutschland</p>
<h2 id="m56">Kontaktmöglichkeiten</h2>
<p><strong>E-Mail-Adresse</strong>: <a href="mailto:info@sp-codes.de" target="_blank">info@sp-codes.de</a></p>
<!--<p><strong>Kontaktformular</strong>: <a href="https://sp-codes.de/contact" target="_blank">https://sp-codes.de/contact</a></p>-->
<h2 id="m172">Onlinepräsenzen</h2>
<p><strong>Dieses Impressum gilt auch für die folgenden Onlinepräsenzen</strong>:</p>
<p><a href="https://samuel-philipp.de" target="_blank">https://samuel-philipp.de</a><br/>
<a href="https://sp-codes.de" target="_blank">https://sp-codes.de</a><br/>
<a href="https://sp-magic.de" target="_blank">https://sp-magic.de</a></p>
<ul class="m-elements"></ul>
<h2 id="m65">Haftungs- und Urheberrechtshinweise</h2>
<p><strong>Haftungsausschluss</strong>: Die Inhalte dieses Onlineangebotes wurden sorgfältig und nach unserem aktuellen
Kenntnisstand erstellt, dienen jedoch nur der Information und entfalten keine rechtlich bindende Wirkung, sofern es
sich nicht um gesetzlich verpflichtende Informationen (z.B. das Impressum, die Datenschutzerklärung, AGB oder
Widerrufsbelehrungen für Verbraucher) handelt. Wir behalten uns vor, die Inhalte vollständig oder teilweise zu
ändern oder zu löschen, soweit vertragliche Verpflichtungen unberührt bleiben. Alle Angebote sind freibleibend und
unverbindlich. </p>
<p><strong>Links auf fremde Webseiten</strong>: Inhalte fremder Webseiten, auf die wir direkt oder indirekt verweisen,
liegen außerhalb unseres Verantwortungsbereiches und machen wir uns nicht zu Eigen. Für alle Inhalte und
insbesondere für Schäden, die aus der Nutzung der in den verlinkten Webseiten aufrufbaren Informationen entstehen,
haftet allein der Anbieter der verlinkten Webseiten.</p>
<p><strong>Urheberrechte und Markenrechte</strong>: Alle auf dieser Website dargestellten Inhalte, wie Texte,
Fotografien, Grafiken, Marken und Warenzeichen sind durch die jeweiligen Schutzrechte (Urheberrechte, Markenrechte)
geschützt. Die Verwendung, Vervielfältigung usw. unterliegen unseren Rechten oder den Rechten der jeweiligen Urheber
bzw. Rechteverwalter.</p>
<p><strong>Hinweise auf Rechtsverstöße</strong>: Sollten Sie innerhalb unseres Internetauftritts Rechtsverstöße
bemerken, bitten wir Sie uns auf diese hinzuweisen. Wir werden rechtswidrige Inhalte und Links nach Kenntnisnahme
unverzüglich entfernen.</p>
<ul class="m-elements"></ul>
<p class="seal"><a href="https://datenschutz-generator.de/?l=de"
title="Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken." target="_blank">Erstellt
mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke</a></p>
</body>
</html>

+ 0
- 95
src/index.html View File

@ -1,95 +0,0 @@
<!doctype html>
<html lang="en" prefix="og: http://ogp.me/ns#">
<head>
<title>sp-codes</title>
<base href="/">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="fragment" content="!">
<meta name="target" content="all">
<meta name="audience" content="all">
<meta name="coverage" content="Worldwide">
<meta name="distribution" content="Global">
<meta name="rating" content="general">
<meta name="url" content="https://sp-codes.de/">
<meta name="subject" content="sp-codes">
<meta name="description" content="Samuel Philipp - Software Engineer from Magdeburg">
<meta name="author" content="Samuel Philipp">
<meta property="og:type" content="website">
<meta property="og:locale" content="de">
<meta property="og:url" content="https://sp-codes.de/">
<meta property="og:title" content="sp-codes">
<meta property="og:description" content="Samuel Philipp - Software Engineer & Software Engineer">
<meta property="og:site_name" content="sp-codes">