Compare commits

..

37 commits

Author SHA1 Message Date
e147e06ff2 Merge pull request 'complete rewrite' (#8) from develop into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #8
2020-06-30 15:59:33 +00:00
7ea174ae07 updated .drone.yml
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2020-06-30 17:49:01 +02:00
9fd8c12bc0 updated .drone.yml
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2020-06-30 17:38:08 +02:00
7dc185ab0a removed stackexchange flair
Some checks reported errors
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build was killed
2020-06-30 17:20:40 +02:00
e4ffd6fbd7 minor improvements
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-29 23:35:48 +02:00
2e2801f4c5 minor improvements 2020-06-29 23:34:14 +02:00
b9cf536cb2 minor spell improvements
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-29 23:11:58 +02:00
76b0039b7c updated imprint and privacy
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-29 22:10:02 +02:00
8e5cff6cea added english gitea and firefox-sync description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-28 21:49:29 +02:00
0db3abd6da added and updated matrix description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-28 21:41:51 +02:00
9455f61002 added english invidious and connectivitycheck description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-28 21:30:36 +02:00
b50f539e33 added searx english description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-28 20:58:41 +02:00
d554656e6c updated matrix description
All checks were successful
continuous-integration/drone/push Build is passing
updated layout
2020-06-28 20:12:16 +02:00
f011e92cbb added connectivitycheck
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-28 19:06:04 +02:00
222c2d8ff3 added firefox sync description
All checks were successful
continuous-integration/drone/push Build is passing
improved styles
2020-06-27 17:52:44 +02:00
8a5b4caca0 updated services.html
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-26 20:04:09 +02:00
811b795aad added german invidious description
All checks were successful
continuous-integration/drone/push Build is passing
added some more links
2020-06-26 20:00:41 +02:00
0726f4a7f5 added german gitea description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-26 18:28:38 +02:00
12dca8af80 added german searx description
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-26 17:50:16 +02:00
f642d66542 fixed #6
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-26 16:51:28 +02:00
e6bc4227a3 removed unused parts
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-26 00:30:09 +02:00
61a65c3eb2 major refactoring
All checks were successful
continuous-integration/drone/push Build is passing
updated home
added english service placeholder
2020-06-26 00:26:36 +02:00
de76c38ad9 minor improvements
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-21 22:51:33 +02:00
5beccbef38 updated .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-18 23:11:54 +02:00
cf8b6db63d updated .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-18 22:47:14 +02:00
f9e0041706 updated .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2020-06-18 22:23:41 +02:00
5a225dba03 updated matrix description
Some checks failed
continuous-integration/drone/push Build is failing
minor bug fixes
2020-06-18 21:45:04 +02:00
ad776f2bb3 added dev deploy
Some checks failed
continuous-integration/drone/push Build is failing
added Matrix description
2020-06-15 23:46:05 +02:00
82ff07ffe9 removed more old stuff
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-04 22:09:35 +02:00
64dad73863 removed old stuff
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-04 22:00:03 +02:00
7bfa658505 minor improvements
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-04 21:58:38 +02:00
8b33fc120e added some english translations
All checks were successful
continuous-integration/drone/push Build is passing
updated imprint
2020-06-04 21:43:03 +02:00
c1666db02f fixed css
All checks were successful
continuous-integration/drone/push Build is passing
2020-06-04 18:49:38 +02:00
d41508a437 updated services
Some checks failed
continuous-integration/drone/push Build is failing
added 404 page
2020-06-04 18:23:03 +02:00
5d8a81ff79 added services template
Some checks failed
continuous-integration/drone/push Build is failing
updated .drone.yml
2020-06-04 00:04:51 +02:00
fcfed7842e added services template
updated .drone.yml
2020-06-04 00:04:32 +02:00
1d70658e41 added eleventy 2020-06-01 21:44:08 +02:00
49 changed files with 3932 additions and 4722 deletions

View file

@ -1,5 +1,6 @@
kind: pipeline kind: pipeline
name: default type: docker
name: build-develop
steps: steps:
- name: build - name: build
@ -7,7 +8,6 @@ steps:
commands: commands:
- npm install - npm install
- npm run build - npm run build
- name: deploy - name: deploy
image: alpine image: alpine
environment: environment:
@ -19,4 +19,42 @@ steps:
from_secret: FTP_PASSWORD from_secret: FTP_PASSWORD
commands: commands:
- which lftp || ( apk --update add lftp ) - 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/ 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:
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/ sp-codes.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST
when:
event:
- push
trigger:
branch:
- master

23
.eleventy.js Normal file
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"
}
};
};

