diff --git a/.eleventy.js b/.eleventy.js
new file mode 100644
index 0000000..24ff558
--- /dev/null
+++ b/.eleventy.js
@@ -0,0 +1,45 @@
+const pluginRss = require("@11ty/eleventy-plugin-rss");
+const markdownIt = require('./11ty/markdown.js');
+const customShortcodes = require('./11ty/shortcodes.js');
+
+const {
+ getDatetime,
+ getMonthDay,
+ getYear,
+ toFullDate,
+} = require("./src/filters/date.js")
+
+module.exports = config => {
+ config.setUseGitIgnore(false);
+ config.setLibrary('md', markdownIt);
+
+ config.addPlugin(pluginRss);
+
+ config.addFilter("getDatetime", getDatetime)
+ config.addFilter("getMonthDay", getMonthDay)
+ config.addFilter("getYear", getYear)
+ config.addFilter("toFullDate", toFullDate)
+
+ config.addShortcode('fetch', customShortcodes.fetch);
+ config.addPairedShortcode('full', customShortcodes.full);
+
+ config.addPassthroughCopy({"./src/_includes/js/" : "/js"});
+
+ config.addLayoutAlias('home', 'layouts/home.html');
+ config.addLayoutAlias('post', 'layouts/article.html');
+ config.addLayoutAlias('list', 'layouts/list.html');
+
+ config.addCollection('blog', collection => {
+ return [...collection.getFilteredByGlob('./src/posts/*.md')].reverse();
+ });
+
+ return {
+ markdownTemplateEngine: 'njk',
+ dataTemplateEngine: 'njk',
+ htmlTemplateEngine: 'njk',
+ dir: {
+ input: 'src',
+ output: 'dist'
+ }
+ };
+};
\ No newline at end of file
diff --git a/.eleventyignore b/.eleventyignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/.eleventyignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/11ty-theme.code-workspace b/11ty-theme.code-workspace
new file mode 100644
index 0000000..c153978
--- /dev/null
+++ b/11ty-theme.code-workspace
@@ -0,0 +1,10 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {
+ "editor.tabSize": 2
+ }
+}
\ No newline at end of file
diff --git a/11ty/markdown.js b/11ty/markdown.js
new file mode 100644
index 0000000..9d84d60
--- /dev/null
+++ b/11ty/markdown.js
@@ -0,0 +1,10 @@
+const markdownItDefault = require('markdown-it');
+
+// you can use any plugins and configs you want
+const markdownIt = markdownItDefault({
+ html: true,
+ breaks: false,
+ linkify: true,
+});
+
+module.exports = markdownIt;
\ No newline at end of file
diff --git a/11ty/shortcodes.js b/11ty/shortcodes.js
new file mode 100644
index 0000000..35d5f77
--- /dev/null
+++ b/11ty/shortcodes.js
@@ -0,0 +1,28 @@
+const EleventyFetch = require("@11ty/eleventy-fetch");
+const markdownIt = require('./markdown.js');
+const outdent = require('outdent');
+
+const full = (children) => {
+ const content = markdownIt.render(children);
+ return outdent`
${content}
`
+};
+
+const fetch = async (url, type) => {
+ try {
+ const text = await EleventyFetch(url,
+ {
+ duration: '*',
+ type: type
+ }
+ );
+ return text;
+ } catch (ex) {
+ console.log(ex);
+ return "";
+ }
+};
+
+module.exports = {
+ full,
+ fetch
+};
\ No newline at end of file
diff --git a/gulp-tasks/_fonts.js b/gulp-tasks/_fonts.js
new file mode 100644
index 0000000..cedcf6f
--- /dev/null
+++ b/gulp-tasks/_fonts.js
@@ -0,0 +1,20 @@
+const {dest, src} = require('gulp');
+const GetGoogleFonts = require('get-google-fonts');
+
+const fonts = async () => {
+ // Setup of the library instance by setting where we want
+ // the output to go. CSS is relative to output font directory
+ const instance = new GetGoogleFonts({
+ outputDir: './dist/fonts',
+ cssFile: './fonts.css'
+ });
+
+ // Grabs fonts and CSS from google and puts in the dist folder
+ const result = await instance.download(
+ 'https://fonts.googleapis.com/css2?family=Literata:ital,wght@0,400;0,700;1,400&family=Red+Hat+Display:wght@400;900'
+ );
+
+ return result;
+};
+
+module.exports = fonts;
diff --git a/gulp-tasks/images.js b/gulp-tasks/images.js
new file mode 100644
index 0000000..a2ab47a
--- /dev/null
+++ b/gulp-tasks/images.js
@@ -0,0 +1,24 @@
+const {dest, src} = require('gulp');
+const imagemin = require('gulp-imagemin');
+
+// Grabs all images, runs them through imagemin
+// and plops them in the dist folder
+const images = () => {
+ // We have specific configs for jpeg and png files to try
+ // to really pull down asset sizes
+ return src('./src/images/**/*')
+ .pipe(
+ imagemin(
+ [
+ imagemin.mozjpeg({quality: 60, progressive: true}),
+ imagemin.optipng({optimizationLevel: 5, interlaced: null})
+ ],
+ {
+ silent: true
+ }
+ )
+ )
+ .pipe(dest('./dist/images'));
+};
+
+module.exports = images;
diff --git a/gulp-tasks/sass.js b/gulp-tasks/sass.js
new file mode 100644
index 0000000..ca98ff2
--- /dev/null
+++ b/gulp-tasks/sass.js
@@ -0,0 +1,50 @@
+const {dest, src} = require('gulp');
+const cleanCSS = require('gulp-clean-css');
+const sassProcessor = require('gulp-sass')(require('sass'));
+
+// We want to be using canonical Sass, rather than node-sass
+sassProcessor.compiler = require('sass');
+
+// Flags whether we compress the output etc
+const isProduction = process.env.NODE_ENV === 'production';
+
+// An array of outputs that should be sent over to includes
+const criticalStyles = ['critical.scss', 'home.scss', 'page.scss', 'work-item.scss'];
+
+// Takes the arguments passed by `dest` and determines where the output file goes
+const calculateOutput = ({history}) => {
+ // By default, we want a CSS file in our dist directory, so the
+ // HTML can grab it with a
+ let response = './dist/css';
+
+ // Get everything after the last slash
+ const sourceFileName = /[^(/|\\)]*$/.exec(history[0])[0];
+
+ // If this is critical CSS though, we want it to go
+ // to the _includes directory, so nunjucks can include it
+ // directly in a
+
+
+