├── .nvmrc ├── .npmrc ├── static ├── banner.jpg ├── favicon.ico ├── robots.txt ├── favicon-16x16.png ├── favicon-32x32.png ├── apple-touch-icon.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png └── apple-touch-icon-precomposed.png ├── content ├── posts │ ├── hiring │ │ ├── hiring-1.png │ │ ├── hiring-2.png │ │ ├── hiring-3.png │ │ ├── hiring-4.png │ │ ├── hiring-5.png │ │ └── Hiring at startups.md │ ├── with-images │ │ ├── potions.jpg │ │ ├── defence-against-the-dark-arts.jpg │ │ └── index.mdx │ ├── code-block-examples │ │ ├── SpotifyPlayer.js │ │ └── index.mdx │ ├── normal-text │ │ └── index.mdx │ ├── weekly-12th April 24 │ │ └── Notes From W15 2024.md │ └── markdown-reference │ │ └── index.mdx └── pages │ └── about │ └── index.mdx ├── src ├── @lekoarts │ └── gatsby-theme-minimal-blog │ │ └── texts │ │ ├── hero.mdx │ │ └── bottom.mdx └── pages │ └── 404.tsx ├── .github └── FUNDING.yml ├── tsconfig.json ├── LICENSE ├── .gitignore ├── package.json ├── gatsby-config.ts ├── README.md └── CHANGELOG.md /.nvmrc: -------------------------------------------------------------------------------- 1 | 18 -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | -------------------------------------------------------------------------------- /static/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/banner.jpg -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/favicon.ico -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | 3 | sitemap: https://minimal-blog.lekoarts.de/sitemap-index.xml -------------------------------------------------------------------------------- /static/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/favicon-16x16.png -------------------------------------------------------------------------------- /static/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/favicon-32x32.png -------------------------------------------------------------------------------- /static/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/apple-touch-icon.png -------------------------------------------------------------------------------- /content/posts/hiring/hiring-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/hiring/hiring-1.png -------------------------------------------------------------------------------- /content/posts/hiring/hiring-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/hiring/hiring-2.png -------------------------------------------------------------------------------- /content/posts/hiring/hiring-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/hiring/hiring-3.png -------------------------------------------------------------------------------- /content/posts/hiring/hiring-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/hiring/hiring-4.png -------------------------------------------------------------------------------- /content/posts/hiring/hiring-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/hiring/hiring-5.png -------------------------------------------------------------------------------- /static/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/android-chrome-192x192.png -------------------------------------------------------------------------------- /static/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/android-chrome-512x512.png -------------------------------------------------------------------------------- /content/posts/with-images/potions.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/with-images/potions.jpg -------------------------------------------------------------------------------- /static/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/static/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /content/posts/with-images/defence-against-the-dark-arts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/levelmeup/fellow-musers-minimal/main/content/posts/with-images/defence-against-the-dark-arts.jpg -------------------------------------------------------------------------------- /src/@lekoarts/gatsby-theme-minimal-blog/texts/hero.mdx: -------------------------------------------------------------------------------- 1 | 2 | 3 | I'm Sam, a generalist who gets a little too into things sometimes. 4 | -------------------------------------------------------------------------------- /src/@lekoarts/gatsby-theme-minimal-blog/texts/bottom.mdx: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [3D Art with Cinema4D](https://www.lekoarts.de/art/3d?utm_source=minimal-blog&utm_medium=Theme) 4 | - [Landscape Photography](https://www.lekoarts.de/art/photography?utm_source=minimal-blog&utm_medium=Theme) 5 | -------------------------------------------------------------------------------- /content/pages/about/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: About 3 | slug: "/about" 4 | --- 5 | 6 | Hi! 7 | 8 | I'm LekoArts, a designer turned software engineer passionate about open source & teaching. Learn more about Gatsby & React on [my website](https://www.lekoarts.de?utm_source=minimal-blog&utm_medium=Starter). 9 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [LekoArts] 4 | patreon: # Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: lekoarts 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | custom: # Replace with a single custom sponsorship URL -------------------------------------------------------------------------------- /src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import type { PageProps } from "gatsby" 3 | import Layout from "@lekoarts/gatsby-theme-minimal-blog/src/components/layout" 4 | 5 | const NotFound = (_props: PageProps) => ( 6 | <Layout> 7 | <h1>404 - Page Not Found</h1> 8 | <p>Unfortunately we couldn't find what you were looking for :(</p> 9 | </Layout> 10 | ) 11 | 12 | export default NotFound 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": ["dom", "esnext"], 5 | "jsx": "react-jsx", 6 | "jsxImportSource": "theme-ui", 7 | "module": "esnext", 8 | "moduleResolution": "node", 9 | "esModuleInterop": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "strict": true, 12 | "skipLibCheck": true, 13 | }, 14 | "include": [ 15 | "./src/**/*", 16 | "./gatsby-node.ts", 17 | "./gatsby-config.ts", 18 | "./plugins/**/*", 19 | ], 20 | } 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The BSD Zero Clause License (0BSD) 2 | 3 | Copyright (c) 2023 LekoArts 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 | PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /content/posts/code-block-examples/SpotifyPlayer.js: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | // Size presets, defined by Spotify 4 | const sizePresets = { 5 | normal: { 6 | width: `100%`, 7 | height: `352px`, 8 | }, 9 | compact: { 10 | width: `100%`, 11 | height: `152px`, 12 | }, 13 | } 14 | 15 | function SpotifyPlayer({ albumUri = `6Ar5HxNWXtvraqs7FI7bYq`, size = `normal` }) { 16 | return ( 17 | <iframe 18 | title="Spotify" 19 | style={{ 20 | borderRadius: `12px`, 21 | }} 22 | src={`https://open.spotify.com/embed/album/${albumUri}?theme=0`} 23 | width={sizePresets[size].width} 24 | height={sizePresets[size].height} 25 | frameBorder="0" 26 | allowfullscreen="" 27 | allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" 28 | loading="lazy" 29 | /> 30 | ) 31 | } 32 | 33 | export default SpotifyPlayer 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules 37 | jspm_packages 38 | **/node_modules/** 39 | 40 | # Typescript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | .env.* 61 | !.env.example 62 | 63 | .cache 64 | **/.cache 65 | public 66 | 67 | .idea 68 | .vscode 69 | .DS_Store -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "minimal-blog", 4 | "description": "Typography driven, feature-rich blogging theme with minimal aesthetics. Includes tags/categories support and extensive features for code blocks such as live preview, line numbers, and line highlighting.", 5 | "version": "1.3.16", 6 | "author": "LekoArts", 7 | "license": "0BSD", 8 | "starter-name": "gatsby-starter-minimal-blog", 9 | "scripts": { 10 | "build": "gatsby build", 11 | "develop": "gatsby develop", 12 | "develop:cypress": "cross-env CYPRESS_SUPPORT=y yarn develop", 13 | "build:cypress": "cross-env CYPRESS_SUPPORT=y yarn build", 14 | "start": "gatsby develop", 15 | "serve": "gatsby serve", 16 | "clean": "gatsby clean" 17 | }, 18 | "dependencies": { 19 | "@lekoarts/gatsby-theme-minimal-blog": "^6.2.1", 20 | "gatsby": "^5.13.3", 21 | "gatsby-plugin-feed": "^5.13.1", 22 | "gatsby-plugin-manifest": "^5.13.1", 23 | "gatsby-plugin-sitemap": "^6.13.1", 24 | "gatsby-plugin-webpack-statoscope": "^1.0.3", 25 | "react": "^18.2.0", 26 | "react-dom": "^18.2.0" 27 | }, 28 | "devDependencies": { 29 | "@types/node": "^18.19.13", 30 | "@types/react": "^18.2.51", 31 | "@types/react-dom": "^18.2.18", 32 | "cross-env": "^7.0.3", 33 | "typescript": "^5.3.3" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /content/posts/normal-text/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Normal Text" 3 | date: 2022-09-10 4 | slug: "/normal-text-override" 5 | canonicalUrl: "https://blog-about-normal-text.com" 6 | --- 7 | 8 | Thestral dirigible plums, Viktor Krum hexed memory charm Animagus Invisibility Cloak three-headed Dog. Half-Blood Prince Invisibility Cloak cauldron cakes, hiya Harry! Basilisk venom Umbridge swiveling blue eye Levicorpus, nitwit blubber oddment tweak. Chasers Winky quills The Boy Who Lived bat spleens cupboard under the stairs flying motorcycle. Sirius Black Holyhead Harpies, you’ve got dirt on your nose. Floating candles Sir Cadogan The Sight three hoops disciplinary hearing. Grindlewald pig’s tail Sorcerer's Stone biting teacup. Side-along dragon-scale suits Filch 20 points, Mr. Potter. 9 | 10 | > Mobilicorpus reducto liberacorpus crucio. Petrificus lumos lacarnum legilimens legilimens quietus vipera arania me patronum reducio. Episkey reducio quietus mobilicorpus fidelius aparecium. Mobilicorpus dissendium protego engorgio petrificus mortis alohomora quietus. 11 | 12 | Squashy armchairs dirt on your nose brass scales crush the Sopophorous bean with flat side of silver dagger, releases juice better than cutting. Full moon Whomping Willow three turns should do it lemon drops. Locomotor trunks owl treats that will be 50 points, Mr. Potter. Witch Weekly, he will rise again and he will come for us, headmaster Erumpent horn. Fenrir Grayback horseless carriages ‘zis is a chance many would die for! 13 | -------------------------------------------------------------------------------- /content/posts/weekly-12th April 24/Notes From W15 2024.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Weekly Notes 12th April 2024 3 | date: 2024-04-12 4 | description: Regular notes on consumption & interesting books 5 | defer: false 6 | tags: 7 | - Weekly 8 | - Consumption 9 | canonicalUrl: https://xx 10 | --- 11 | 12 | 13 | Media Consumption 14 | - Continued Reading Outsiders, by Howard Becker. Great book, more to follow 15 | - Read the review for [The Historian](https://www.amazon.co.uk/Historian-Elizabeth-Kostova/dp/0751537284) and decided it wasn't for me 16 | - Rediscovered Burial Untrue album and listened to it approximately 20 times 17 | - Tried in vain to work out what song Declan McKenna - Brazil reminds me of. Like a love child of Razorlight, Vampire Weekend, still bugging me 18 | - Downloaded Andrew O'Hagan - Mayflies 19 | - Watched [Roadhouse](https://www.youtube.com/watch?v=Y0ZsLudtfjI&ab_channel=PrimeVideo) which I went in blind to. Bonkers bonkers film. C from me. Ridiculous. Pulp at its finest, but pretty shite 20 | - Watched the end of the Gentlemen. A-. Feel like Mr Ritchie has found his groove with this series. Daniel Ings is very fun. 21 | - 🍿Watched Three Body Problem. Still love the underlying content, but the TV show was flat, and the acting fairly poor. A reluctant B- 22 | 23 | Biziness, Data science & Programming 24 | - https://blog.alexmaccaw.com/an-engineers-guide-to-stock-options/ - bookmarked for future reference 25 | - [Eric Seufert's definition of brand vs performance marketing]([https://mobiledevmemo.com/understanding-the-role-of-brand-marketing-for-digital-products/](https://mobiledevmemo.com/understanding-the-role-of-brand-marketing-for-digital-products/)) is my go to when trying to explain things to new marketeers in tech 26 | - https://sdk.vercel.ai/ AI Playground for comparing models 27 | - [https://www.thediff.co/archive/palantir-on-business-cults-and-politics/](The Diff view on Palantir) including this zinger I'm stealing “Cult” is just a euphemism for “ability to pay below-market salaries and get above-average worker retention.” 28 | - https://www.thediff.co/archive/the-duolingo-disaster-that-wasnt/ - Also learnt something here about Duolingo business model. Very interesting! 29 | - How to send updates on your project - short and to the point https://www.spakhm.com/updates-howto 30 | 31 | Musings & good reads 32 | - https://interconnected.org/home/2024/04/05/driving was my favourite blog post of the week. "It does a disservice to this cognitive state to believe that it can be found only with psychedelics or meditation or whatever, whereas there are mundane apertures too" 33 | - https://worrydream.com/LadderOfAbstraction/ One of my new favourite interactive essays, going through how understanding can be aided by interactivity. Still would love to get better at making pages like this. Should probably try D3 again 34 | 35 | Purchases 36 | - Got into a research hole on phone gimbals and tripods. [Insta360 gimbal](https://www.insta360.com/product/insta360-flow) for £130 was the one I plumped for. Peak design magsafe for a quick tripod 37 | 38 | Other beautiful stuff 39 | - https://scottfrasercollection.com/ made to order 50s style clothes 40 | - https://www.giuliaboggio.xyz/fonts/bastardo-grotesk nice font innit 41 | - [Conran salad bowl](https://theconranshop.com/products/splatter-serving-bowl-mustard-green-large) 42 | 43 | -------------------------------------------------------------------------------- /content/posts/with-images/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: With Images 3 | date: 2022-09-17 4 | description: Defence Against the Dark Arts (abbreviated as DADA) is a subject taught at Hogwarts School of Witchcraft and Wizardry and Ilvermorny School of Witchcraft and Wizardry. In this class, students study and learn how to defend themselves against all aspects of the Dark Arts, including dark creatures, curses, hexes and jinxes (dark charms), and duelling. 5 | tags: 6 | - Tutorial 7 | banner: ./defence-against-the-dark-arts.jpg 8 | --- 9 | 10 | Thestral dirigible plums, Viktor Krum hexed memory charm Animagus Invisibility Cloak three-headed Dog. Half-Blood Prince Invisibility Cloak cauldron cakes, hiya Harry! Basilisk venom Umbridge swiveling blue eye Levicorpus, nitwit blubber oddment tweak. Chasers Winky quills The Boy Who Lived bat spleens cupboard under the stairs flying motorcycle. Sirius Black Holyhead Harpies, you’ve got dirt on your nose. Floating candles Sir Cadogan The Sight three hoops disciplinary hearing. Grindlewald pig’s tail Sorcerer's Stone biting teacup. Side-along dragon-scale suits Filch 20 points, Mr. Potter. 11 | 12 | Squashy armchairs dirt on your nose brass scales crush the Sopophorous bean with flat side of silver dagger, releases juice better than cutting. Full moon Whomping Willow three turns should do it lemon drops. Locomotor trunks owl treats that will be 50 points, Mr. Potter. Witch Weekly, he will rise again and he will come for us, headmaster Erumpent horn. Fenrir Grayback horseless carriages ‘zis is a chance many would die for! 13 | 14 | ![Potions Class](./potions.jpg) 15 | 16 | Half-giant jinxes peg-leg gillywater broken glasses large black dog Great Hall. Nearly-Headless Nick now string them together, and answer me this, which creature would you be unwilling to kiss? Poltergeist sticking charm, troll umbrella stand flying cars golden locket Lily Potter. Pumpkin juice Trevor wave your wand out glass orbs, a Grim knitted hats. Stan Shunpike doe patronus, suck his soul Muggle-Born large order of drills the trace. Bred in captivity fell through the veil, quaffle blue flame ickle diddykins Aragog. Yer a wizard, Harry Doxycide the woes of Mrs. Weasley Goblet of Fire. 17 | 18 | ## This is a secondary heading 19 | 20 | Exume lumos protego leviosa. Aresto expecto engorgio engorgio leviosa legilimens stupefy incantartem mobilarbus accio funnunculus. Serpensortia locomotor incarcerous aguamenti colloportus. Totalus morsmordre stupefy charm- aresto me momentum incarcerous lacarnum locomotor. Revelio relashio veritaserum impedimenta expecto quietus. Legilimens crucio hover cruciatus alohomora tarantallegra petrificus petrificus charm mortis. Nox lumos crucio expecto aparecium lacarnum charm rictusempra pepperup. 21 | 22 | --- 23 | 24 | Sectumsempra aresto exume reducio momentum tarantallegra patronum. Totalus amortentia momentum mortis quietus evanesco. Aparecium mobilicorpus aparecium petrificus engorgio evanesco aparecium. Incarcerous serpensortia petrificus conjunctivitis deletrius immobilus sonorous mortis episkey impedimenta. Immobilus lacarnum totalus protean. Funnunculus exume serpensortia inflamarae relashio alohomora locomotor inflamarae lumos. Skele-gro totalus. 25 | 26 | ## Another secondary heading 27 | 28 | ### Third heading level 29 | 30 | Legilimens colloportus aparecium aresto aparecium leviosa unctuous inflamarae. Quietus mobilarbus incarcerous stupefy confundus leviosa. Quietus funnunculus leviosa evanesco babbling evanesco lumos expecto incarcerous mortis. 31 | 32 | Reparo reparo alohomora vow. Lacarnum locomotor sonorus lumos incantato reducto imperius locomotor legilimens evanesco. Locomotor patronum stupefy lumos scourgify lacarnum. Portus charm inflamarae leviosa stupefy. Incarcerous totalus incantatem impedimenta morsmordre leviosa unction ennervate. Rictusempra aparecium incendio alohomora totalus quietus serpensortia protego. 33 | 34 | Mobilicorpus reducto liberacorpus crucio. Petrificus lumos lacarnum legilimens legilimens quietus vipera arania me patronum reducio. Episkey reducio quietus mobilicorpus fidelius aparecium. Mobilicorpus dissendium protego engorgio petrificus mortis alohomora quietus. 35 | 36 | Sonorus tarantallegra leviosa wingardium finite stupefy. 37 | -------------------------------------------------------------------------------- /content/posts/code-block-examples/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Code Block Examples 3 | date: 2022-09-11 4 | tags: 5 | - Code 6 | --- 7 | 8 | import SpotifyPlayer from "./SpotifyPlayer" 9 | 10 | Here will a React component go: 11 | 12 | <SpotifyPlayer /> 13 | 14 | Here will a normal code block go: 15 | 16 | ```js 17 | (function() { 18 | 19 | var cache = {}; 20 | var form = $('form'); 21 | var minified = true; 22 | 23 | var dependencies = {}; 24 | 25 | var treeURL = 'https://api.github.com/repos/PrismJS/prism/git/trees/gh-pages?recursive=1'; 26 | var treePromise = new Promise(function(resolve) { 27 | $u.xhr({ 28 | url: treeURL, 29 | callback: function(xhr) { 30 | if (xhr.status < 400) { 31 | resolve(JSON.parse(xhr.responseText).tree); 32 | } 33 | } 34 | }); 35 | }); 36 | ``` 37 | 38 | A code block with a JSDoc comment, short, and long comment: 39 | 40 | ```js 41 | /** 42 | * Get value out of string (e.g. rem => px) 43 | * If value is px strip the px part 44 | * If the input is already a number only return that value 45 | * @param {string | number} input 46 | * @param {number} [rootFontSize] 47 | * @return {number} Number without last three characters 48 | * @example removeLastThree('6rem') => 6 49 | */ 50 | const getValue = (input, rootFontSize = 16) => { 51 | if (typeof input === `number`) { 52 | return input / rootFontSize 53 | } 54 | 55 | const isPxValue = input.slice(-2) === `px` 56 | 57 | if (isPxValue) { 58 | return parseFloat(input.slice(0, -2)) 59 | } 60 | 61 | return parseFloat(input.slice(0, -3)) 62 | } 63 | 64 | // This is a little helper function 65 | const helper = (a, b) => a + b 66 | 67 | // This is also a little helper function but this time with a really long one-line comment that should show some more details 68 | const morehelper = (a, b) => a * b 69 | 70 | export { getValue, helper, morehelper } 71 | ``` 72 | 73 | Normal block without language: 74 | 75 | ``` 76 | import Test from "../components/test" 77 | 78 | const Layout = ({ children }) => ( 79 | <Test> 80 | {children} 81 | </Test> 82 | ) 83 | 84 | export default Layout 85 | ``` 86 | 87 | Code block with code highlighting: 88 | 89 | ```jsx title=src/components/post.jsx highlight=5-7,10 90 | import * as React from "react" 91 | 92 | const Post = ({ data: { post } }) => ( 93 | <Layout> 94 | <Heading variant="h2" as="h2"> 95 | {post.title} 96 | </Heading> 97 | <p 98 | sx={{ 99 | color: `secondary`, 100 | mt: 3, 101 | a: { color: `secondary` }, 102 | fontSize: [1, 1, 2], 103 | }} 104 | > 105 | <span>{post.date}</span> 106 | {post.tags && ( 107 | <React.Fragment> 108 | {` — `} 109 | <ItemTags tags={post.tags} /> 110 | </React.Fragment> 111 | )} 112 | </p> 113 | <section 114 | sx={{ 115 | ...CodeStyles, 116 | my: 5, 117 | ".gatsby-resp-image-wrapper": { my: 5, boxShadow: `lg` }, 118 | }} 119 | > 120 | <MDXRenderer>{post.body}</MDXRenderer> 121 | </section> 122 | </Layout> 123 | ) 124 | 125 | export default Post 126 | ``` 127 | 128 | Code block without title: 129 | 130 | ``` 131 | Harry Potter and the Philosopher's Stone 132 | ``` 133 | 134 | Code block with lineNumbers (and lang): 135 | 136 | ```text withLineNumbers 137 | Harry Potter and the Chamber of Secrets 138 | ``` 139 | 140 | Code block with lineNumbers (and without lang): 141 | 142 | ```none withLineNumbers 143 | Harry Potter and the Chamber of Secrets 144 | ``` 145 | 146 | Code block with only the title: 147 | 148 | ```none title=src/utils/scream.js 149 | const scream = (input) => window.alert(input) 150 | ``` 151 | 152 | Code block with only the title and with lineNumbers: 153 | 154 | ```none title=src/utils/scream.js withLineNumbers 155 | const scream = (input) => window.alert(input) 156 | ``` 157 | 158 | Line highlighting without code title: 159 | 160 | ```js highlight=2,4-5 161 | const test = 3 162 | const foo = "bar" 163 | const harry = "potter" 164 | const hermione = "granger" 165 | const ron = "weasley" 166 | ``` 167 | 168 | Here will `inline code` go, just inside the text. Wow! 169 | 170 | Code block with line numbers, highlighting, language, and title: 171 | 172 | <div data-testid="code-block"> 173 | 174 | ```tsx title=src/components/blog.tsx highlight=7-8,19,21 withLineNumbers 175 | import * as React from "react" 176 | 177 | const Blog = ({ posts }: PostsProps) => { 178 | const { tagsPath, basePath } = useSiteMetadata() 179 | 180 | return ( 181 | <Layout> 182 | <Flex sx={{ alignItems: `center`, justifyContent: `space-between` }}> 183 | <Heading variant="h2" as="h2"> 184 | Blog 185 | </Heading> 186 | <Styled.a as={Link} sx={{ variant: `links.secondary` }} to={`/${basePath}/${tagsPath}`.replace(/\/\/+/g, `/`)}> 187 | View all tags 188 | </Styled.a> 189 | </Flex> 190 | <Listing posts={posts} sx={{ mt: [4, 5] }} /> 191 | </Layout> 192 | ) 193 | } 194 | 195 | export default Blog 196 | ``` 197 | 198 | </div> 199 | -------------------------------------------------------------------------------- /gatsby-config.ts: -------------------------------------------------------------------------------- 1 | import type { GatsbyConfig, PluginRef } from "gatsby" 2 | import "dotenv/config" 3 | 4 | const shouldAnalyseBundle = process.env.ANALYSE_BUNDLE 5 | 6 | const config: GatsbyConfig = { 7 | siteMetadata: { 8 | // You can overwrite values here that are used for the SEO component 9 | // You can also add new values here to query them like usual 10 | // See all options: https://github.com/LekoArts/gatsby-themes/blob/main/themes/gatsby-theme-minimal-blog/gatsby-config.mjs 11 | siteTitle: `Fellow Musers`, 12 | siteTitleAlt: `Fellow Musers- a collection of thoughts`, 13 | siteHeadline: `Fellow Musers- a collection of thought`, 14 | siteUrl: `https://fellow-musers-minimal.pages.dev/`, 15 | siteDescription: `A simple blog, a digital garden with unpruned thoughts`, 16 | siteImage: `/banner.jpg`, 17 | siteLanguage: `en`, 18 | author: `@first_ader`, 19 | }, 20 | trailingSlash: `always`, 21 | plugins: [ 22 | { 23 | resolve: `@lekoarts/gatsby-theme-minimal-blog`, 24 | // See the theme's README for all available options 25 | options: { 26 | navigation: [ 27 | { 28 | title: `Blog`, 29 | slug: `/blog`, 30 | }, 31 | { 32 | title: `About`, 33 | slug: `/about`, 34 | }, 35 | ], 36 | externalLinks: [ 37 | { 38 | name: `Twitter`, 39 | url: `https://twitter.com/first_ader`, 40 | }, 41 | { 42 | name: `Homepage`, 43 | url: `https://www.lekoarts.de?utm_source=minimal-blog&utm_medium=Starter`, 44 | }, 45 | ], 46 | }, 47 | }, 48 | { 49 | resolve: `gatsby-plugin-sitemap`, 50 | options: { 51 | output: `/`, 52 | }, 53 | }, 54 | { 55 | resolve: `gatsby-plugin-manifest`, 56 | options: { 57 | name: `minimal-blog - @lekoarts/gatsby-theme-minimal-blog`, 58 | short_name: `minimal-blog`, 59 | description: `Typography driven, feature-rich blogging theme with minimal aesthetics. Includes tags/categories support and extensive features for code blocks such as live preview, line numbers, and code highlighting.`, 60 | start_url: `/`, 61 | background_color: `#fff`, 62 | // This will impact how browsers show your PWA/website 63 | // https://css-tricks.com/meta-theme-color-and-trickery/ 64 | // theme_color: `#6B46C1`, 65 | display: `standalone`, 66 | icons: [ 67 | { 68 | src: `/android-chrome-192x192.png`, 69 | sizes: `192x192`, 70 | type: `image/png`, 71 | }, 72 | { 73 | src: `/android-chrome-512x512.png`, 74 | sizes: `512x512`, 75 | type: `image/png`, 76 | }, 77 | ], 78 | }, 79 | }, 80 | { 81 | resolve: `gatsby-plugin-feed`, 82 | options: { 83 | query: ` 84 | { 85 | site { 86 | siteMetadata { 87 | title: siteTitle 88 | description: siteDescription 89 | siteUrl 90 | site_url: siteUrl 91 | } 92 | } 93 | } 94 | `, 95 | feeds: [ 96 | { 97 | serialize: ({ 98 | query: { site, allPost }, 99 | }: { 100 | query: { allPost: IAllPost; site: { siteMetadata: ISiteMetadata } } 101 | }) => 102 | allPost.nodes.map((post) => { 103 | const url = site.siteMetadata.siteUrl + post.slug 104 | const content = `<p>${post.excerpt}</p><div style="margin-top: 50px; font-style: italic;"><strong><a href="${url}">Keep reading</a>.</strong></div><br /> <br />` 105 | 106 | return { 107 | title: post.title, 108 | date: post.date, 109 | excerpt: post.excerpt, 110 | url, 111 | guid: url, 112 | custom_elements: [{ "content:encoded": content }], 113 | } 114 | }), 115 | query: `{ 116 | allPost(sort: {date: DESC}) { 117 | nodes { 118 | title 119 | date(formatString: "MMMM D, YYYY") 120 | excerpt 121 | slug 122 | } 123 | } 124 | }`, 125 | output: `rss.xml`, 126 | title: `Minimal Blog - @lekoarts/gatsby-theme-minimal-blog`, 127 | }, 128 | ], 129 | }, 130 | }, 131 | // You can remove this plugin if you don't need it 132 | shouldAnalyseBundle && { 133 | resolve: `gatsby-plugin-webpack-statoscope`, 134 | options: { 135 | saveReportTo: `${__dirname}/public/.statoscope/_bundle.html`, 136 | saveStatsTo: `${__dirname}/public/.statoscope/_stats.json`, 137 | open: false, 138 | }, 139 | }, 140 | ].filter(Boolean) as Array<PluginRef>, 141 | } 142 | 143 | export default config 144 | 145 | interface IPostTag { 146 | name: string 147 | slug: string 148 | } 149 | 150 | interface IPost { 151 | slug: string 152 | title: string 153 | defer: boolean 154 | date: string 155 | excerpt: string 156 | contentFilePath: string 157 | html: string 158 | timeToRead: number 159 | wordCount: number 160 | tags: Array<IPostTag> 161 | banner: any 162 | description: string 163 | canonicalUrl: string 164 | } 165 | 166 | interface IAllPost { 167 | nodes: Array<IPost> 168 | } 169 | 170 | interface ISiteMetadata { 171 | siteTitle: string 172 | siteTitleAlt: string 173 | siteHeadline: string 174 | siteUrl: string 175 | siteDescription: string 176 | siteImage: string 177 | author: string 178 | } 179 | -------------------------------------------------------------------------------- /content/posts/markdown-reference/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown Reference 3 | date: 2022-09-12 4 | tags: 5 | - Code 6 | - Markdown 7 | --- 8 | 9 | ## What to expect from here on out 10 | 11 | What follows from here is just a bunch of absolute nonsense I've written to dogfood the plugin itself. It includes every sensible typographic element I could think of, like **bold text**, unordered lists, ordered lists, code blocks, block quotes, _and even italics_. 12 | 13 | It's important to cover all of these use cases for a few reasons: 14 | 15 | 1. We want everything to look good out of the box. 16 | 2. Really just the first reason, that's the whole point of the plugin. 17 | 3. Here's a third pretend reason though a list with three items looks more realistic than a list with two items. 18 | 19 | Footnotes[^1] should also work. 20 | 21 | Now we're going to try out another header style. 22 | 23 | ### Typography should be easy 24 | 25 | So that's a header for you — with any luck if we've done our job correctly that will look pretty reasonable. 26 | 27 | Something a wise person once told me about typography is: 28 | 29 | > Typography is pretty important if you don't want your stuff to look like trash. Make it good then it won't be bad. 30 | 31 | It's probably important that images look okay here by default as well: 32 | 33 | ![](https://images.unsplash.com/photo-1556740758-90de374c12ad?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=80) 34 | 35 | Now I'm going to show you an example of an unordered list to make sure that looks good, too: 36 | 37 | - So here is the first item in this list. 38 | - In this example we're keeping the items short. 39 | - Later, we'll use longer, more complex list items. 40 | 41 | And that's the end of this section. 42 | 43 | ## What if we stack headings? 44 | 45 | ### We should make sure that looks good, too. 46 | 47 | Sometimes you have headings directly underneath each other. In those cases you often have to undo the top margin on the second heading because it usually looks better for the headings to be closer together than a paragraph followed by a heading should be. 48 | 49 | ### When a heading comes after a paragraph … 50 | 51 | When a heading comes after a paragraph, we need a bit more space, like I already mentioned above. Now let's see what a more complex list would look like. 52 | 53 | - **I often do this thing where list items have headings.** 54 | 55 | For some reason I think this looks cool which is unfortunate because it's pretty annoying to get the styles right. 56 | 57 | I often have two or three paragraphs in these list items, too, so the hard part is getting the spacing between the paragraphs, list item heading, and separate list items to all make sense. Pretty tough honestly, you could make a strong argument that you just shouldn't write this way. 58 | 59 | - **Since this is a list, I need at least two items.** 60 | 61 | I explained what I'm doing already in the previous list item, but a list wouldn't be a list if it only had one item, and we really want this to look realistic. That's why I've added this second list item so I actually have something to look at when writing the styles. 62 | 63 | - **It's not a bad idea to add a third item either.** 64 | 65 | I think it probably would've been fine to just use two items but three is definitely not worse, and since I seem to be having no trouble making up arbitrary things to type, I might as well include it. 66 | 67 | After this sort of list I usually have a closing statement or paragraph, because it kinda looks weird jumping right to a heading. 68 | 69 | ## Code should look okay by default. 70 | 71 | I think most people are going to use [highlight.js](https://highlightjs.org/) or [Prism](https://prismjs.com/) or something if they want to style their code blocks but it wouldn't hurt to make them look _okay_ out of the box, even with no syntax highlighting. 72 | 73 | Here's what a default `tailwind.config.js` file looks like at the time of writing: 74 | 75 | ```js 76 | module.exports = { 77 | purge: [], 78 | theme: { 79 | extend: {}, 80 | }, 81 | variants: {}, 82 | plugins: [], 83 | } 84 | ``` 85 | 86 | Hopefully that looks good enough to you. 87 | 88 | ### What about nested lists? 89 | 90 | Nested lists basically always look bad which is why editors like Medium don't even let you do it, but I guess since some of you goofballs are going to do it we have to carry the burden of at least making it work. 91 | 92 | 1. **Nested lists are rarely a good idea.** 93 | - You might feel like you are being really "organized" or something but you are just creating a gross shape on the screen that is hard to read. 94 | - Nested navigation in UIs is a bad idea too, keep things as flat as possible. 95 | - Nesting tons of folders in your source code is also not helpful. 96 | 2. **Since we need to have more items, here's another one.** 97 | - I'm not sure if we'll bother styling more than two levels deep. 98 | - Two is already too much, three is guaranteed to be a bad idea. 99 | - If you nest four levels deep you belong in prison. 100 | 3. **Two items isn't really a list, three is good though.** 101 | - Again please don't nest lists if you want people to actually read your content. 102 | - Nobody wants to look at this. 103 | - I'm upset that we even have to bother styling this. 104 | 105 | The most annoying thing about lists in Markdown is that `<li>` elements aren't given a child `<p>` tag unless there are multiple paragraphs in the list item. That means I have to worry about styling that annoying situation too. 106 | 107 | - **For example, here's another nested list.** 108 | 109 | But this time with a second paragraph. 110 | 111 | - These list items won't have `<p>` tags 112 | - Because they are only one line each 113 | 114 | - **But in this second top-level list item, they will.** 115 | 116 | This is especially annoying because of the spacing on this paragraph. 117 | 118 | - As you can see here, because I've added a second line, this list item now has a `<p>` tag. 119 | 120 | This is the second line I'm talking about by the way. 121 | 122 | - Finally here's another list item so it's more like a list. 123 | 124 | - A closing list item, but with no nested list, because why not? 125 | 126 | And finally a sentence to close off this section. 127 | 128 | ## There are other elements we need to style 129 | 130 | I almost forgot to mention links, like [this link to the Tailwind CSS website](https://tailwindcss.com). We almost made them blue but that's so yesterday, so we went with dark gray, feels edgier. 131 | 132 | We even included table styles, check it out: 133 | 134 | | Wrestler | Origin | Finisher | 135 | | ----------------------- | ------------ | ------------------ | 136 | | Bret "The Hitman" Hart | Calgary, AB | Sharpshooter | 137 | | Stone Cold Steve Austin | Austin, TX | Stone Cold Stunner | 138 | | Randy Savage | Sarasota, FL | Elbow Drop | 139 | | Vader | Boulder, CO | Vader Bomb | 140 | | Razor Ramon | Chuluota, FL | Razor's Edge | 141 | 142 | We also need to make sure inline code looks good, like if I wanted to talk about `<span>` elements or tell you the good news about `@tailwindcss/typography`. 143 | 144 | ### Sometimes I even use `code` in headings 145 | 146 | Even though it's probably a bad idea, and historically I've had a hard time making it look good. This _"wrap the code blocks in backticks"_ trick works pretty well though really. 147 | 148 | Another thing I've done in the past is put a `code` tag inside of a link, like if I wanted to tell you about the [`tailwindcss/docs`](https://github.com/tailwindcss/docs) repository. I don't love that there is an underline below the backticks but it is absolutely not worth the madness it would require to avoid it. 149 | 150 | #### We haven't used an `h4` yet 151 | 152 | But now we have. Please don't use `h5` or `h6` in your content, Medium only supports two heading levels for a reason, you animals. I honestly considered using a `before` pseudo-element to scream at you if you use an `h5` or `h6`. 153 | 154 | We don't style them at all out of the box because `h4` elements are already so small that they are the same size as the body copy. What are we supposed to do with an `h5`, make it _smaller_ than the body copy? No thanks. 155 | 156 | ### We still need to think about stacked headings though. 157 | 158 | #### Let's make sure we don't screw that up with `h4` elements, either. 159 | 160 | Phew, with any luck we have styled the headings above this text and they look pretty good. 161 | 162 | Let's add a closing paragraph here so things end with a decently sized block of text. I can't explain why I want things to end that way but I have to assume it's because I think things will look weird or unbalanced if there is a heading too close to the end of the document. 163 | 164 | What I've written here is probably long enough, but adding this final sentence can't hurt. 165 | 166 | [^1]: This is a footnote. 167 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | <p align="center"> 2 | <a href="https://minimal-blog.lekoarts.de"> 3 | <img alt="LekoArts" src="https://img.lekoarts.de/gatsby/gatsby-site-illustration.png" /> 4 | </a> 5 | </p> 6 | <h1 align="center"> 7 | Gatsby Starter: Minimal Blog 8 | </h1> 9 | 10 | <p align="center"> 11 | <a href="https://github.com/LekoArts/gatsby-starter-minimal-blog/blob/master/LICENSE"> 12 | <img src="https://img.shields.io/badge/license-0BSD-blue.svg" alt="Minimal Blog is released under the 0BSD license." /> 13 | </a> 14 | <a href="https://github.com/sponsors/LekoArts"> 15 | <img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/LekoArts"> 16 | </a> 17 | <a href="https://www.lekoarts.de?utm_source=minimal-blog&utm_medium=Starter"> 18 | <img alt="Website" src="https://img.shields.io/badge/-website-blue"> 19 | </a> 20 | <a href="https://twitter.com/intent/follow?screen_name=lekoarts_de"> 21 | <img src="https://img.shields.io/twitter/follow/lekoarts_de.svg?label=Follow%20@lekoarts_de" alt="Follow @lekoarts_de" /> 22 | </a> 23 | </p> 24 | 25 | Typography driven, feature-rich blogging theme with minimal aesthetics. Includes tags/categories support and extensive features for code blocks such as live preview, line numbers, and line highlighting. Using the Gatsby Theme [`@lekoarts/gatsby-theme-minimal-blog`](https://github.com/LekoArts/gatsby-themes/tree/main/themes/gatsby-theme-minimal-blog). 26 | 27 | [**Demo Website**](https://minimal-blog.lekoarts.de) 28 | 29 | Also be sure to check out other [Free & Open Source Gatsby Themes](https://themes.lekoarts.de) and my [Personal Website](https://www.lekoarts.de?utm_source=minimal-blog&utm_medium=Starter). 30 | 31 | ## ✨ Features 32 | 33 | - MDX 34 | - Fully customizable through the usage of Gatsby Themes (and Theme UI) 35 | - Light Mode / Dark Mode 36 | - Typography driven, minimal style 37 | - Tags/Categories support 38 | - Code highlighting with [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer). Also allows adding line numbers, line highlighting, language tabs, and file titles. 39 | - RSS Feed for blog posts 40 | - SEO (Sitemap, OpenGraph tags, Twitter tags) 41 | - WebApp Manifest 42 | 43 | ## ⏱️ Quick Start 44 | 45 | Deploy this starter with one click on [Netlify](https://app.netlify.com/signup): 46 | 47 | [<img src="https://www.netlify.com/img/deploy/button.svg" alt="Deploy to Netlify" />](https://app.netlify.com/start/deploy?repository=https://github.com/LekoArts/gatsby-starter-minimal-blog) 48 | 49 | ## 🚀 Getting Started 50 | 51 | ### 1. **Create a Gatsby site.** 52 | 53 | Use the Gatsby CLI to clone the site and install dependencies: 54 | 55 | ```sh 56 | npx gatsby new gatsby-starter-minimal-blog https://github.com/LekoArts/gatsby-starter-minimal-blog 57 | ``` 58 | 59 | ### 2. **Navigate to your new project.** 60 | 61 | ```sh 62 | cd gatsby-starter-minimal-blog 63 | ``` 64 | 65 | ### 3. **Open the code and start customizing!** 66 | 67 | Start the site by running `npm run develop`. 68 | 69 | Your site is now running at `http://localhost:8000`! 70 | 71 | If you want to learn more about how you can use a Gatsby starter that is configured with a Gatsby theme, you can check out this [shorter](https://www.gatsbyjs.com/docs/how-to/plugins-and-themes/using-a-gatsby-theme/) or [longer](https://www.gatsbyjs.com/tutorial/using-a-theme/) tutorial. The tutorials don't exactly apply to this starter however the concepts are the same. 72 | 73 | ## 📝 Using and modifying this starter 74 | 75 | **Important Note:** Please read the guide [Shadowing in Gatsby Themes](https://www.gatsbyjs.com/docs/how-to/plugins-and-themes/shadowing/) to understand how to customize the underlying theme! 76 | 77 | This starter creates a new Gatsby site that installs and configures the theme [`@lekoarts/gatsby-theme-minimal-blog`](https://github.com/LekoArts/gatsby-themes/tree/main/themes/gatsby-theme-minimal-blog). 78 | 79 | Have a look at the theme's README and files to see what options are available and how you can shadow the various components including Theme UI. Generally speaking you will want to place your files into `src/@lekoarts/gatsby-theme-minimal-blog/` to shadow/override files. The Theme UI config can be configured by shadowing its files in `src/gatsby-plugin-theme-ui/`. 80 | 81 | ### Code Highlighting 82 | 83 | Since the underlying theme ships with [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer) certain additional features were added to code blocks. You can find an overview / usage example in the [example repository](https://github.com/LekoArts/gatsby-themes/tree/main/examples/minimal-blog/content/posts/fantastic-beasts-and-where-to-find-them/index.mdx)! If you want to change certain code styles or add additional language tabs, you need to shadow the file `src/@lekoarts/gatsby-theme-minimal-blog/styles/code.js`. 84 | 85 | **Language tabs:** 86 | 87 | When you add a language (such as e.g. `js` or `javascript`) to the code block, a little tab will appear at the top left corner. 88 | 89 | ```` 90 | ```js 91 | // code goes here 92 | ``` 93 | ```` 94 | 95 | **Code titles:** 96 | 97 | You can display a title (e.g. the file path) above the code block. 98 | 99 | ```` 100 | ```jsx title=your-title 101 | // code goes here 102 | ``` 103 | ```` 104 | 105 | Or without a specific language: 106 | 107 | ```` 108 | ```none title=your-title 109 | // code goes here 110 | ``` 111 | ```` 112 | 113 | **Line highlighting:** 114 | 115 | You can highlight single or multiple (or both) lines in a code block. You need to add a language. 116 | 117 | ```` 118 | ```js highlight=2,4-5 119 | const test = 3 120 | const foo = 'bar' 121 | const harry = 'potter' 122 | const hermione = 'granger' 123 | const ron = 'weasley' 124 | ``` 125 | ```` 126 | 127 | **Show line numbers:** 128 | 129 | If you want to show line numbers you can either globally enable them (see theme options) or on a block-by-block basis. You can also combine that with the other attributes. 130 | 131 | ```` 132 | ```js withLineNumbers 133 | // code goes here 134 | ``` 135 | ```` 136 | 137 | ### Adding content 138 | 139 | #### Adding a new blog post 140 | 141 | New blog posts will be shown on the index page (the three most recent ones) of this theme and on the blog overview page. They can be added by creating MDX files inside `content/posts`. General setup: 142 | 143 | 1. Create a new folder inside `content/posts` 144 | 1. Create a new `index.mdx` file, and add the frontmatter 145 | 1. Add images to the created folder (from step 1) you want to reference in your blog post 146 | 1. Reference an image as your `banner` in the frontmatter 147 | 1. Write your content below the frontmatter 148 | 1. Add a `slug` to the frontmatter to use a custom slug, e.g. `slug: "/my-slug"` (Optional) 149 | 1. Use `defer` to opt-in into Deferred Static Generation (DSG) (optional) 150 | 151 | **Frontmatter reference:** 152 | 153 | ```md 154 | --- 155 | title: Introduction to "Defence against the Dark Arts" 156 | date: 2019-11-07 157 | description: Defence Against the Dark Arts (abbreviated as DADA) is a subject taught at Hogwarts School of Witchcraft and Wizardry and Ilvermorny School of Witchcraft and Wizardry. 158 | defer: false 159 | tags: 160 | - Tutorial 161 | - Dark Arts 162 | banner: ./defence-against-the-dark-arts.jpg 163 | canonicalUrl: https://random-blog-about-curses.com/curses-counter-curses-and-more 164 | --- 165 | ``` 166 | 167 | **The fields `description`, `banner`, `defer` and `canonicalUrl` are optional!** If no description is provided, an excerpt of the blog post will be used. If no banner is provided, the default `siteImage` (from `siteMetadata`) is used. If no `canonicalUrl` is provided, it will not be included in the header. 168 | 169 | The `date` field has to be written in the format `YYYY-MM-DD`! 170 | 171 | #### Adding a new page 172 | 173 | Additional pages can be created by placing MDX files inside `contents/pages`, e.g. an "About" or "Contact" page. You'll manually need to link to those pages, for example by adding them to the navigation (in `siteMetadata`). General instructions: 174 | 175 | 1. Create a new folder inside `content/pages` 176 | 1. Create a new `index.mdx` file, and add the frontmatter 177 | 1. Write your content below the frontmatter 178 | 1. Optionally add files/images to the folder you want to reference from the page 179 | 1. Use `defer` to opt-in into Deferred Static Generation (DSG) (optional) 180 | 181 | **Frontmatter reference:** 182 | 183 | ```md 184 | --- 185 | title: About 186 | slug: "/about" 187 | defer: false 188 | --- 189 | ``` 190 | 191 | ### Changing the "Hero" text 192 | 193 | To edit the hero text ("Hi, I'm Lupin...), create a file at `src/@lekoarts/gatsby-theme-minimal-blog/texts/hero.mdx` to edit the text. 194 | 195 | ### Changing the "Projects" part 196 | 197 | To edit the projects part below "Latest posts", create a file at `src/@lekoarts/gatsby-theme-minimal-blog/texts/bottom.mdx` to edit the contents. 198 | 199 | ### Extending the footer of the post 200 | 201 | Inside the [`<Post />` component](https://github.com/LekoArts/gatsby-themes/blob/main/themes/gatsby-theme-minimal-blog/src/components/post.tsx) there's also a `<PostFooter />` component that you can shadow to display elements between the end of the post and the global footer. By default it returns `null`. Create a file at `src/@lekoarts/gatsby-theme-minimal-blog/components/post-footer.jsx` to edit this section. The `<PostFooter />` component receives the complete `post` prop that `<Post />` also receives. 202 | 203 | ### Change your `static` folder 204 | 205 | The `static` folder contains the icons, social media images and `robots.txt`. Don't forget to change these files, too! You can use [Real Favicon Generator](https://realfavicongenerator.net/) to generate the image files inside `static`. 206 | 207 | ## 🤔 Questions or problems? 208 | 209 | If you have general questions or need help with Gatsby, please go to one of the [support platforms](https://www.gatsbyjs.com/contributing/community/#where-to-get-support) mentioned in Gatsby's documentation. If you have a specific question about this project, you can head to the [GitHub Discussions](https://github.com/LekoArts/gatsby-themes/discussions) of the repository. 210 | 211 | ## 🎓 Learning Gatsby 212 | 213 | Looking for more guidance? Full documentation for Gatsby lives [on Gatsby's website](https://www.gatsbyjs.com/). 214 | 215 | ### Themes 216 | 217 | To learn more about Gatsby themes specifically, I recommend checking out the [theme docs](https://www.gatsbyjs.com/docs/themes/). 218 | 219 | ### General 220 | 221 | - **For most developers, I recommend starting with the [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.com/docs/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process. 222 | 223 | - **To dive straight into code samples, head [to Gatsby's documentation](https://www.gatsbyjs.com/docs/).** In particular, check out the _How-to Guides_ and _Reference_ items in the primary navigation. 224 | 225 | ## 🌟 Supporting me 226 | 227 | Thanks for using this project! I'm always interested in seeing what people do with my projects, so don't hesitate to tag me on [Twitter](https://twitter.com/lekoarts_de) and share the project with me. 228 | 229 | Please star this project, share it on Social Media or consider supporting me on [GitHub Sponsors](https://github.com/sponsors/LekoArts)! 230 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 1.3.16 4 | 5 | ### Patch Changes 6 | 7 | - [`409bba45`](https://github.com/LekoArts/gatsby-themes/commit/409bba451d8637d04de2efc8199fa662a2595c68) Thanks [@LekoArts](https://github.com/LekoArts)! - Remove link to my Patreon page. To simplify things I disabled my Patreon. If you want to support my OSS work, please consider using GitHub sponsors or Ko-fi. Thanks! 8 | 9 | - Updated dependencies [[`409bba45`](https://github.com/LekoArts/gatsby-themes/commit/409bba451d8637d04de2efc8199fa662a2595c68)]: 10 | - @lekoarts/gatsby-theme-minimal-blog@6.2.1 11 | 12 | ## 1.3.15 13 | 14 | ### Patch Changes 15 | 16 | - [#1116](https://github.com/LekoArts/gatsby-themes/pull/1116) [`cf7d5122`](https://github.com/LekoArts/gatsby-themes/commit/cf7d51223a73387f12cac490e2a42f068b0ded26) Thanks [@LekoArts](https://github.com/LekoArts)! - chore(deps): Various dependency updates 17 | 18 | - Updated dependencies [[`cf7d5122`](https://github.com/LekoArts/gatsby-themes/commit/cf7d51223a73387f12cac490e2a42f068b0ded26)]: 19 | - @lekoarts/gatsby-theme-minimal-blog@6.0.5 20 | 21 | ## 1.3.14 22 | 23 | ### Patch Changes 24 | 25 | - Updated dependencies [[`02872400`](https://github.com/LekoArts/gatsby-themes/commit/0287240022c308a7d1fcc8af348ee7d21bca0dd5)]: 26 | - @lekoarts/gatsby-theme-minimal-blog@6.0.0 27 | 28 | ## 1.3.13 29 | 30 | ### Patch Changes 31 | 32 | - Updated dependencies [[`ee969f3`](https://github.com/LekoArts/gatsby-themes/commit/ee969f30037fa99232292014431854773735d0a0)]: 33 | - @lekoarts/gatsby-theme-minimal-blog@5.0.0 34 | 35 | ## 1.3.12 36 | 37 | ### Patch Changes 38 | 39 | - Updated dependencies [[`1598dd6`](https://github.com/LekoArts/gatsby-themes/commit/1598dd660e3ba795b50c4aeb11550806e0b7b6ba)]: 40 | - @lekoarts/gatsby-theme-minimal-blog@4.0.0 41 | 42 | ## 1.3.11 43 | 44 | ### Patch Changes 45 | 46 | - Updated dependencies [[`1785dcf`](https://github.com/LekoArts/gatsby-themes/commit/1785dcfad131ab9270c401e6a3bb450f7cb01288)]: 47 | - @lekoarts/gatsby-theme-minimal-blog@3.0.0 48 | 49 | ## 1.3.10 50 | 51 | ### Patch Changes 52 | 53 | - [`716fde2`](https://github.com/LekoArts/gatsby-themes/commit/716fde287d20e80e834d451825b55af249e0168a) [#579](https://github.com/LekoArts/gatsby-themes/pull/579) Thanks [@LekoArts](https://github.com/LekoArts)! - chore: Add gatsby-plugin-gatsby-cloud to starters 54 | 55 | All notable changes to this project will be documented in this file. 56 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 57 | 58 | ## [1.3.9](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.8...minimal-blog@1.3.9) (2020-11-11) 59 | 60 | **Note:** Version bump only for package minimal-blog 61 | 62 | ## [1.3.8](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.7...minimal-blog@1.3.8) (2020-11-04) 63 | 64 | **Note:** Version bump only for package minimal-blog 65 | 66 | ## [1.3.7](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.6...minimal-blog@1.3.7) (2020-11-02) 67 | 68 | **Note:** Version bump only for package minimal-blog 69 | 70 | ## [1.3.6](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.5...minimal-blog@1.3.6) (2020-11-01) 71 | 72 | **Note:** Version bump only for package minimal-blog 73 | 74 | ## [1.3.5](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.4...minimal-blog@1.3.5) (2020-10-25) 75 | 76 | **Note:** Version bump only for package minimal-blog 77 | 78 | ## [1.3.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.3...minimal-blog@1.3.4) (2020-10-25) 79 | 80 | **Note:** Version bump only for package minimal-blog 81 | 82 | ## [1.3.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.2...minimal-blog@1.3.3) (2020-10-25) 83 | 84 | **Note:** Version bump only for package minimal-blog 85 | 86 | ## [1.3.2](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.1...minimal-blog@1.3.2) (2020-10-10) 87 | 88 | **Note:** Version bump only for package minimal-blog 89 | 90 | ## [1.3.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.3.0...minimal-blog@1.3.1) (2020-09-25) 91 | 92 | **Note:** Version bump only for package minimal-blog 93 | 94 | # [1.3.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.7...minimal-blog@1.3.0) (2020-09-25) 95 | 96 | ### Features 97 | 98 | - **minimal-blog:** Add Canonical URL support ([#494](https://github.com/LekoArts/gatsby-themes/issues/494)) ([0e9d7ac](https://github.com/LekoArts/gatsby-themes/commit/0e9d7ac04fdf9a7d30cca8c7ccf7565d3955502f)) 99 | 100 | ## [1.2.7](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.6...minimal-blog@1.2.7) (2020-09-25) 101 | 102 | **Note:** Version bump only for package minimal-blog 103 | 104 | ## [1.2.6](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.5...minimal-blog@1.2.6) (2020-09-16) 105 | 106 | **Note:** Version bump only for package minimal-blog 107 | 108 | ## [1.2.5](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.4...minimal-blog@1.2.5) (2020-09-10) 109 | 110 | **Note:** Version bump only for package minimal-blog 111 | 112 | ## [1.2.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.3...minimal-blog@1.2.4) (2020-08-28) 113 | 114 | **Note:** Version bump only for package minimal-blog 115 | 116 | ## [1.2.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.2...minimal-blog@1.2.3) (2020-08-27) 117 | 118 | **Note:** Version bump only for package minimal-blog 119 | 120 | ## [1.2.2](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.1...minimal-blog@1.2.2) (2020-08-27) 121 | 122 | **Note:** Version bump only for package minimal-blog 123 | 124 | ## [1.2.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.2.0...minimal-blog@1.2.1) (2020-08-27) 125 | 126 | **Note:** Version bump only for package minimal-blog 127 | 128 | # [1.2.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.13...minimal-blog@1.2.0) (2020-07-09) 129 | 130 | ### Bug Fixes 131 | 132 | - **minimal-blog:** Use function for SpotifyPlayer example component ([bd2c343](https://github.com/LekoArts/gatsby-themes/commit/bd2c343580c041383a98822de2c622a7d944d93d)) 133 | 134 | ### Features 135 | 136 | - Add bundle-analyzer and lazy-load react-live ([#450](https://github.com/LekoArts/gatsby-themes/issues/450)) ([667fd33](https://github.com/LekoArts/gatsby-themes/commit/667fd33ce6af546cf2250af1e22395a26f45d6a2)) 137 | 138 | ## [1.1.13](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.12...minimal-blog@1.1.13) (2020-07-09) 139 | 140 | **Note:** Version bump only for package minimal-blog 141 | 142 | ## [1.1.12](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.11...minimal-blog@1.1.12) (2020-07-04) 143 | 144 | **Note:** Version bump only for package minimal-blog 145 | 146 | ## [1.1.11](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.10...minimal-blog@1.1.11) (2020-07-03) 147 | 148 | **Note:** Version bump only for package minimal-blog 149 | 150 | ## [1.1.10](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.9...minimal-blog@1.1.10) (2020-07-02) 151 | 152 | **Note:** Version bump only for package minimal-blog 153 | 154 | ## [1.1.9](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.8...minimal-blog@1.1.9) (2020-06-11) 155 | 156 | ### Bug Fixes 157 | 158 | - Normalize CSS in themes & examples ([#422](https://github.com/LekoArts/gatsby-themes/issues/422)) ([9a2600c](https://github.com/LekoArts/gatsby-themes/commit/9a2600cc45d0f6729799183116f1b87d3c943749)) 159 | 160 | ## [1.1.8](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.7...minimal-blog@1.1.8) (2020-06-11) 161 | 162 | ### Bug Fixes 163 | 164 | - **gatsby-theme-minimal-blog:** font-size on mobile iOS ([#421](https://github.com/LekoArts/gatsby-themes/issues/421)) ([ab65ecc](https://github.com/LekoArts/gatsby-themes/commit/ab65ecceaabefc0f2f77c6f9602280a7214c34d1)) 165 | 166 | ## [1.1.7](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.6...minimal-blog@1.1.7) (2020-06-08) 167 | 168 | **Note:** Version bump only for package minimal-blog 169 | 170 | ## [1.1.6](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.5...minimal-blog@1.1.6) (2020-05-29) 171 | 172 | **Note:** Version bump only for package minimal-blog 173 | 174 | ## [1.1.5](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.4...minimal-blog@1.1.5) (2020-05-12) 175 | 176 | **Note:** Version bump only for package minimal-blog 177 | 178 | ## [1.1.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.3...minimal-blog@1.1.4) (2020-05-04) 179 | 180 | **Note:** Version bump only for package minimal-blog 181 | 182 | ## [1.1.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.2...minimal-blog@1.1.3) (2020-05-02) 183 | 184 | **Note:** Version bump only for package minimal-blog 185 | 186 | ## [1.1.2](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.1...minimal-blog@1.1.2) (2020-05-02) 187 | 188 | **Note:** Version bump only for package minimal-blog 189 | 190 | ## [1.1.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.1.0...minimal-blog@1.1.1) (2020-04-28) 191 | 192 | **Note:** Version bump only for package minimal-blog 193 | 194 | # [1.1.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.17...minimal-blog@1.1.0) (2020-04-27) 195 | 196 | ### Features 197 | 198 | - Update theme-ui to v0.3.x ([#371](https://github.com/LekoArts/gatsby-themes/issues/371)) ([67a05ac](https://github.com/LekoArts/gatsby-themes/commit/67a05ac3e1deaddfe38591739e7f50f56d49d109)), closes [/theme-ui.com/migrating#v03](https://github.com//theme-ui.com/migrating/issues/v03) [#262](https://github.com/LekoArts/gatsby-themes/issues/262) 199 | 200 | ## [1.0.17](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.16...minimal-blog@1.0.17) (2020-04-24) 201 | 202 | **Note:** Version bump only for package minimal-blog 203 | 204 | ## [1.0.16](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.15...minimal-blog@1.0.16) (2020-04-24) 205 | 206 | **Note:** Version bump only for package minimal-blog 207 | 208 | ## [1.0.15](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.14...minimal-blog@1.0.15) (2020-04-13) 209 | 210 | **Note:** Version bump only for package minimal-blog 211 | 212 | ## [1.0.14](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.13...minimal-blog@1.0.14) (2020-04-13) 213 | 214 | **Note:** Version bump only for package minimal-blog 215 | 216 | ## [1.0.13](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.12...minimal-blog@1.0.13) (2020-04-12) 217 | 218 | **Note:** Version bump only for package minimal-blog 219 | 220 | ## [1.0.12](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.11...minimal-blog@1.0.12) (2020-04-12) 221 | 222 | **Note:** Version bump only for package minimal-blog 223 | 224 | ## [1.0.11](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.10...minimal-blog@1.0.11) (2020-04-12) 225 | 226 | **Note:** Version bump only for package minimal-blog 227 | 228 | ## [1.0.10](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.9...minimal-blog@1.0.10) (2020-04-01) 229 | 230 | **Note:** Version bump only for package minimal-blog 231 | 232 | ## [1.0.9](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.8...minimal-blog@1.0.9) (2020-03-31) 233 | 234 | **Note:** Version bump only for package minimal-blog 235 | 236 | ## [1.0.8](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.7...minimal-blog@1.0.8) (2020-03-04) 237 | 238 | **Note:** Version bump only for package minimal-blog 239 | 240 | ## [1.0.7](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.6...minimal-blog@1.0.7) (2020-03-04) 241 | 242 | **Note:** Version bump only for package minimal-blog 243 | 244 | ## [1.0.6](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.5...minimal-blog@1.0.6) (2020-02-29) 245 | 246 | **Note:** Version bump only for package minimal-blog 247 | 248 | ## [1.0.5](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.4...minimal-blog@1.0.5) (2020-02-29) 249 | 250 | ### Bug Fixes 251 | 252 | - Add table styles to minimal-blog ([6e3d750](https://github.com/LekoArts/gatsby-themes/commit/6e3d750b01d0398fc2dd5b3d043754389a0f46ff)) 253 | 254 | ## [1.0.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.3...minimal-blog@1.0.4) (2020-02-27) 255 | 256 | **Note:** Version bump only for package minimal-blog 257 | 258 | ## [1.0.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.2...minimal-blog@1.0.3) (2020-02-27) 259 | 260 | **Note:** Version bump only for package minimal-blog 261 | 262 | ## [1.0.2](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.1...minimal-blog@1.0.2) (2020-02-16) 263 | 264 | **Note:** Version bump only for package minimal-blog 265 | 266 | ## [1.0.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@1.0.0...minimal-blog@1.0.1) (2020-01-23) 267 | 268 | **Note:** Version bump only for package minimal-blog 269 | 270 | # [1.0.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.2.1...minimal-blog@1.0.0) (2020-01-23) 271 | 272 | ### Features 273 | 274 | - Change config format on minimal-blog theme ([#234](https://github.com/LekoArts/gatsby-themes/issues/234)) ([bdeb670](https://github.com/LekoArts/gatsby-themes/commit/bdeb670797da5faa2d4084c3c128f0e38dbbf582)) 275 | 276 | ### BREAKING CHANGES 277 | 278 | - The navigation and externalLinks options are no longer on the siteMetadata but now in the theme options itself. 279 | 280 | ## [0.2.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.2.0...minimal-blog@0.2.1) (2020-01-17) 281 | 282 | **Note:** Version bump only for package minimal-blog 283 | 284 | # [0.2.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.8...minimal-blog@0.2.0) (2020-01-07) 285 | 286 | ### Features 287 | 288 | - **gatsby-theme-minimal-blog-core:** Custom slug for blog posts via frontmatter ([05cff1e](https://github.com/LekoArts/gatsby-themes/commit/05cff1ec0bcd2ba2fb3b7cfbb8a55f626ab9abd8)), closes [#217](https://github.com/LekoArts/gatsby-themes/issues/217) 289 | 290 | ## [0.1.8](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.7...minimal-blog@0.1.8) (2020-01-06) 291 | 292 | ### Bug Fixes 293 | 294 | - **gatsby-theme-minimal-blog:** Styling fixes ([240571e](https://github.com/LekoArts/gatsby-themes/commit/240571e39a4b12d6b6585c89062579dd2dc03a0f)) 295 | 296 | ## [0.1.7](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.6...minimal-blog@0.1.7) (2020-01-04) 297 | 298 | **Note:** Version bump only for package minimal-blog 299 | 300 | ## [0.1.6](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.5...minimal-blog@0.1.6) (2020-01-03) 301 | 302 | **Note:** Version bump only for package minimal-blog 303 | 304 | ## [0.1.5](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.4...minimal-blog@0.1.5) (2019-12-31) 305 | 306 | **Note:** Version bump only for package minimal-blog 307 | 308 | ## [0.1.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.3...minimal-blog@0.1.4) (2019-12-03) 309 | 310 | **Note:** Version bump only for package minimal-blog 311 | 312 | ## [0.1.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.2...minimal-blog@0.1.3) (2019-12-01) 313 | 314 | **Note:** Version bump only for package minimal-blog 315 | 316 | ## [0.1.2](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.1...minimal-blog@0.1.2) (2019-11-27) 317 | 318 | **Note:** Version bump only for package minimal-blog 319 | 320 | ## [0.1.1](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.1.0...minimal-blog@0.1.1) (2019-11-26) 321 | 322 | **Note:** Version bump only for package minimal-blog 323 | 324 | # [0.1.0](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.0.4...minimal-blog@0.1.0) (2019-11-25) 325 | 326 | ### Features 327 | 328 | - **gatsby-theme-minimal-blog:** Lazy load code component ([#167](https://github.com/LekoArts/gatsby-themes/issues/167)) ([fbfedee](https://github.com/LekoArts/gatsby-themes/commit/fbfedee5988636d2e4a3a2ea817e8bdf8628d4f5)), closes [#161](https://github.com/LekoArts/gatsby-themes/issues/161) [#163](https://github.com/LekoArts/gatsby-themes/issues/163) [#164](https://github.com/LekoArts/gatsby-themes/issues/164) [#165](https://github.com/LekoArts/gatsby-themes/issues/165) [#166](https://github.com/LekoArts/gatsby-themes/issues/166) 329 | 330 | ## [0.0.4](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.0.3...minimal-blog@0.0.4) (2019-11-16) 331 | 332 | **Note:** Version bump only for package minimal-blog 333 | 334 | ## [0.0.3](https://github.com/LekoArts/gatsby-themes/compare/minimal-blog@0.0.2...minimal-blog@0.0.3) (2019-11-16) 335 | 336 | **Note:** Version bump only for package minimal-blog 337 | 338 | ## 0.0.2 (2019-11-16) 339 | 340 | ### Features 341 | 342 | - Add gatsby-theme-minimal-blog ([#151](https://github.com/LekoArts/gatsby-themes/issues/151)) ([344a52c](https://github.com/LekoArts/gatsby-themes/commit/344a52c)) 343 | -------------------------------------------------------------------------------- /content/posts/hiring/Hiring at startups.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: A delightfully unstructured guide to hiring 3 | date: 2019-11-07 4 | description: A winding thought dump on hiring at startups. More of a repository than anything. 5 | defer: false 6 | tags: 7 | - Hiring 8 | - Scaleups 9 | canonicalUrl: https://xx 10 | --- 11 | 12 | Hiring at scale ups is a unique beast. You never have enough money to offer people. You never know truly if you should be hiring. The advice is conflicting - don't hire too early! Hire people who have done it before! Hire generalists! Hire specialists! Don't go for big companies! 13 | 14 | My over-arching principles, having fucked up enough times 15 | - Hire later than you think. Always have an org chart with vacancies that you challenge often 16 | - Everyone you hire should be 50% better than the people you have 17 | - Optimise for agency & outcome 18 | - Sell sell sell - find the way of getting the top 10% of talent, this will not be easy 19 | 20 | This is a bit of a thought dump, that will continue to evolve. Feel free to send feedback directly to me. I'll continue to fractal the doc out, with more detailed guides or thought dumps 21 | 22 | ## Hiring new peeps 23 | Smart and Street define an A player as “a candidate who has at least a 90 percent chance of achieving a set of outcomes that only the top 10 percent of possible candidates could achieve. We only want A-Players most of the time. 24 | 25 | “Every person hired should be better than 50 percent of those currently in similar roles.” - Amazon 26 | 27 | My version of the interview process to find A-Players looks a bit like this 28 | 29 | ![Hiring](./hiring-1.png) 30 | Roughly 31 | 1. Define the JD and competencies with surgical precision, sell the need internally 32 | 2. Find the candidates, work out your unfair advantage to fill top of the funnel 33 | 3. Run 4 interviews + references to select. One extra technical interview with best-in-class, use a contractor if needed 34 | 4. Close the buggers 35 | 5. Onboard smoothly, get them stoked 36 | 37 | If it's a technical role you haven't hired before, then find someone you trust to do a final stage. 38 | 39 | Clearbit say: 40 | 41 | One hire should require approximately 20 - 50 phone screens and approximately 50 hours of investment from Clearbit. This does not include sourcing candidates! For each stage of the screening process, excluding sourcing: 42 | 43 | 35 candidates * 0.5 hours = 18 hours 44 | 5.5 candidates * 2 hours = 11 hours 45 | 2.5 candidates * 3 hours = 8 hours 46 | 2 candidates * 4 hours = 8 hours 47 | 1.5 candidates * 5 hours = 7.5 hours 48 | 49 | 50 | I'm going to go through each stage, based on entirely how I do this. Remember, finding and persuading people to join your dream is as important as anything you’ll do- if you can’t persuade people you’ll pay it’s gonna be a long road persuading people to pay you… 51 | 52 | ## Writing the JD and internal proposal 53 | 54 | Don't rush this y'all. If this is a two page monstrosity copied off monster.com you will get shit applicants. Do you know exactly what the role is? Don't worry if there's uncertainty - you at least need to be clear about the uncertainty if that's the case. It's rare you won't know what they need to do in the first six months - focus on that. 55 | 56 | My version of this is: 57 | - The impact you will have and what success looks like in the first 6+ months. 58 | - The skills you need to be great at this job and will be evaluated on. 59 | - This is what we value. 60 | 61 | Try to avoid a dry list of all the day to day stuff. If you feel comfortable sharing actual KPIs and where they should be, do it. 62 | 63 | How do we do this? 64 | - Collect similar JDs from competitors as inspiration 65 | - Brainstorming 10-12 competencies that would make someone shine in that particular role — like analytical skills, relationship-building stakeholder management skills and proactivity. Narrow that list down to five competencies, which will be included in the job description and will serve as the basis of their hiring process. These should line up with evaluating performance. 66 | 67 | The job description is your first pitch to potential hires. Think about tone of voice, sincerity etc. Don't sound like a corporate drone 68 | 69 | _what are the strongest predictors of future job performance?_ 70 | 71 | Useful links 72 | - https://www.notion.so/templates/job-description-repository?ref=review.firstround.com 73 | - https://hbr.org/2020/03/write-a-job-description-that-attracts-the-right-candidate 74 | 75 | ## Finding the talent 76 | 77 | 1. Referrals from Your Professional and Personal Networks. Create a list of the ten most talented people you know and commit to speaking with at least one of them per week for the next ten weeks. At the end of each conversation, ask, “Who are the most talented people you know?” Continue to build your list and continue to talk with at least one person per week.  78 | 79 | 2. Referrals from Your Employees. Add sourcing as an outcome on every scorecard for your team. For example, “Source five A Players per year who pass our phone screen.” Encourage your employees to ask people in their networks, “Who are the most talented people you know whom we should hire?” Offer a referral bonus. Can also go further and do it for second order contacts, or even add it to the JD. Needs to be punchy enough - I've used £100 for passing phone screen, and £1,000 if they make it through probation. Be careful about unintended consequences here - ie pressurising hiring managers. 80 | 81 | 3. Hiring Recruiters. Use the method described in this book to identity and hire A Player recruiters. Build a scorecard for your recruiting needs, and hold the recruiters you hire accountable for the items on that scorecard. Invest time to ensure the recruiters understand your business and culture. 82 | 83 | 4. Networks - try to get people posting in communities e.g. Operations Nation, Brand Hackers 84 | 85 | 5. Cold outreach - just get yourself out there. Linkedin messaging. Make sure you've shared the post on Linkedin, get people to repost it and also get the brand to repost it. Leverage senior people too - a message from the GM or CEO will probaby get a response... 86 | 87 | There's a great [Presentation](https://drive.google.com/file/d/13QyEIy3iidWxRNIFUd94W7cqz-8E0BTS/view) by Aline Lerner that I'll summarise in a separate post - but cold outreach is hard, but important. 88 | 89 | **Linked in Recruiter** 90 | Pay for Linkedin Recruiter. Ideally give hiring managers access, as much better coming from them than talent team. Have a quick session on how to use it effectively, leverage account managers. Look at competitors, and think about typical archetypes for where success has come from. 91 | 92 | E.g. for growth managers, I noticed that a lot of managers came from social agency side, so I created a list of all London based agencies, and used as filter words. 93 | 94 | **For outbound candidates:** When you contact prospective candidates, think of it like a cold outreach sales email. Why should they care? A great person will be getting all sorts of emails like this. Start with why you care about them, and the benefit for them. Try to tie it into something they've written, or done. The more senior the person writing the email the better. 95 | 96 | Keep it short. The longer it is, the more desperate you can look, and the more power you give up. Aim to keep your message shorter than 150 words. Copy wise - use you or your. Better say - your skills are perfect for doing xx. Don;t bother with a long intro for you, unless it's to highlight some overlap/ connection. Don't be generic on compliments ("I'm impressed"). 97 | 98 | **For inbound candidates:** “When you get resumes or emails about jobs, you should have a 100% response rate. You really should. There's no excuse when somebody takes the time to reach out to your company for not taking the time to respond,” Feng says. Your messages can be very simple, just a couple of lines even. But if recruiting is sales, then your response rates should be as consistent as your sales reps.’ 99 | 100 | **Other tips and tricks** 101 | I've found that actually keeping a top of funnel healthy for key positions can reap dividends. Finding essays to send, keeping Linkedin messages or doing coffees regularly can make it easier down the road when you need to grow fast. This does get hard though at scale :) 102 | 103 | You can also be quite cheeky when you're a startup and heavily flatter people. Asking slightly more senior people for feedback on the JD and the org can either unlock them as a candidate, or they may start recommending people they know. Either way is a win! 104 | 105 | **Employee Branding** 106 | This warrants an entire other post, as Getir did not do this well. The approach also differs massively between different types of roles. E.g. engineers love a good technical blog, or presence at events. Glassdoor can be important. Employee engagement is key here. It's a huge topic, and very hard to fix if it's broken. You can still hire well if this is fucked, but by god it's hard & you'll have to often over-pay. 107 | 108 | Remember the classic Steve Jobs quote "A players hire A players, but B players hire C players and C players hire D players. It doesn’t take long to get to Z players. The trickle-down effect causes bozo explosions in companies." Quality compounds. 109 | 110 | On a more pragmatic note, make sure your Linkedin page is updated and there are regular posts. Think about events, conferences, videos. Be VISIBLE 111 | 112 | One way of thinking about this is - what is our unfair advantage that allows us to get better talent for less money? There are two: 113 | - I value different things to the market 114 | - Some small subset of the market values me more than competitors 115 | 116 | On the first one (which sounds a bit weird), there's a great (TW very technical) piece by [Erik B](https://erikbern.com/2020/01/13/how-to-hire-smarter-than-the-market-a-toy-model.html) which boils down very simply to the idea that "if companies are systematically putting a premium on something, then bet against them!... I'm not saying you should think of it as a bad thing that someone is coming from a fancy school. Everything else equals, it's typically a good thing! What I'm saying is that if you're hiring, then you will be _more successful going after candidates that the market undervalues._" 117 | 118 | ![[Pasted image 20240403144051.png]] 119 | 120 | This can be focussing on people that didn't go to fancy schools, need a visa, are under-represented, post family breaks etc. 121 | 122 | On the second point, you should treat it like your customer brand. Much like a startup in its early days needs to find a wedge and focus on a key customer persona, there is value in doing the same with employees. Whether it's creating a cult-like atmosphere that attracts certain types, a mission that people buy in to, an equity process that promises wealth, an unusual application process - ideally you don't just be meh. Sometimes it can just be a super-personable founder selling. 123 | 124 | [TO be written - ATS setup, Linkedin jobs, boosting roles, referral schemes] 125 | 126 | Right, so you have the top-of-the funnel sorted 127 | 128 | Now you need to filter. 129 | 130 | If this is a new role for you to hire for, or are relatively new to hiring, then the first thing you need to do is a) speak to as many applicants as you can and b) speak to the best people in the industry. This is a relatively unique problem for startups and scale ups and not one I’ve seen addressed honestly much. 131 | 132 | A) you need to dial in to who’s in the market and get your eye in. You don’t want to be hiring the first alright person you meet. You also don’t want to be slow, so tee up the first 20 people quickly and put the time aside. This will be hard. Don’t skip it. Just chat to everyone as the first interviewer with a relatively open mind. Take copious notes. Stop after 20 and test if your standards/ competencies/ JD is correct 133 | 134 | B)do you know what good looks like? If you’re in a startup and not hiring a job you’ve done before, probably not. URGENTLY use your network to find the best 5 people in industry you have access to and have coffee. Calibrate yourself. If you can get them to help with a 15 min chat on a candidate, or to do an interview for you and with you on the call that’s great 135 | 136 | # 2 The Interview 137 | ## 2a Screening Interviews 138 | 139 | Short, phone-based interview designed to clear out B and C Players from your roster of candidates as quickly as possible. Typical questions: 140 | - What are your career goals?  141 | - What are you really good at professionally?  142 | - What are you not good at or interested in doing professionally?  143 | - Who were your last five bosses, and how will they each rate your performance on a 1–10 scale when we talk to them?  144 | - Check availability and RTW? 145 | - Why do you want to join Getir? 146 | - What do yo know about Getir? (Wouldn’t expect them to have tried, but some research important) 147 | - Ask 2-3 hygiene competency questions according to scorecard and check if min standard/ has experience 148 | 149 | Review the scorecard before the call to refresh your memory. Then begin the call by setting expectations, saying something like this: “I am really looking forward to our time together. Here’s what I’d like to do. I’d like to spend the first twenty minutes of our call getting to know you. After that, I am happy to answer any questions you have so you can get to know us. Sound good?” Make sure to leave at least 10 min at the end. 150 | 151 | If it's a talent manager then mostly about suitability. If a hiring manager, I like to try and push to see how intellectually curious they are - if I can push them and have a fun convo on something then that's a good sign. 152 | 153 | Go through and immediately reject any absolute no-gos. It's easier that way, and keep your pipeline clean. Rather oddly, I like to have a physical line in my notebook with no on the left and rockstar on the right. I put an x at the beginning, and then scribble arrows on the axis through the chat with garbled notes on why it moves. Quite often I start on the left and then have huge jumps through the discussion. 154 | 155 | Take detailed notes here, and think about how to feed them through. Take care not to miss people here who don't fit your perfect profile but shine through, or even might be suitable for another role. It's best to prime talent team to also pass on anyone that just seems awesome, or spiky in some dimension, even if it doesn't fit the bill. 156 | 157 | ## Why Structured Interviews? 158 | 159 | What are the strongest predictors of future job performance? Lots of reviews to say interviews are pretty crap at this!  160 | 161 | We should try to pick interviews that are proxies that have _little correlation with each other to reduce the aggregate error. The main remedy is to have a structured interview process that ask different things (or test the same things in different ways) 162 | 163 | Best way is three interviews  164 | 165 | - ‘Who’ interviews - run through of CV, digging deep 166 | - ‘Focus’ (competency interview) 167 | - Technical case study interview (prepared and in-session) 168 | 169 | The pre-thinking on the questions, the scorecard, the outcomes, means you ask the right questions at the right time, and reduce the noise in your approach 170 | 171 | I loved this from [Erik at Modal again](https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem) that posits interviewing as a noisy prediction problem. "_knowing who's going to be good at their job_ is an _extremely hard problem._ The correlation between who _did really well in the interview process_ and who _performs really well at work_ is really weak... I've started thinking about this process as inherent noise reduction problem. Interviewing should be thought of as information gathering." 172 | 173 | 1. Intelligence tests seem to be the strongest predictors of job performance (although possibly offensive, and probably [illegal in the US](https://en.wikipedia.org/wiki/Griggs_v._Duke_Power_Co.)) 174 | 2. … followed by structured interviews 175 | 3. … followed by unstructured interviews (which have very little predictive power). 176 | 177 | The second big suggestion Erik has, is to make your interviews have little correlation with each other, to decrease your aggregate error. Given how hard it is to work out what type of interview or task predicts future job behaviour, you should try and cover a lot. 178 | 179 | Third interesting point (which should really go in a separate section) is that Google can hire for the Expected value, so can be more risky, whereas a startup - where a bad hire can be much worse, needs to cover more topics and be more cautious 180 | 181 | He also references that structured interviews help avoid confirmation bias - there's a tendency to go easier on people you get on with. I think this is very true. Especially if you are bulk interviewing you often enter a fugue-like state, and it's easy to get lazy. 182 | 183 | BCG was the extreme version of this approach. It was essentially a huge sausage machine of an interview process, and significant effort put into checking data on who did best, even down to who's scores were most predictive. I was bang in the middle, in case you're wondering. Disappointing really. 184 | 185 | ## The Who Interview 186 | 187 | Unveil patterns in a candidate’s career history. It is the most reliable predictor of performance that consists in a chronological walkthrough of a person’s career.  188 | 189 | Typical questions 190 | 191 | 1. What were you hired to do? 192 | 2. What accomplishments are you most proud of? 193 | 3. What were some low points during that job? 194 | 4. Who were the people you worked with? 195 | 5. Why did you leave that job? 196 | 6. How would you rate the team you inherited on an A, B, C scale? What changes did you make? Did you hire anybody? Fire anybody? How would you rate the team when you left it on an A, B, C scale? 197 | 7. What are your biggest accomplishments in this area (choose a competency) during your career? 198 | 8. What are your insights into your biggest mistakes and lessons learned in this area? 199 | 9. Why did you move from x to y? What was your mindset at that point? 200 | 201 | Interrupting — You have to interrupt the candidate. DON’T say, “Wait, wait, wait. Let me stop you there. Can we get back on track?” DO smile broadly, match their enthusiasm level, and use reflective listening to get them to stop talking without demoralising them. 202 | 203 | The Three P’s — The three P’s are questions you can use to clarify how valuable an accomplishment was in any context. The questions are: (1) How did your performance compare to the previous year’s performance? (2) How did your performance compare to the plan? (3) How did your performance compare to that of peers? 204 | 205 | Push Versus Pull — People who perform well are generally pulled to greater opportunities. People who perform poorly are often pushed out of their jobs. Do not hire anybody who has been pushed out of 20 percent or more of their jobs. Push: “It was mutual.” “It was time for me to leave.” “My role shrank.” Etc. Pull: “My biggest client hired me.” “My old boss recruited me to a bigger job.” “The CEO asked me to take a double promotion.” Etc. 206 | 207 | ## The Focussed Interview 208 | 209 | 3 . The focused interview is meant to gather additional specific information about the candidate. It focuses on one (or several) of the outcomes and competencies on the scorecard: 210 | 211 | - What were your biggest accomplishments in this area? 212 | - What are your insights into your biggest mistakes and lessons learned in this area? 213 | - 1. The purpose of this interview is to talk about ______ (Fill in the blank with a specific outcome or competency such as the person’s experience selling to new customers, building and leading a team, creating strategic plans, acting aggressively and persistently, etc.)  214 | 215 | After each answer, the interviewer should get curious and ask What? How? Tell me more! 216 | 217 | - I find questions like “what are your weaknesses” or “what is your superpower” to be silly. A good answer just means the candidate is verbal and can ramble on the spot. It favors verbal extroverted people without reflecting on their actual skills. 218 | 219 | Best Practice says 3 45min interviews here. I think this is overkill. Ideally 1 45 min interview, and then 15 minutes at the end of the other two technical sessions. 220 | 221 | Personally I like to focus on AGENCY, SMARTS & TEAMWORK as the main lot 222 | 223 | **[https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem](https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem)** 224 | 225 | I would say you could do 1 and cover 2-3 competencies 226 | 227 | **** 228 | 229 | ## Technical Interviews/ Case studies 230 | 231 | For roles requiring technical speciality, important to check specific skills and proven experience. At Getir, we do this through a case study, linked to the scoreboard.  232 | 233 | For most roles, this will require  234 | 235 | - Structuring (problem solving) 236 | - Analysis - mostly in Excel, or SQL/Python if more technical 237 | - Presenting back 238 | 239 | The homework should take 2-3 hours maximum to complete. You only have 45 min to chat, so keep it short. 240 | 241 | In the session, you should throw in one curve ball to test adaptability and double check it wasn’t someone else helping them ;)  242 | 243 | [Let’s build up a repository] 244 | 245 | If you’re trying to find someone technical and you’re not, you need to find a way of testing that. You might bring someone in, or lean heavily on references or referrals. 246 | 247 | ** 248 | Consider this framing for designing a practical exercise: What type of skill do you not want to teach to a person you hire for this job? 249 | 250 | ## Making the decision 251 | ** 252 | 253 | - Ideally interview everyone, input scores separately, then sit down in a group & discuss 254 | - Try and plot people on a Skill- Will graph - are they capable of doing the job according to the scorecard, and do they bring the right competencies? 255 | - When you believe there is a 90 percent or better chance the candidate can achieve an outcome based on the data you gathered during the interview, rate him or her an A for that outcome. B 70%, C 50%.  256 | - Next do the same for the competencies 257 | 258 | "https://twitter.com/sama/status/792823320441786368?lang=en" 259 | ![[Pasted image 20240403095336.png]] 260 | 261 | You are looking for an attitude and perspective that will improve your team. Someone that will add something this is missing from your current team. you should never hire to fill the role. A lot of weak hires are from when a candidate doesn’t have any obvious issues. They seem pleasant enough, and people don’t see any reason why they shouldn’t hire them. But they didn’t wow anyone. Reject non A-Players 262 | 263 | 264 | Red flags from candidates 265 | - Basic facts change between interviews 266 | - When the candidate does not mention past failures 267 | - When the candidate speaks badly of previous bosses 268 | - When the candidate cannot explain his / her job moves 269 | - When the candidate blames others for his / her lack of success in something 270 | - Candidate never used your product, or looked at website( more and more important as the process contjnues) 271 | - Candidate exaggerates his or her answers.   272 | - Candidate takes credit for the work of others   273 | - For managerial hires, candidate has never had to hire or fire anybody.   274 | - Candidate seems more interested in compensation and benefits than in the job itself.  275 | - Candidate tries too hard to look like an expert   276 | - Candidate is self-absorbed. 277 | 278 | ## Typical mistakes 279 | 280 | Typical errors that happen by an interviewer 281 | 282 | - Are unclear about what’s needed in a job, or dishonest about the fluidity 283 | - Have a weak flow of candidates; complaining about quality without thinking abour top of funnel 284 | - Do not trust their ability to pick out the right candidate from a group of similar-looking candidates; 285 | - Lose candidates they really want to join their team. 286 | - Hiring the B/C player because of speed/ need 287 | - Not going quick enough - either to start hiring, to make decisions, or to close them out- linked is just not being organised or on top of people 288 | - 289 | 290 | 291 | 292 | ## Typical screw ups with interviewing 293 | 294 | 1. The Art Critic — Hiring people based on gut instinct 295 | 2. The Sponge — A common approach among busy managers is to let everybody interview a candidate, with the risk of interviewers asking candidates exactly the same questions. 296 | 3. The Prosecutor — Many managers act like the prosecutors they see on TV and aggressively question candidates, attempting to trip them up with trick questions and logic problems. 297 | 4. The Suitor — Rather than rigorously interviewing a candidate, some managers spend all of their energy selling the applicant on the opportunity. Suitors are more concerned with impressing than assessing their capabilities. 298 | 5. The Trickster — Then there are the interviewers who use gimmicks to test for certain behaviours. They might throw a wad of paper on the floor, for example, to see if a candidate is willing to clean it up. 299 | 6. The Animal Lover — Many managers hold on stubbornly to their favourite pet questions — questions they think will reveal something uniquely important about a candidate. 300 | 7. The Chatterbox — This technique has a lot in common with the “la-di-da” interview. The conversation usually goes something like this: “How about them Yankees! Man, the weather is rough this time of year. You grew up in California? So did I!” 301 | 8. The Psychological and Personality Tester — Asking a candidate a series of bubble-test questions like “Do you tease small animals?” or “Would you rather be at a cocktail part or the library on a Friday night?” is not useful (although both are actual questions on popular psychology tests), and it’s certainly not predictive of success on the job. 302 | 9. The Aptitude Tester — Tests can help managers determine whether has the right aptitude for a specific role, such as persistence for a business development position, bit they should never become the sole determinant in a hiring decision. 303 | 10. The Fortune-Teller — Just like a fortune-teller looking in a crystal ball to predict the future, some interviewers like into the future regarding the job at hand by asking hypothetical questions: “What would you do? How would you do it? Could you do it?” 304 | 305 | ## Selling through the process 306 | 307 | - Fit ties together the company’s vision, needs, and culture with the candidate’s goals, strengths, and values. “Here is where we are going as a company. Here is how you fit in?” 308 | - Family takes into account the broader trauma of changing jobs. “What can we do to make this change as easy as possible for your family?” 309 | - Freedom is the autonomy the candidate will have to make his or her own decisions. “I will give you ample freedom to make decisions, and I will not micromanage you.” 310 | - Fortune reflects the stability of your company and the overall financial upside. “If you accomplish your objectives, you will likely make [compensation amount] over the next five years.” 311 | - Fun describes the work environment and personal relationships the candidate will make. “We like to have a lot of fun around here. I think you will find this is a culture you will really enjoy.” 312 | 313 | Or Lenny's version https://www.lennysnewsletter.com/p/hiring-your-early-team-b2b 314 | 1. **Captivating vision**—Make it easy for candidates to visualize what you are building toward and to feel like their work will be meaningful. 315 | 2. **A++ early team**—The best talent attracts the best talent. 316 | 3. **Put in the time—**Be prepared to commit 50 to 100 hours for each hire you make. 317 | 4. **Grow your network**—It’ll be an easier sell if they know you (or know someone who knows you). 318 | 5. **Love bomb—**Go the extra mile when trying to close a candidate: 319 | 320 | Clearbit version 321 | The five 'fs'# 322 | - Fit (talents and strengths match to opportunity and role) 323 | - Family support for joining company 324 | - Freedom to make decisions 325 | - Fortune and glory 326 | - Fun 327 | 328 | 329 | - Keep notes for potential A players about what might interest them and how to frame the offer 330 | - Think about the whole process from offer to to 100th day as a funnel. It’s your job to minimise drop off by prepping and going fasssst once you’ve made the decision 331 | - If senior hires, set up a chat with an investor, or a recent leaver 332 | 333 | - Go fast with an offer, and follow up on offers to get to signature. A delay is often what it seems 334 | - Try and push for quick start - ride the momentum. If not, check in every couple of weeks, send essays, books etc 335 | - Create a strong onboarding process and over-invest in the first month 336 | 337 | If they say no - don’t let up. Ask to keep in touch, send them contact, ask them if they’d be interested in the future. Keep them in a gsheet and send them stuff every couple of months, e.g. interesting articles. 338 | 339 | https://www.ashbyhq.com/blog/recruiting/2023-trends-report-offer-acceptance-rates 340 | 341 | 75% a good acceptance rate- best in class 90%. 342 | 343 | ## Reference Interviews 344 | ** 345 | 346 | Employers only legally obliged to tell you employment length and title.   347 | 348 | 1. In what context did you work with the person? 349 | 2. What were the person’s biggest strengths? 350 | 3. What were the person’s biggest areas for improvement back then? 351 | 4. How would you rate his/her overall performance in that job on a 1–10 scale? What about his or her performance causes you to give that rating? 352 | 5. The person mentioned that he/she struggled with x in that job. Can you tell me more about that? 353 | 354 | `if junior - get 1 ref, or take a risk. If Senior, try to get 1-2 named references and one other not referenced (blind message/ 2nd order connection) 355 | 356 | Most people will try to be beige/neutral about the person. Try and push to see if they’re an A-Player/ any red flags. With references, the absence of enthusiasm is a terrible sign. 357 | 358 | At least seven different references should always be interviewed: 3 bosses, 2 peers or customers and 2 subordinates: - Street and Smart. That’s a lot! I think less is okay. 359 | 360 | ## 361 | 362 | ## Other tips and tricks 363 | 364 | Think of it like a startup - what’s your niche and who do you appeal to? Don’t just go bland. Understand and be honest about your issues. Work out how to counter them - pay more? Development? Take bets on people? There’s always a way - think like a challenger 365 | 366 | Better to try and find under-priced parameters, e.g. non A schools, people on Visas. Or just pay more :) even if you think some quality is desirable, if you think the market overvalues that quality, you should look at the other side of the spectrum. 367 | 368 | The correlation between who did really well in the interview process and who performs really well at work is really weak. Interviewing should be thought of as information gathering. You should consciously design the process to be the most predictive of future job performance. Unstructured interviews are terrible for this and also bring in confirmation bias 369 | 370 | What would I have to see in order for me to change my mind about this candidate? If I start out super excited about a candidate, and they nail three questions in a row about system design, then I try to bring out devil's advocate: maybe this person lacks something else? And I switch to some completely different topic, like regular expressions or UNIX commands. Conversely if someone doesn't do well, think of a hypothetical question where they might win you back. Always try to poke holes in your own judgement. 371 | 372 | ** 373 | 374 | 375 | 376 | ## Contentious - GMA Tests 377 | 378 | Schmidt - Because of its special status, GMA can be considered the primary personnel measure for hiring decisions, and we can consider the remaining 30 personnel measures as supplements to GMA measures. 379 | 380 | https://home.ubalt.edu/tmitch/645/session%204/Schmidt%20&%20Oh%20validity%20and%20util%20100%20yrs%20of%20research%20Wk%20PPR%202016.pdf 381 | 382 | 383 | 384 | **Paul Graham** 385 | 386 | What do I mean by good people? One of the best tricks I learned during [our](https://www.paulgraham.com/road.html) startup was a rule for deciding who to hire. Could you describe the person as an animal? It might be hard to translate that into another language, but I think everyone in the US knows what it means. It means someone who takes their work a little too seriously; someone who does what they do so well that they pass right through professional and cross over into obsessive. 387 | 388 | What it means specifically depends on the job: a salesperson who just won't take no for an answer; a hacker who will stay up till 4:00 AM rather than go to bed leaving code with a bug in it; a PR person who will cold-call _New York Times_ reporters on their cell phones; a graphic designer who feels physical pain when something is two millimeters out of place. 389 | 390 | Almost everyone who worked for us was an animal at what they did. The woman in charge of sales was so tenacious that I used to feel sorry for potential customers on the phone with her. You could sense them squirming on the hook, but you knew there would be no rest for them till they'd signed up. 391 | 392 | If you think about people you know, you'll find the animal test is easy to apply. Call the person's image to mind and imagine the sentence "so-and-so is an animal." If you laugh, they're not. You don't need or perhaps even want this quality in big companies, but you need it in a startup. 393 | 394 | For programmers we had three additional tests. Was the person genuinely smart? If so, could they actually get things done? And finally, since a few good hackers have unbearable personalities, could we stand to have them around? 395 | 396 | That last test filters out surprisingly few people. We could bear any amount of nerdiness if someone was truly smart. What we couldn't stand were people with a lot of attitude. But most of those weren't truly smart, so our third test was largely a restatement of the first. 397 | 398 | When nerds are unbearable it's usually because they're trying too hard to seem smart. But the smarter they are, the less pressure they feel to act smart. So as a rule you can recognize genuinely smart people by their ability to say things like "I don't know," "Maybe you're right," and "I don't understand x well enough." 399 | 400 | https://www.paulgraham.com/start.html 401 | 402 | 403 | 404 | ## When to hire 405 | 406 | ![[Pasted image 20240403101316.png]] 407 | - Are you on fire? 408 | - Have you done the role? 409 | - Can you reshuffle the work? 410 | - Can the company afford it? Would you be better off with x in another department 411 | - Is the bottleneck to company success your team? 412 | - Have you tried automating 413 | Is your team shit and they should be able to cope with current workload 414 | Is the new work permanent? 415 | Is there a speciality missing? 416 | 417 | If all the above is covered then think about hiring. Don’t underestimate the overhead of adding people. Sometimes it’s better to get a freelancer in for a bit to see if it’s needed. That’s a whole other post. 418 | 419 | On the otherrrrr hand. It will generally take someone a month to fully get into things, and probably three months before being amazinf 420 | 421 | ### **Use the job description to start making your pitch to candidates.** 422 | 423 | MASTERING the Hire - Chaka Booker 424 | 425 | 426 | https://www.notion.so/templates/job-description-repository?ref=review.firstround.com 427 | 428 | https://hbr.org/2020/03/write-a-job-description-that-attracts-the-right-candidate 429 | 430 | https://www.linkedin.com/pulse/ive-hired-hundreds-people-facebook-here-how-i-do-julie-zhuo/?ref=review.firstround.com 431 | 432 | 433 | https://review.firstround.com/why-nows-the-perfect-time-to-retool-your-hiring-process-and-get-creative/ 434 | 435 | https://review.firstround.com/the-best-interview-questions-weve-ever-published/ 436 | 437 | https://www.lennysnewsletter.com/p/hiring-your-early-team-b2b 438 | 439 | https://themanagershandbook.com/hiring-and-onboarding/hiring-101 440 | 441 | Generally expect 25% of interview stage - so 4 people per hire? 442 | - Use as a calibration 443 | 444 | **[https://erikbern.com/2020/01/13/how-to-hire-smarter-than-the-market-a-toy-model.html](https://erikbern.com/2020/01/13/how-to-hire-smarter-than-the-market-a-toy-model.html)** 445 | **[https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem](https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem)** --------------------------------------------------------------------------------