View file

@ -1,5 +1,7 @@
# sp-codes.de # 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 Website for sp-codes.de
[GitHub](https://github.com/samuel-p/sp-codes.de) [GitHub](https://github.com/samuel-p/sp-codes.de)

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
);

View file

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

BIN
img/matrix.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View file

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View file

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 179 KiB

6709
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -3,34 +3,32 @@
"version": "1.0.0", "version": "1.0.0",
"description": "website for sp-codes.de", "description": "website for sp-codes.de",
"scripts": { "scripts": {
"start": "gulp watch", "compile-sass": "node-sass --output-style compressed --importer=node_modules/node-sass-tilde-importer scss/main.scss dist/css/main.css",
"build": "gulp" "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", "author": "samuel-p",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.sp-codes.de/samuel-p/sp-codes.de" "url": "https://git.sp-codes.de/samuel-p/sp-codes.de"
}, },
"optionalDependencies": {
"browser-sync": "2.26.7"
},
"devDependencies": { "devDependencies": {
"gulp": "4.0.2", "@11ty/eleventy": "^0.11.0",
"del": "3.0.0", "@11ty/eleventy-navigation": "^0.1.5",
"lazypipe": "1.0.1", "cpx": "^1.5.0",
"gulp-flatmap": "1.0.2", "node-sass": "^4.14.1",
"gulp-header": "2.0.5", "node-sass-tilde-importer": "^1.0.2",
"gulp-rename": "1.4.0", "npm-run-all": "^4.1.5"
"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"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^5.11.2", "@fortawesome/fontawesome-free": "^5.13.1",
"bootstrap": "^4.3.1", "bootstrap": "^4.5.0",
"jquery": "^3.4.1" "flag-icon-css": "^3.5.0"
} }
} }

190
scss/main.scss Normal file
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
sites/_data/services.json Normal file
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
sites/_data/site.js Normal file
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
sites/_data/strings.json Normal file
View file

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

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>

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 }}

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>

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>

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 %}

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
sites/de/404.md Normal file
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
sites/de/de.json Normal file
View file

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

42
sites/de/imprint.html Normal file
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
sites/de/index.html Normal file
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
sites/de/privacy.html Normal file
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
sites/de/services.html Normal file
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>

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/)

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)

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)

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)

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/)

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
sites/en/404.md Normal file
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
sites/en/en.json Normal file
View file

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

8
sites/en/imprint.html Normal file
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
sites/en/index.html Normal file
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
sites/en/privacy.html Normal file
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
sites/en/services.html Normal file
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>

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/)

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)

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)

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)

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/)

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)

