diff --git a/versions/latest/.gitignore b/versions/latest/.gitignore
new file mode 100644
index 0000000..a1c642e
--- /dev/null
+++ b/versions/latest/.gitignore
@@ -0,0 +1,7 @@
+# .gitignore
+
+.hugo_build.lock
+/public/
+/resources/_gen/
+/assets/jsconfig.json
+hugo_stats.json
\ No newline at end of file
diff --git a/versions/latest/Makefile b/versions/latest/Makefile
new file mode 100644
index 0000000..c4e0968
--- /dev/null
+++ b/versions/latest/Makefile
@@ -0,0 +1,5 @@
+serve:
+ docker run --rm -it -v $(PWD):/src -v $(PWD)/../../content:/src/content -v $(PWD)/../../static:/src/static -p 1313:1313 klakegg/hugo:0.111.3 server --bind 0.0.0.0
+
+build:
+ docker run --rm -it -v $(PWD):/src -v $(PWD)/../../content:/src/content -v $(PWD)/../../static:/src/static klakegg/hugo:0.111.3
\ No newline at end of file
diff --git a/versions/latest/config.yaml b/versions/latest/config.yaml
new file mode 100644
index 0000000..b0fb3ba
--- /dev/null
+++ b/versions/latest/config.yaml
@@ -0,0 +1,30 @@
+baseURL: "https://devsparks.goooseman.dev"
+languageCode: "en-us"
+title: "DevSparks Blog"
+theme: "devsparks"
+relativeUrls: true
+
+module:
+ mounts:
+ - source: "../../content"
+ target: "content"
+ - source: "../../static"
+ target: "static"
+
+params:
+ dateFormat: "January 2, 2006"
+
+menu:
+ main:
+ - name: "Hacks"
+ weight: 10
+ identifier: "hacks"
+ url: '/'
+ - name: "About"
+ weight: 20
+ identifier: "about"
+ url: '/about/'
+ - name: "GitHub"
+ weight: 30
+ identifier: "github"
+ url: 'https://github.com/goooseman/devsparks-blog'
\ No newline at end of file
diff --git a/versions/latest/shared_dependencies.md b/versions/latest/shared_dependencies.md
new file mode 100644
index 0000000..1db385f
--- /dev/null
+++ b/versions/latest/shared_dependencies.md
@@ -0,0 +1,39 @@
+Files to generate:
+- Makefile
+- .gitignore
+- config.yaml
+- themes/devsparks/layouts/_default/baseof.html
+- themes/devsparks/layouts/_default/list.html
+- themes/devsparks/layouts/_default/single.html
+- themes/devsparks/layouts/shortcodes/hackermans-tip.html
+- themes/devsparks/layouts/shortcodes/padawans-playground.html
+- themes/devsparks/static/css/main.css
+- themes/devsparks/static/css/syntax-highlighting.css
+- themes/devsparks/static/css/theme-light.css
+- themes/devsparks/static/css/theme-dark.css
+- themes/devsparks/static/js/theme-switcher.js
+- themes/devsparks/static/js/footer-image.js
+- themes/devsparks/static/js/remark42.js
+
+Shared dependencies:
+- breakpoints
+- theme-switch
+- remark42
+- footer-image-human
+- footer-image-robot
+- .layout__header
+- .header__theme_switch
+- .layout__link__active
+- .section__tip__hackerman
+- .section__tip__padawan
+- .tip__container
+- .tip__title
+- .tip__image
+- .article__title
+- .article__date
+- .article__tags
+- .article__content
+- .article__remark42
+- .footer__container
+- .footer__about_text
+- .footer__author-photo
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/layouts/_default/baseof.html b/versions/latest/themes/devsparks/layouts/_default/baseof.html
new file mode 100644
index 0000000..d0c24a3
--- /dev/null
+++ b/versions/latest/themes/devsparks/layouts/_default/baseof.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ .Title }}
+
+
+
+
+
+
+
+
+
+ {{ block "main" . }}{{ end }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/layouts/_default/list.html b/versions/latest/themes/devsparks/layouts/_default/list.html
new file mode 100644
index 0000000..af61b41
--- /dev/null
+++ b/versions/latest/themes/devsparks/layouts/_default/list.html
@@ -0,0 +1,19 @@
+{{ define "main" }}
+ {{ if .IsHome }}
+ Hacks
+ {{ else }}
+ {{ .Title }}
+ {{ end }}
+
+ {{ range (where .Site.RegularPages "Type" "in" (slice "hacks")).GroupByDate "2006" }}
+ {{ .Key }}
+
+ {{ range .Pages }}
+
+ {{ .Date.Format (.Site.Params.dateFormat | default "January 2, 2006" ) }}
+ {{ .Title }}
+
+ {{ end }}
+
+ {{ end }}
+{{ end }}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/layouts/_default/single.html b/versions/latest/themes/devsparks/layouts/_default/single.html
new file mode 100644
index 0000000..80d8a6b
--- /dev/null
+++ b/versions/latest/themes/devsparks/layouts/_default/single.html
@@ -0,0 +1,19 @@
+{{ define "main" }}
+
+ {{ .Title }}
+ {{ with .Date }}
+ {{ .Format "January 2, 2006" }}
+ {{ end }}
+ {{ with .Params.tags }}
+
+ {{ range . }}
+ {{ . }}
+ {{ end }}
+
+ {{ end }}
+
+ {{ .Content }}
+
+
+
+{{ end }}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/layouts/shortcodes/hackermans-tip.html b/versions/latest/themes/devsparks/layouts/shortcodes/hackermans-tip.html
new file mode 100644
index 0000000..8cf47fc
--- /dev/null
+++ b/versions/latest/themes/devsparks/layouts/shortcodes/hackermans-tip.html
@@ -0,0 +1,5 @@
+
+
Hackerman's tip
+
+ {{ .Inner | markdownify }}
+
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/layouts/shortcodes/padawans-playground.html b/versions/latest/themes/devsparks/layouts/shortcodes/padawans-playground.html
new file mode 100644
index 0000000..e54d6f1
--- /dev/null
+++ b/versions/latest/themes/devsparks/layouts/shortcodes/padawans-playground.html
@@ -0,0 +1,5 @@
+
+
Padawan's Playground
+
+ {{ .Inner | markdownify }}
+
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/css/main.css b/versions/latest/themes/devsparks/static/css/main.css
new file mode 100644
index 0000000..6b5021b
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/css/main.css
@@ -0,0 +1,87 @@
+@import url('https://fonts.googleapis.com/css2?family=Fira+Code&display=swap');
+
+:root {
+ --border-width: 2px;
+}
+
+a {
+ color: var(--text-color);
+ text-decoration: none;
+ border-bottom: var(--border-width) solid var(--text-color);
+ transition: color 0.3s, background-color 0.3s;
+}
+
+a:hover {
+ color: var(--background-color);
+ background-color: var(--text-color);
+ background-image: linear-gradient(to top, var(--text-color), var(--background-color));
+ background-position: 0 100%;
+ background-repeat: no-repeat;
+ background-size: 100% 200%;
+}
+
+.layout__link__active {
+ border: var(--border-width) solid;
+}
+
+.layout__header {
+ display: flex;
+ justify-content: space-between;
+ padding-top: 10px;
+}
+
+.header__theme_switch {
+ background: transparent;
+ border: var(--border-width) solid;
+ width: 22px;
+ height: 22px;
+ text-align: center;
+}
+
+.section__tip__hackerman .tip__container,
+.section__tip__padawan .tip__container {
+ position: relative;
+ margin-top: 300px;
+ margin-bottom: 5px;
+ border: var(--border-color) solid;
+ padding: 20px;
+ margin-left: -20px;
+ margin-right: -20px;
+}
+
+.section__tip__hackerman .tip__image,
+.section__tip__padawan .tip__image {
+ position: absolute;
+ bottom: 100%;
+ left: 20%;
+ height: 280px;
+}
+
+.tip__title {
+ font-style: italic;
+ font-weight: bold;
+}
+
+.article__content h3 {
+ padding-top: 5px;
+ border-top: var(--border-width) solid currentColor;
+}
+
+.article__remark42 {
+ margin-left: -20px;
+ margin-right: -20px;
+ margin-top: 10px;
+}
+
+body {
+ width: 600px;
+ margin: 0 auto;
+ background-color: var(--background-color);
+}
+
+@media (max-width: 680px) {
+ body {
+ width: 100%;
+ padding: 20px;
+ }
+}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/css/syntax-highlighting.css b/versions/latest/themes/devsparks/static/css/syntax-highlighting.css
new file mode 100644
index 0000000..3005536
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/css/syntax-highlighting.css
@@ -0,0 +1,20 @@
+/* themes/devsparks/static/css/syntax-highlighting.css */
+
+/* Single line code */
+code {
+ color: var(--background-color);
+ background-color: var(--color);
+}
+
+/* Code block */
+pre div.highlight {
+ background-color: var(--background-color);
+ color: white;
+ padding: 10px;
+}
+
+/* Code inside code block */
+pre div.highlight code {
+ background-color: transparent;
+ color: white;
+}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/css/theme-dark.css b/versions/latest/themes/devsparks/static/css/theme-dark.css
new file mode 100644
index 0000000..f0a6818
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/css/theme-dark.css
@@ -0,0 +1,62 @@
+/* themes/devsparks/static/css/theme-dark.css */
+
+:root {
+ --background-color: #40414e;
+ --text-color: #ffc000;
+ --border-color: #ffc000;
+}
+
+body.body__theme__dark {
+ background-color: var(--background-color);
+ color: var(--text-color);
+}
+
+.header__theme_switch {
+ background: transparent;
+ border: 2px solid var(--border-color);
+ width: 22px;
+ height: 22px;
+ text-align: center;
+}
+
+.layout__header {
+ display: flex;
+ justify-content: space-between;
+ padding-top: 10px;
+}
+
+.layout__link__active {
+ border: 2px solid;
+}
+
+.footer__about_text {
+ border: 2px solid var(--border-color);
+}
+
+.tip__container {
+ position: relative;
+ margin-top: 300px;
+ margin-bottom: 5px;
+ border: 2px solid var(--border-color);
+ padding: 20px;
+ margin-left: -20px;
+ margin-right: -20px;
+}
+
+.tip__image {
+ position: absolute;
+ bottom: 100%;
+ left: 20%;
+ height: 280px;
+}
+
+.article__content h3 {
+ padding-top: 5px;
+ border-top: 1px solid currentColor;
+}
+
+.article__remark42 {
+ margin-left: -20px;
+ margin-right: -20px;
+ margin-top: 10px;
+}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/css/theme-light.css b/versions/latest/themes/devsparks/static/css/theme-light.css
new file mode 100644
index 0000000..16f6be7
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/css/theme-light.css
@@ -0,0 +1,62 @@
+/* themes/devsparks/static/css/theme-light.css */
+
+:root {
+ --background-color: #ffc000;
+ --text-color: #40414e;
+ --border-color: #40414e;
+}
+
+.body__theme__light {
+ background-color: var(--background-color);
+ color: var(--text-color);
+}
+
+.header__theme_switch {
+ background: transparent;
+ border: 2px solid var(--border-color);
+ width: 22px;
+ height: 22px;
+ text-align: center;
+}
+
+.layout__header {
+ display: flex;
+ justify-content: space-between;
+ padding-top: 10px;
+}
+
+.layout__link__active {
+ border: 2px solid;
+}
+
+.footer__about_text {
+ border: 2px solid var(--border-color);
+}
+
+.tip__container {
+ position: relative;
+ margin-top: 300px;
+ margin-bottom: 5px;
+ border: 2px solid var(--border-color);
+ padding: 20px;
+ margin-left: -20px;
+ margin-right: -20px;
+}
+
+.tip__image {
+ position: absolute;
+ bottom: 100%;
+ left: 20%;
+ height: 280px;
+}
+
+.article__content h3 {
+ padding-top: 5px;
+ border-top: 1px solid currentColor;
+}
+
+.article__remark42 {
+ margin-left: -20px;
+ margin-right: -20px;
+ margin-top: 10px;
+}
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/js/footer-image.js b/versions/latest/themes/devsparks/static/js/footer-image.js
new file mode 100644
index 0000000..a2ce86b
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/js/footer-image.js
@@ -0,0 +1,12 @@
+const footerImageHuman = document.getElementById('footer-image-human');
+const footerImageRobot = document.getElementById('footer-image-robot');
+
+footerImageHuman.addEventListener('mouseover', () => {
+ footerImageHuman.style.display = 'none';
+ footerImageRobot.style.display = 'block';
+});
+
+footerImageRobot.addEventListener('mouseout', () => {
+ footerImageRobot.style.display = 'none';
+ footerImageHuman.style.display = 'block';
+});
\ No newline at end of file
diff --git a/versions/latest/themes/devsparks/static/js/remark42.js b/versions/latest/themes/devsparks/static/js/remark42.js
new file mode 100644
index 0000000..329293e
--- /dev/null
+++ b/versions/latest/themes/devsparks/static/js/remark42.js
@@ -0,0 +1,13 @@
+// https://r42.com/docs/configuration/frontend/
+var remark_config = {
+ host: 'https://r42.goooseman.dev',
+ site_id: 'dev_sparks',
+ components: ['embed', 'last-comments'],
+ max_shown_comments: 100,
+ theme: 'dark',
+ show_email_subscription: false,
+ simple_view: false,
+ no_footer: false
+}
+
+!function(e,n){for(var o=0;o