Binary file not shown.

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>

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">
<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.min.css">
</head>
<body class="d-flex flex-column">
<div class="container flex-column flex-grow p-3">
<div class="row py-5">
<div class="col">
<img class="logo" src="img/samuel.png">
</div>
</div>
<div class="row justify-content-center py-4 border-top-bottom">
<div class="col-lg-8 col-md-10 col-12">
<h1 class="sp-codes">SP-CODES</h1>
<p class="lead text-center mb-2">
Herzlich willkommen bei sp-codes!
Mein Name ist Samuel Philipp und ich bin ein Software Engineer aus Magdeburg.
Auf dieser Seite finden Sie meine Profile auf GitHub, GitLab und Stackoverflow.
Außerdem finden die verschiedene Möglichkeiten um mit mir in Kontakt zu treten.
Ich freue mich auf Ihre Nachricht.
</p>
</div>
</div>
<div class="d-flex justify-content-center flex-wrap my-3">
<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="mailto:mail@sp-codes.de"><span
class="fas fa-fw fa-4x fa-envelope"></span></a></div>
</div>
<div class="d-flex justify-content-center mb-3">
<div class="text-center">
<a href="https://stackexchange.com/users/13389989/samuel-philipp"><img
src="https://stackexchange.com/users/flair/13389989.png" width="208" height="58"
alt="profile for Samuel Philipp on Stack Exchange, a network of free, community-driven Q&amp;A sites"
title="profile for Samuel Philipp on Stack Exchange, a network of free, community-driven Q&amp;A sites"/></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>
</div>
<div class="d-flex justify-content-end flex-wrap p-2 menu">
<div class="mr-3"><span class="far fa-copyright mr-2"></span>Samuel Philipp</div>
<div class="flex-grow-1"></div>
<div><a href="imprint.html"><span
class="fas fa-info-circle mr-2"></span>Impressum</a></div>
<div class="ml-3"><a href="privacy.html"><span
class="fas fa-user-secret mr-2"></span>Datenschutz</a></div>
<div class="ml-3"><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>
</body>
</html>

View file

@ -1,184 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>sp-codes - Datenschutzerklärung</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">
<h2>Datenschutzerklärung</h2>
<h3 id="dsg-general-intro"></h3>
<p>Diese Datenschutzerklärung klärt Sie über die Art, den Umfang und Zweck der Verarbeitung von personenbezogenen Daten
(nachfolgend kurz „Daten“) im Rahmen der Erbringung unserer Leistungen sowie innerhalb unseres Onlineangebotes und
der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen, wie z.B. unser Social
Media Profile auf (nachfolgend gemeinsam bezeichnet als „Onlineangebot“). Im Hinblick auf die verwendeten
Begrifflichkeiten, wie z.B. „Verarbeitung“ oder „Verantwortlicher“ verweisen wir auf die Definitionen im Art. 4 der
Datenschutzgrundverordnung (DSGVO). <br>
<br>
</p>
<h3 id="dsg-general-controller">Verantwortlicher</h3>
<p><span class="tsmcontroller">Samuel Philipp<br>
Otto-von-Guericke-Straße 40a<br>
39104 Magdeburg, Deutschland<br>
E-Mail: info@sp-codes.de<br>
<h3 id="dsg-general-datatype">Arten der verarbeiteten Daten</h3>
<p>- Bestandsdaten (z.B., Personen-Stammdaten, Namen oder Adressen).<br>
- Kontaktdaten (z.B., E-Mail, Telefonnummern).<br>
- Inhaltsdaten (z.B., Texteingaben, Fotografien, Videos).<br>
- Nutzungsdaten (z.B., besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).<br>
- Meta-/Kommunikationsdaten (z.B., Geräte-Informationen, IP-Adressen).</p>
<h3 id="dsg-general-datasubjects">Kategorien betroffener Personen</h3>
<p>Besucher und Nutzer des Onlineangebotes (Nachfolgend bezeichnen wir die betroffenen Personen zusammenfassend auch als
„Nutzer“).<br>
</p>
<h3 id="dsg-general-purpose">Zweck der Verarbeitung</h3>
<p>- Zurverfügungstellung des Onlineangebotes, seiner Funktionen und Inhalte.<br>
- Beantwortung von Kontaktanfragen und Kommunikation mit Nutzern.<br>
- Sicherheitsmaßnahmen.<br>
- Reichweitenmessung<br>
<span class="tsmcom"></span></p>
<h3 id="dsg-general-terms">Verwendete Begrifflichkeiten </h3>
<p>„Personenbezogene Daten“ sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche
Person (im Folgenden „betroffene Person“) beziehen; als identifizierbar wird eine natürliche Person angesehen, die
direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu
Standortdaten, zu einer Online-Kennung (z.B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert
werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen
oder sozialen Identität dieser natürlichen Person sind.<br>
<br>
„Verarbeitung“ ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche
Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden
Umgang mit Daten.<br>
<br>
„Pseudonymisierung“ die Verarbeitung personenbezogener Daten in einer Weise, dass die personenbezogenen Daten ohne
Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können,
sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen
unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren
natürlichen Person zugewiesen werden.<br>
<br>
„Profiling“ jede Art der automatisierten Verarbeitung personenbezogener Daten, die darin besteht, dass diese
personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person
beziehen, zu bewerten, insbesondere um Aspekte bezüglich Arbeitsleistung, wirtschaftliche Lage, Gesundheit,
persönliche Vorlieben, Interessen, Zuverlässigkeit, Verhalten, Aufenthaltsort oder Ortswechsel dieser natürlichen
Person zu analysieren oder vorherzusagen.<br>
<br>
Als „Verantwortlicher“ wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die
allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten
entscheidet, bezeichnet.<br>
<br>
„Auftragsverarbeiter“ eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die
personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.<br>
</p>
<h3 id="dsg-general-legalbasis">Maßgebliche Rechtsgrundlagen</h3>
<p>Nach Maßgabe des Art. 13 DSGVO teilen wir Ihnen die Rechtsgrundlagen unserer Datenverarbeitungen mit. Für Nutzer aus
dem Geltungsbereich der Datenschutzgrundverordnung (DSGVO), d.h. der EU und des EWG gilt, sofern die Rechtsgrundlage
in der Datenschutzerklärung nicht genannt wird, Folgendes: <br>
Die Rechtsgrundlage für die Einholung von Einwilligungen ist Art. 6 Abs. 1 lit. a und Art. 7 DSGVO;<br>
Die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer Leistungen und Durchführung vertraglicher Maßnahmen
sowie Beantwortung von Anfragen ist Art. 6 Abs. 1 lit. b DSGVO;<br>
Die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer rechtlichen Verpflichtungen ist Art. 6 Abs. 1 lit. c
DSGVO;<br>
Für den Fall, dass lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person eine
Verarbeitung personenbezogener Daten erforderlich machen, dient Art. 6 Abs. 1 lit. d DSGVO als Rechtsgrundlage.<br>
Die Rechtsgrundlage für die erforderliche Verarbeitung zur Wahrnehmung einer Aufgabe, die im öffentlichen Interesse
liegt oder in Ausübung öffentlicher Gewalt erfolgt, die dem Verantwortlichen übertragen wurde ist Art. 6 Abs. 1 lit.
e DSGVO. <br>
Die Rechtsgrundlage für die Verarbeitung zur Wahrung unserer berechtigten Interessen ist Art. 6 Abs. 1 lit. f DSGVO.
<br>
Die Verarbeitung von Daten zu anderen Zwecken als denen, zu denen sie ehoben wurden, bestimmt sich nach den Vorgaben
des Art 6 Abs. 4 DSGVO. <br>
Die Verarbeitung von besonderen Kategorien von Daten (entsprechend Art. 9 Abs. 1 DSGVO) bestimmt sich nach den
Vorgaben des Art. 9 Abs. 2 DSGVO. <br>
</p>
<h3 id="dsg-general-securitymeasures">Sicherheitsmaßnahmen</h3>
<p>Wir treffen nach Maßgabe der gesetzlichen Vorgabenunter Berücksichtigung des Stands der Technik, der
Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der
unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher
Personen, geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu
gewährleisten.<br>
<br>
Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten
durch Kontrolle des physischen Zugangs zu den Daten, als auch des sie betreffenden Zugriffs, der Eingabe,
Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren eingerichtet, die
eine Wahrnehmung von Betroffenenrechten, Löschung von Daten und Reaktion auf 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.<br>
</p>
<h3 id="dsg-general-coprocessing">Zusammenarbeit mit Auftragsverarbeitern, gemeinsam Verantwortlichen und Dritten</h3>
<p>Sofern wir im Rahmen unserer Verarbeitung Daten gegenüber anderen Personen und Unternehmen (Auftragsverarbeitern,
gemeinsam Verantwortlichen oder Dritten) offenbaren, sie an diese übermitteln oder ihnen sonst Zugriff auf die Daten
gewähren, erfolgt dies nur auf Grundlage einer gesetzlichen Erlaubnis (z.B. wenn eine Übermittlung der Daten an
Dritte, wie an Zahlungsdienstleister, zur Vertragserfüllung erforderlich ist), Nutzer eingewilligt haben, eine
rechtliche Verpflichtung dies vorsieht oder auf Grundlage unserer berechtigten Interessen (z.B. beim Einsatz von
Beauftragten, Webhostern, etc.). <br>
<br>
Sofern wir Daten anderen Unternehmen unserer Unternehmensgruppe offenbaren, übermitteln oder ihnen sonst den Zugriff
gewähren, erfolgt dies insbesondere zu administrativen Zwecken als berechtigtes Interesse und darüberhinausgehend
auf einer den gesetzlichen Vorgaben entsprechenden Grundlage. <br>
</p>
<h3 id="dsg-general-rightssubject">Rechte der betroffenen Personen</h3>
<p>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.<br>
<br>
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.<br>
<br>
Sie haben nach Maßgabe der gesetzlichen Vorgaben das Recht zu verlangen, dass betreffende Daten unverzüglich
gelöscht werden, bzw. alternativ nach Maßgabe der gesetzlichen Vorgaben eine Einschränkung der Verarbeitung der
Daten zu verlangen.<br>
<br>
Sie haben das Recht zu verlangen, dass die Sie betreffenden Daten, die Sie uns bereitgestellt haben nach Maßgabe der
gesetzlichen Vorgaben zu erhalten und deren Übermittlung an andere Verantwortliche zu fordern. <br>
<br>
Sie haben ferner nach Maßgabe der gesetzlichen Vorgaben das Recht, eine Beschwerde bei der zuständigen
Aufsichtsbehörde einzureichen.<br>
</p>
<h3 id="dsg-general-revokeconsent">Widerrufsrecht</h3>
<p>Sie haben das Recht, erteilte Einwilligungen mit Wirkung für die Zukunft zu widerrufen.</p>
<h3 id="dsg-general-object">Widerspruchsrecht</h3>
<p><strong>Sie können der künftigen Verarbeitung der Sie betreffenden Daten nach Maßgabe der gesetzlichen Vorgaben
jederzeit widersprechen. Der Widerspruch kann insbesondere gegen die Verarbeitung für Zwecke der Direktwerbung
erfolgen.</strong></p>
<h3 id="dsg-general-erasure">Löschung von Daten</h3>
<p>Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen Vorgaben gelöscht oder in ihrer Verarbeitung
eingeschränkt. Sofern nicht im Rahmen dieser Datenschutzerklärung ausdrücklich angegeben, werden die bei uns
gespeicherten Daten gelöscht, sobald sie für ihre Zweckbestimmung nicht mehr erforderlich sind und der Löschung
keine gesetzlichen Aufbewahrungspflichten entgegenstehen. <br>
<br>
Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird
deren Verarbeitung eingeschrä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.</p>
<h3 id="dsg-general-changes">Änderungen und Aktualisierungen der Datenschutzerklärung</h3>
<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></p>
<h3 id="dsg-contact">Kontaktaufnahme</h3>
<p></p>
<p><span class="ts-muster-content">Bei der Kontaktaufnahme mit uns (z.B. per Kontaktformular, E-Mail, Telefon oder via sozialer Medien) werden die Angaben des Nutzers zur Bearbeitung der Kontaktanfrage und deren Abwicklung gem. Art. 6 Abs. 1 lit. b. (im Rahmen vertraglicher-/vorvertraglicher Beziehungen), Art. 6 Abs. 1 lit. f. (andere Anfragen) DSGVO verarbeitet.. Die Angaben der Nutzer können in einem Customer-Relationship-Management System ("CRM System") oder vergleichbarer Anfragenorganisation gespeichert werden.<br>
<br>
Wir löschen die Anfragen, sofern diese nicht mehr erforderlich sind. Wir überprüfen die Erforderlichkeit alle zwei Jahre; Ferner gelten die gesetzlichen Archivierungspflichten.</span>
</p>
<p></p>
<h3 id="dsg-hostingprovider">Hosting und E-Mail-Versand</h3>
<p></p>
<p><span class="ts-muster-content">Die von uns in Anspruch genommenen Hosting-Leistungen dienen der Zurverfügungstellung der folgenden Leistungen: Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste, E-Mail-Versand, Sicherheitsleistungen sowie technische Wartungsleistungen, die wir zum Zwecke des Betriebs dieses Onlineangebotes einsetzen. <br>
<br>
Hierbei verarbeiten wir, bzw. unser Hostinganbieter Bestandsdaten, Kontaktdaten, Inhaltsdaten, Vertragsdaten, Nutzungsdaten, Meta- und Kommunikationsdaten von Kunden, Interessenten und Besuchern dieses Onlineangebotes auf Grundlage unserer berechtigten Interessen an einer effizienten und sicheren Zurverfügungstellung dieses Onlineangebotes gem. Art. 6 Abs. 1 lit. f DSGVO i.V.m. Art. 28 DSGVO (Abschluss Auftragsverarbeitungsvertrag).</span>
</p>
<p></p>
<h3 id="dsg-logfiles">Erhebung von Zugriffsdaten und Logfiles</h3>
<p></p>
<p><span class="ts-muster-content">Wir, bzw. unser Hostinganbieter, erhebt auf Grundlage unserer berechtigten Interessen im Sinne des Art. 6 Abs. 1 lit. f. DSGVO Daten über jeden Zugriff auf den Server, auf dem sich dieser Dienst befindet (sogenannte Serverlogfiles). Zu den Zugriffsdaten gehören Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.<br>
<br>
Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von Missbrauchs- oder Betrugshandlungen) für die Dauer von maximal 7 Tagen gespeichert und danach gelöscht. Daten, deren weitere Aufbewahrung zu Beweiszwecken erforderlich ist, sind bis zur endgültigen Klärung des jeweiligen Vorfalls von der Löschung ausgenommen.</span>
</p>
<p></p>
<a href="https://datenschutz-generator.de" class="dsg1-6" rel="nofollow" target="_blank">Erstellt mit
Datenschutz-Generator.de von RA Dr. Thomas Schwenke</a>
</body>
</html>

View file

@ -1,80 +0,0 @@
@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 "~@fortawesome/fontawesome-free/scss/fontawesome";
@import "~@fortawesome/fontawesome-free/scss/solid";
@import "~@fortawesome/fontawesome-free/scss/brands";
@import "~@fortawesome/fontawesome-free/scss/regular";
@font-face {
font-family: 'Minotaur';
src: local('Minotaur Phatte'), url(../font/minotaur.ttf) format('truetype');
}
body {
background-image: url("../img/bg.png");
color: #fff;
min-height: 100vh;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
&.legal {
padding: 2%;
}
}
.logo {
display: block;
margin: 0 auto;
max-width: 256px;
max-height: 256px;
background-color: #ffffff;
border-radius: 50%;
border: 2px solid #000000;
}
.menu {
border-top: 1px solid #ffffff;
}
.border-top-bottom {
border-top: 1px solid #ffffff;
border-bottom: 1px solid #ffffff;
}
a {
color: #ffffff;
}
a:hover {
color: #dddddd;
}
.sp-codes {
font-family: "Minotaur", monospace;
font-size: 5rem;
text-align: center;
}
.row {
margin: 0;
}
.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;
}
}