diff --git a/.github/workflows/pages.yml.old b/.github/workflows/pages.yml.old index b2e5a34..95e4d24 100644 --- a/.github/workflows/pages.yml.old +++ b/.github/workflows/pages.yml.old @@ -1,18 +1,12 @@ # Inspired from https://github.com/actions/starter-workflows/blob/main/pages/nextjs.yml -name: GitHub Pages +name: Build docker container on: push: branches: main workflow_dispatch: -permissions: - contents: read - pages: write - id-token: write - concurrency: - group: 'pages' cancel-in-progress: false jobs: @@ -39,17 +33,3 @@ jobs: EXPORT: 1 UNOPTIMIZED: 1 BASE_PATH: ${{ steps.configurepages.outputs.base_path }} - - uses: actions/upload-pages-artifact@v3 - with: - path: ./out - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100755 new mode 100644 diff --git a/.yarn/releases/yarn-3.6.1.cjs b/.yarn/releases/yarn-3.6.1.cjs old mode 100755 new mode 100644 diff --git a/app/tag-data.json b/app/tag-data.json index 3fcb5ef..9e26dfe 100644 --- a/app/tag-data.json +++ b/app/tag-data.json @@ -1 +1 @@ -{"markdown":1,"code":1,"features":1,"github":1,"guide":4,"next-js":3,"tailwind":2,"yoyoyoy":1,"feature":1,"writings":1,"book":1,"reflection":1} \ No newline at end of file +{} \ No newline at end of file diff --git a/data/blog/code-sample.mdx b/data/blog/code-sample.mdx deleted file mode 100644 index 13dd19b..0000000 --- a/data/blog/code-sample.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Sample .md file -date: '2016-03-08' -tags: ['markdown', 'code', 'features'] -draft: true -summary: Example of a markdown file with code blocks and syntax highlighting ---- - -A sample post with markdown. - -## Inline Highlighting - -Sample of inline highlighting `sum = parseInt(num1) + parseInt(num2)` - -## Code Blocks - -Some Javascript code - -```javascript -var num1, num2, sum -num1 = prompt('Enter first number') -num2 = prompt('Enter second number') -sum = parseInt(num1) + parseInt(num2) // "+" means "add" -alert('Sum = ' + sum) // "+" means combine into a string -``` - -Some Python code 🐍 - -```python -def fib(): - a, b = 0, 1 - while True: # First iteration: - yield a # yield 0 to start with and then - a, b = b, a + b # a will now be 1, and b will also be 1, (0 + 1) - -for index, fibonacci_number in zip(range(10), fib()): - print('{i:3}: {f:3}'.format(i=index, f=fibonacci_number)) -``` diff --git a/data/blog/github-markdown-guide.mdx b/data/blog/github-markdown-guide.mdx deleted file mode 100644 index 0ce88bf..0000000 --- a/data/blog/github-markdown-guide.mdx +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: 'Markdown Guide' -date: '2019-10-11' -tags: ['github', 'guide'] -draft: false -summary: 'Markdown cheatsheet for all your blogging needs - headers, lists, images, tables and more! An illustrated guide based on GitHub Flavored Markdown.' ---- - -# Introduction - -Markdown and Mdx parsing is supported via `unified`, and other remark and rehype packages. `next-mdx-remote` allows us to parse `.mdx` and `.md` files in a more flexible manner without touching webpack. - -GitHub flavored markdown is used. `mdx-prism` provides syntax highlighting capabilities for code blocks. Here's a demo of how everything looks. - -The following markdown cheatsheet is adapted from: https://guides.github.com/features/mastering-markdown/ - -# What is Markdown? - -Markdown is a way to style text on the web. You control the display of the document; formatting words as bold or italic, adding images, and creating lists are just a few of the things we can do with Markdown. Mostly, Markdown is just regular text with a few non-alphabetic characters thrown in, like `#` or `*`. - -# Syntax guide - -Here’s an overview of Markdown syntax that you can use anywhere on GitHub.com or in your own text files. - -## Headers - -``` -# This is a h1 tag - -## This is a h2 tag - -#### This is a h4 tag -``` - -# This is a h1 tag - -## This is a h2 tag - -#### This is a h4 tag - -## Emphasis - -``` -_This text will be italic_ - -**This text will be bold** - -_You **can** combine them_ -``` - -_This text will be italic_ - -**This text will be bold** - -_You **can** combine them_ - -## Lists - -### Unordered - -``` -- Item 1 -- Item 2 - - Item 2a - - Item 2b -``` - -- Item 1 -- Item 2 - - Item 2a - - Item 2b - -### Ordered - -``` -1. Item 1 -1. Item 2 -1. Item 3 - 1. Item 3a - 1. Item 3b -``` - -1. Item 1 -1. Item 2 -1. Item 3 - 1. Item 3a - 1. Item 3b - -## Images - -``` -![GitHub Logo](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png) -Format: ![Alt Text](url) -``` - -![GitHub Logo](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png) - -## Links - -``` -http://github.com - automatic! -[GitHub](http://github.com) -``` - -http://github.com - automatic! -[GitHub](http://github.com) - -## Blockquotes - -``` -As Kanye West said: - -> We're living the future so -> the present is our past. -``` - -As Kanye West said: - -> We're living the future so -> the present is our past. - -## Inline code - -``` -I think you should use an -`` element here instead. -``` - -I think you should use an -`` element here instead. - -## Syntax highlighting - -Here’s an example of how you can use syntax highlighting with [GitHub Flavored Markdown](https://help.github.com/articles/basic-writing-and-formatting-syntax/): - -```` -```js:fancyAlert.js -function fancyAlert(arg) { - if (arg) { - $.facebox({ div: '#foo' }) - } -} -``` -```` - -And here's how it looks - nicely colored with styled code titles! - -```js:fancyAlert.js -function fancyAlert(arg) { - if (arg) { - $.facebox({ div: '#foo' }) - } -} -``` - -## Footnotes - -``` -Here is a simple footnote[^1]. With some additional text after it. - -[^1]: My reference. -``` - -Here is a simple footnote[^1]. With some additional text after it. - -[^1]: My reference. - -## Task Lists - -``` -- [x] list syntax required (any unordered or ordered list supported) -- [x] this is a complete item -- [ ] this is an incomplete item -``` - -- [x] list syntax required (any unordered or ordered list supported) -- [x] this is a complete item -- [ ] this is an incomplete item - -## Tables - -You can create tables by assembling a list of words and dividing them with hyphens `-` (for the first row), and then separating each column with a pipe `|`: - -``` -| First Header | Second Header | -| --------------------------- | ---------------------------- | -| Content from cell 1 | Content from cell 2 | -| Content in the first column | Content in the second column | -``` - -| First Header | Second Header | -| --------------------------- | ---------------------------- | -| Content from cell 1 | Content from cell 2 | -| Content in the first column | Content in the second column | - -## Strikethrough - -Any word wrapped with two tildes (like `~~this~~`) will appear ~~crossed out~~. diff --git a/data/blog/guide-to-using-images-in-nextjs.mdx b/data/blog/guide-to-using-images-in-nextjs.mdx deleted file mode 100644 index 135f552..0000000 --- a/data/blog/guide-to-using-images-in-nextjs.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Images in Next.js -date: '2020-11-11' -tags: ['next js', 'guide'] -draft: false -summary: 'In this article we introduce adding images in the tailwind starter blog and the benefits and limitations of the next/image component.' -authors: ['default'] ---- - -# Introduction - -The tailwind starter blog has out of the box support for [Next.js's built-in image component](https://nextjs.org/docs/api-reference/next/image) and automatically swaps out default image tags in markdown or mdx documents to use the Image component provided. - -# Usage - -To use in a new page route / javascript file, simply import the image component and call it e.g. - -```js -import Image from 'next/image' - -function Home() { - return ( - <> -

My Homepage

- Picture of the author -

Welcome to my homepage!

- - ) -} - -export default Home -``` - -For a markdown file, the default image tag can be used and the default `img` tag gets replaced by the `Image` component in the build process. - -Assuming we have a file called `ocean.jpg` in `static/images/ocean.jpg`, the following line of code would generate the optimized image. - -``` -![ocean](/static/images/ocean.jpg) -``` - -Alternatively, since we are using mdx, we can just use the image component directly! Note, that you would have to provide a fixed width and height. The `img` tag method parses the dimension automatically. - -```js -ocean -``` - -_Note_: If you try to save the image, it is in webp format, if your browser supports it! - -![ocean](/static/images/ocean.jpeg) - -Photo by [YUCAR FotoGrafik](https://unsplash.com/@yucar?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) -on [Unsplash](https://unsplash.com/s/photos/sea?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) - -# Benefits - -- Smaller image size with Webp (~30% smaller than jpeg) -- Responsive images - the correct image size is served based on the user's viewport -- Lazy loading - images load as they are scrolled to the viewport -- Avoids [Cumulative Layout Shift](https://web.dev/cls/) -- Optimization on demand instead of build-time - no increase in build time! - -# Limitations - -- Due to the reliance on `next/image`, unless you are using an external image CDN like Cloudinary or Imgix, it is practically required to use Vercel for hosting. This is because the component acts like a serverless function that calls a highly optimized image CDN. - - If you do not want to be tied to Vercel, you can remove `imgToJsx` in `remarkPlugins` in `lib/mdx.js`. This would avoid substituting the default `img` tag. - - Alternatively, one could wait for image optimization at build time to be supported. A different library, [next-optimized-images](https://github.com/cyrilwanner/next-optimized-images) does that, although it requires transforming the images through webpack which is not done here. - -- Images from external links are not passed through `next/image` -- All images have to be stored in the `public` folder e.g `/static/images/ocean.jpeg` diff --git a/data/blog/howibuiltcygnus.mdx b/data/blog/howibuiltcygnus.mdx new file mode 100644 index 0000000..ca68623 --- /dev/null +++ b/data/blog/howibuiltcygnus.mdx @@ -0,0 +1,53 @@ +--- +title: How I built Cygnus +date: '2024-10-14' +tags: ['cygnus', 'self-hosted', 'server'] +draft: false +summary: A story of how I started self-hosting +--- + +> #### Now that I think about it, they kind of took advantage of me + +### Side work for Aunt Laurie +The first piece of hardware I ever owned was given to me by my dear Aunt. At the time she had worked for a company that sold industrial saw blades and she was frequently fixing their IT issues despite being an accountant. To this day it still infuriates me how much they took advantage of her. Now that I think about it, they kind of took advantage of me. You see I had worked for GeekSquad at the time and looking back at it, I realize how little I knew then. While I know there is always more to learn in the industry, what you learn pretty quickly is that your time is valuable, and that not everyone views IT work as "easy" and "no big deal". If they had invited an IT consultant to do the 3 hours of work I did, the bill easily would have been hundreds of dollars. These days, I don't charge by the hour, I charge by the job. This way, I can work quickly and not get penalized for it. + +She asked me in to help take a look at a virus infecting some of the computers at the office. This virus was mean; one of those that would keep creating itself until you found the source process. I don't really think it was a self-replicating-worm-type-of-virus because it didn't spread to all of the computers in the network, just a few. It was more like one of those click-a-link-in-an-email-that-you-shouldn't-have types. No, Harbor freights doesn't have a free gift card for you. What is free, is the headache it takes to find the dang source. I was able to find it only because i suggested an antivirus I liked: Webroot. It was one of the most performant and reliable anti-viruses I have ever seen. After convincing my aunt to buy it, I whipped up a batch file to install the application and register it all in one go. Boyyyy now that I think about it, that's probably when I really started to enjoy writing code/scripting. After using the script, Webroot immediately found the source process and resource usage went back to normal. + +"Would you like a computer?" + +"A what?" I respond confused (I was expecting money). She starts walking to the networking closet where I see an old dell tower sitting on the floor. At first I think it's just a desktop, but after looking at the label closely, I realize it's actually a server in desktop form. She was offering me a Dell T100 equipped with a quad core Xeon processor(Intel Server CPU) and 4 bays for hard drives. Hard drives included. + +"Oh Sweet! Thanks Auntie Lar!" + +Despite not being paid like a professional, this was sufficient compensation. While it wasn't the most powerful server on the market, it definitely would do anything I ask it. This leaves just one question... + +### A way to watch movies +> What should I ask it to do? + +The computer sits in my room for months. Every glance in its direction, I ask my self: "What should I ask it to do?". A month or two later, I am lounging in the living room with my parents watching OTA tv. My father just did a scan of channels and while we are flipping through the channels we come across The Fresh Prince of Bel-Air reruns. We couldn't get enough. I was so happy. You see, you couldn't find those reruns on OTA in San Antonio; And we just happened to be getting a channel from Austin! This goes on for a couple of days then one day, the floor just gets pull from underneath our feet. We were no longer getting signal! I have my answer to the question now. I am going to download The Fresh Prince of Bel-Air and watch it off my server. After installing Windows Sever 2012 Edition, I install plex. I happily download The Fresh Prince of Bel-Air and ironically, to this day I haven't watched all the episodes. I still have all of the files though. + +### Learning virtualization +"So what do you like to do with your free time?" + +"I love watching movies! I have a plex server. I also like to play Video Games like League of legends and Overwatch." I smile as I respond to my future Manager. + +"That's cool, I have one too. Well alright, we are going to give you a technical interview now. Here's the packet. You have an hour." + +I would say the interview went well. After all, I got the job. This was my first "Corporate Job". The exposure really required me to teach my self on the side. Using VMWare ESXI was very easy. Their bare metal hypervisor came with networking, storage management etc and was reasonably intuitive. + +Downloading and setting up linux virtual machines with each application was challenging yet rewarding. Setting up servers manually and then installing the applications was an involved process; One that likely set the ground work for understanding the use case of containers. Being RHEL certified did afford me a large degree of appreciation for linux. I would combine these later to make managing my home lab much, much easier. But, hey, you live and you learn. In this case I learned that I was demanding too much of my little Dell T100 server. I would need to build it bigger. After all, I was already at home. + +### Building from scratch +Ebay, is a great website. You can find anything from car parts to an ice tea maker. They also sell things from China. Did you know you could buy server parts from Ebay? I built a dual processor server. Guess how much each processor was? $5. And the RAM(Memory)? $7. Just to put that in perspective, *new* processors were *hundreds* of dollars, sometimes even thousands. Ebay enabled me build an affordable home lab server. It was great while it lasted..... + +### 15 amp circuit breaker +Did you know, in America, there are two typical types of circuits run in residential rooms? Me either! For example, your bedroom likely has several outlets however in most cases they all are sharing the same power connection or circuit. These circuits have a maximum amount of power they can safely pull before the safety switch or circuit breaker will "trip". I learned this the hard way. You see, I lived my grandparents at the time and my grandfather needed the house warmer to stay healthy and in a good mood. So my grandmother and I never raised the temperature. But since we live in Texas, I needed something to cool down my room. I was in the middle of an Overwatch gaming session and all of the sudden the pc shuts off. I new instantly the circuit breaker tripped because the AC shutoff too. I ran over to the circuit panel, slapped the breaker on and ran right back to my game. Booted the PC and get back in game as quickly as possible. Trips again. Turn it back on. I repeat this business another time before I give up. A gaming PC, a couple of servers and an air conditioner draw a lot of power. When all three are running on the same circuit, it can cause it to trip. I find out later the circuit in my room is a 15 amp breaker, instead of a 20! At least I know now. I go to watch a movie on Plex and I notice plex isn't loading. I walk over to the servers and power them on. The Dell T100 works just fine. My custom server, won't turn on! Panic sets in. + +To be continued.... + +{/* +### Troubleshooting insanity +### The Need to Concede +### Light at the end of the tunnel +*/} + diff --git a/data/blog/introducing-tailwind-nextjs-starter-blog.mdx b/data/blog/introducing-tailwind-nextjs-starter-blog.mdx deleted file mode 100644 index 6c9768d..0000000 --- a/data/blog/introducing-tailwind-nextjs-starter-blog.mdx +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: 'Introducing Tailwind Nextjs Starter Blog' -date: '2021-01-12' -lastmod: '2024-08-16' -tags: ['next-js', 'tailwind', 'guide'] -draft: false -summary: 'Looking for a performant, out of the box template, with all the best in web technology to support your blogging needs? Checkout the Tailwind Nextjs Starter Blog template.' -images: ['/static/images/canada/mountains.jpg', '/static/images/canada/toronto.jpg'] -authors: ['default', 'sparrowhawk'] ---- - -![tailwind-nextjs-banner](/static/images/twitter-card.png) - -# Tailwind Nextjs Starter Blog - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/timlrx/tailwind-nextjs-starter-blog) - -> [!CAUTION] -> This is the README of version 1 of the template. It is kept for historical reasons, but is no longer supported. It also serves as a nice example of [Github Alert](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts). For the actual documentation, please refer to the [Github repository](https://github.com/timlrx/tailwind-nextjs-starter-blog). - -This is a [Next.js](https://nextjs.org/), [Tailwind CSS](https://tailwindcss.com/) blogging starter template. Probably the most feature-rich Next.js markdown blogging template out there. Comes out of the box configured with the latest technologies to make technical writing a breeze. Easily configurable and customizable. Perfect as a replacement to existing Jekyll and Hugo individual blogs. - -Check out the documentation below to get started. - -Facing issues? Check the [FAQ page](https://github.com/timlrx/tailwind-nextjs-starter-blog/wiki) and do a search on past issues. Feel free to open a new issue if none has been posted previously. - -Feature request? Check the past discussions to see if it has been brought up previously. Otherwise, feel free to start a new discussion thread. All ideas are welcomed! - -## Examples - -- [Demo Blog](https://tailwind-nextjs-starter-blog.vercel.app/) - this repo -- [My personal blog](https://www.timlrx.com) - modified to auto-generate blog posts with dates -- [Aloisdg's cookbook](https://tambouille.vercel.app/) - with pictures and recipes! -- [GautierArcin's demo with next translate](https://tailwind-nextjs-starter-blog-seven.vercel.app/) - includes translation of mdx posts, [source code](https://github.com/GautierArcin/tailwind-nextjs-starter-blog/tree/demo/next-translate) -- [David Levai's digital garden](https://davidlevai.com/) - customized design and added email subscriptions -- [Thinh's Corner](https://thinhcorner.com/) - [customized layout](https://github.com/Th1nhNg0/th1nhng0.vercel.app/blob/5e73a420828d82f01e7147512a2c3273c4ec19f8/layouts/PostLayout.js) with sticky side table of contents - -Using the template? Feel free to create a PR and add your blog to this list. - -## Motivation - -I wanted to port my existing blog to Nextjs and Tailwind CSS but there was no easy out of the box template to use so I decided to create one. Design is adapted from [Tailwindlabs blog](https://github.com/tailwindlabs/blog.tailwindcss.com). - -I wanted it to be nearly as feature-rich as popular blogging templates like [beautiful-jekyll](https://github.com/daattali/beautiful-jekyll) and [Hugo Academic](https://github.com/wowchemy/wowchemy-hugo-modules) but with the best of React's ecosystem and current web development's best practices. - -## Features - -- Easy styling customization with [Tailwind 3.0](https://tailwindcss.com/blog/tailwindcss-v3) and primary color attribute -- Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/210111_DiC1_08f3670c3430bf4a9b76fc3b927716c5/) -- Lightweight, 45kB first load JS, uses Preact in production build -- Mobile-friendly view -- Light and dark theme -- Self-hosted font with [Fontsource](https://fontsource.org/) -- Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics -- [MDX - write JSX in markdown documents!](https://mdxjs.com/) -- Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus) -- Math display supported via [KaTeX](https://katex.org/) -- Citation and bibliography support via [rehype-citation](https://github.com/timlrx/rehype-citation) -- Automatic image optimization via [next/image](https://nextjs.org/docs/basic-features/image-optimization) -- Flexible data retrieval with [mdx-bundler](https://github.com/kentcdodds/mdx-bundler) -- Support for tags - each unique tag will be its own page -- Support for multiple authors -- Blog templates -- TOC component -- Support for nested routing of blog posts -- Newsletter component with support for Mailchimp, Buttondown, Convertkit, Klaviyo, Revue, Emailoctopus and Beehiiv -- Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus -- Projects page -- Preconfigured security headers -- SEO friendly with RSS feed, sitemaps and more! - -## Sample posts - -- [A markdown guide](https://tailwind-nextjs-starter-blog.vercel.app/blog/github-markdown-guide) -- [Learn more about images in Next.js](https://tailwind-nextjs-starter-blog.vercel.app/blog/guide-to-using-images-in-nextjs) -- [A tour of math typesetting](https://tailwind-nextjs-starter-blog.vercel.app/blog/deriving-ols-estimator) -- [Simple MDX image grid](https://tailwind-nextjs-starter-blog.vercel.app/blog/pictures-of-canada) -- [Example of long prose](https://tailwind-nextjs-starter-blog.vercel.app/blog/the-time-machine) -- [Example of Nested Route Post](https://tailwind-nextjs-starter-blog.vercel.app/blog/nested-route/introducing-multi-part-posts-with-nested-routing) - -## Quick Start Guide - -1. JS (official support) - `npx degit https://github.com/timlrx/tailwind-nextjs-starter-blog.git` or TS (community support) - `npx degit timlrx/tailwind-nextjs-starter-blog#typescript` -2. Personalize `siteMetadata.js` (site related information) -3. Modify the content security policy in `next.config.js` if you want to use - any analytics provider or a commenting solution other than giscus. -4. Personalize `authors/default.md` (main author) -5. Modify `projectsData.ts` -6. Modify `headerNavLinks.ts` to customize navigation links -7. Add blog posts -8. Deploy on Vercel - -## Development - -First, run the development server: - -```bash -npm start -# or -npm run dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. - -## Extend / Customize - -`data/siteMetadata.js` - contains most of the site related information which should be modified for a user's need. - -`data/authors/default.md` - default author information (required). Additional authors can be added as files in `data/authors`. - -`data/projectsData.js` - data used to generate styled card on the projects page. - -`data/headerNavLinks.js` - navigation links. - -`data/logo.svg` - replace with your own logo. - -`data/blog` - replace with your own blog posts. - -`public/static` - store assets such as images and favicons. - -`tailwind.config.js` and `css/tailwind.css` - contain the tailwind stylesheet which can be modified to change the overall look and feel of the site. - -`css/prism.css` - controls the styles associated with the code blocks. Feel free to customize it and use your preferred prismjs theme e.g. [prism themes](https://github.com/PrismJS/prism-themes). - -`components/social-icons` - to add other icons, simply copy an svg file from [Simple Icons](https://simpleicons.org/) and map them in `index.js`. Other icons use [heroicons](https://heroicons.com/). - -`components/MDXComponents.js` - pass your own JSX code or React component by specifying it over here. You can then call them directly in the `.mdx` or `.md` file. By default, a custom link and image component is passed. - -`layouts` - main templates used in pages. - -`pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information. - -`next.config.js` - configuration related to Next.js. You need to adapt the Content Security Policy if you want to load scripts, images etc. from other domains. - -## Post - -### Frontmatter - -Frontmatter follows [Hugo's standards](https://gohugo.io/content-management/front-matter/). - -Currently 10 fields are supported. - -``` -title (required) -date (required) -tags (required, can be empty array) -lastmod (optional) -draft (optional) -summary (optional) -images (optional, if none provided defaults to socialBanner in siteMetadata config) -authors (optional list which should correspond to the file names in `data/authors`. Uses `default` if none is specified) -layout (optional list which should correspond to the file names in `data/layouts`) -canonicalUrl (optional, canonical url for the post for SEO) -``` - -Here's an example of a post's frontmatter: - -``` ---- -title: 'Introducing Tailwind Nexjs Starter Blog' -date: '2021-01-12' -lastmod: '2021-01-18' -tags: ['next-js', 'tailwind', 'guide','yoyoyoy'] -draft: false -summary: 'Looking for a performant, out of the box template, with all the best in web technology to support your blogging needs? Checkout the Tailwind Nextjs Starter Blog template.' -images: ['/static/images/canada/mountains.jpg', '/static/images/canada/toronto.jpg'] -authors: ['default', 'sparrowhawk'] -layout: PostLayout -canonicalUrl: https://tailwind-nextjs-starter-blog.vercel.app/blog/introducing-tailwind-nextjs-starter-blog ---- -``` - -### Compose - -Run `node ./scripts/compose.js` to bootstrap a new post. - -Follow the interactive prompt to generate a post with pre-filled front matter. - -## Deploy - -**Vercel** -The easiest way to deploy the template is to use the [Vercel Platform](https://vercel.com) from the creators of Next.js. Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. - -**Netlify / GitHub Pages / Firebase etc.** -As the template uses `next/image` for image optimization, additional configurations have to be made to deploy on other popular static hosting websites like [Netlify](https://www.netlify.com/) or [GitHub Pages](https://pages.github.com/). An alternative image optimization provider such as Imgix, Cloudinary or Akamai has to be used. Alternatively, replace the `next/image` component with a standard `` tag. See [`next/image` documentation](https://nextjs.org/docs/basic-features/image-optimization) for more details. - -The API routes used in the newsletter component cannot be used in a static site export. You will need to use a form API endpoint provider and substitute the route in the newsletter component accordingly. Other hosting platforms such as Netlify also offer alternative solutions - please refer to their docs for more information. - -## Support - -Using the template? Support this effort by giving a star on GitHub, sharing your own blog and giving a shoutout on Twitter or be a project [sponsor](https://github.com/sponsors/timlrx). - -## Licence - -[MIT](https://github.com/timlrx/tailwind-nextjs-starter-blog/blob/main/LICENSE) © [Timothy Lin](https://www.timrlx.com) diff --git a/data/blog/my-fancy-title.mdx b/data/blog/my-fancy-title.mdx deleted file mode 100644 index cc80df3..0000000 --- a/data/blog/my-fancy-title.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: My fancy title -date: '2021-01-31' -tags: ['yoyoyoy'] -draft: true -summary: draft post -images: [] ---- - -Draft post which should not display diff --git a/data/blog/release-of-tailwind-nextjs-starter-blog-v2.0.mdx b/data/blog/release-of-tailwind-nextjs-starter-blog-v2.0.mdx deleted file mode 100644 index 3be8f7d..0000000 --- a/data/blog/release-of-tailwind-nextjs-starter-blog-v2.0.mdx +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: 'Release of Tailwind Nextjs Starter Blog v2.0' -date: '2023-08-05' -lastmod: '2023-08-05' -tags: ['next-js', 'tailwind', 'guide', 'feature'] -draft: true -summary: 'Release of Tailwind Nextjs Starter Blog template v2.0, refactored with Nextjs App directory and React Server Components setup.Discover the new features and how to migrate from V1.' -images: ['/static/images/twitter-card.png'] ---- - -## Introduction - -Welcome to the release of Tailwind Nextjs Starter Blog template v2.0. This release is a major refactor of the codebase to support Nextjs App directory and React Server Components. Read on to discover the new features and how to migrate from V1. - - - -## V1 to V2 - -![Github Traffic](/static/images/github-traffic.png) - -The template was first released in January 2021 and has since been used by thousands of users. It is featured on [Next.js Templates](https://vercel.com/templates/next.js/tailwind-css-starter-blog), [Tailwind Awesome](https://www.tailwindawesome.com/resources/tailwind-nextjs-starter-blog) among other listing sites. It attracts 200+ unique visitors daily notching 1500-2000 page views, with 1.3k forks and many other clones. - -Many thanks to the community of users and contributors for making this template a success! I created a small video montage of the blogs (while cleaning up the list in the readme) to showcase the diversity of the blogs created using the template and to celebrate the milestone: - - - -Version 2 builds on the success of the previous version and introduces many new features and improvements. The codebase has been refactored to support Next.js App directory and React Server Components. Markdown / MDX is now processed using Contentlayer, a type-safe content SDK that validates and transforms your content into type-safe JSON data. It integrates with Pliny, a new library that provides out of the box Next.js components to enhance your static site with analytics, comments and newsletter subscription. A new command palette (⌘-k) search component is also added to the template. - -Let's dive into the new features and improvements in V2. - -## Next.js App Directory and React Server Components - -Now that [Next.js App router](https://nextjs.org/docs/app) is finally stable and is mostly feature compatible with Page Router, the codebase has been migrated to new setup. This allows for a hybrid rendering approach, with the use of React Server Components generated on the server side for faster page loads and smaller bundle sizes, while retaining the ability to sprinkle in client side React components for interactivity.[^1] - -With addition powers comes a [new paradigm](https://nextjs.org/docs/getting-started/react-essentials) to learn. I have migrated the codebase to make use of the new features as much as possible. This includes changes in the folder structure, splitting components into server vs client components, leveraging server side data fetching and using the recommended [Metadata](https://nextjs.org/docs/app/building-your-application/optimizing/metadata) API for SEO discoverability. - -While this simplifies the codebase to some extent, it makes migration from the old codebase more difficult. If you are looking to migrate, I recommend starting from a fresh template and copying over your customizations and existing content. See the [migration recommendations](#migration-recommendations) section for more details. - -## Typescript First - -The codebase has been migrated to Typescript. While the previous version of the template was available in both Javascript and Typescript, I decided to reduce the maintenance burden and focus on Typescript. This also allows for better type checking and code completion in IDEs. - -Typescript is also a perfect match with our new type-safe markdown processor - Contentlayer. - -## Contentlayer - -[Contentlayer](https://www.contentlayer.dev/) is a content SDK that validates and transforms your content into type-safe JSON data that you can easily import into your application. It makes working with local markdown or MDX files a breeze. This replaces `MDX-bundler` and our own markdown processing workflow. - -First, a content source is defined, specifying the name of the document type, the source where it is located along with the frontmatter fields and any additional computed fields that should be generated as part of the process. - -```ts:contentlayer.config.ts -export const Blog = defineDocumentType(() => ({ - name: 'Blog', - filePathPattern: 'blog/**/*.mdx', - contentType: 'mdx', - fields: { - title: { type: 'string', required: true }, - date: { type: 'date', required: true }, - tags: { type: 'list', of: { type: 'string' }, default: [] }, - ... - }, - computedFields: { - readingTime: { type: 'json', resolve: (doc) => readingTime(doc.body.raw) }, - slug: { - type: 'string', - resolve: (doc) => doc._raw.flattenedPath.replace(/^.+?(\/)/, ''), - } - ... - }, -})) -``` - -Contentlayer then processes the MDX files with our desired markdown remark or rehype plugins, validates the schema, generate type definitions and output json files that can be easily imported in our pages. Hot reloading comes out of the box, so edits to the markdown files will be reflected in the browser immediately! - -## Pliny - -A large reason for the popularity of the template was its customizability and integration with other services from analytics providers to commenting solutions. However, this means that a lot of boilerplate code has to be co-located within the template even if the user does not use the feature. Updates and bug fixes had to be copied manually to the user's codebase. - -To solve this, I have abstracted the logic to a separate repository - [Pliny](https://github.com/timlrx/pliny). Pliny provides out of the box Next.js components to enhance static sites: - -- Analytics - - Google Analytics - - Plausible Analytics - - Simple Analytics - - Umami Analytics - - Posthog -- Comments - - Disqus - - Giscus - - Utterances -- Newsletter (uses Next 13 API Routes) - - Buttondown - - Convertkit - - Email Octopus - - Klaviyo - - Mailchimp - - Revue -- Command palette search with tailwind style sheet - - Algolia - - Kbar (local search) -- UI utility components - - Bleed - - Newsletter / Blog Newsletter - - Pre / Code block - - Table of Contents - -Choose your preferred service by modifying `siteMetadata.js` and changing the appropriate fields. For example to change from Umami Analytics to Plausible, we can change the following fields: - -```diff-js:siteMetadata.js -analytics: { -- umamiAnalytics: { -- // We use an env variable for this site to avoid other users cloning our analytics ID -- umamiWebsiteId: process.env.NEXT_UMAMI_ID, // e.g. 123e4567-e89b-12d3-a456-426614174000 -- }, -+ plausibleAnalytics: { -+ plausibleDataDomain: '', // e.g. tailwind-nextjs-starter-blog.vercel.app -+ }, -}, -``` - -Changes in the configuration file gets propagated to the components automatically. No modification to the template is required. - -Under the hood, Pliny exports high level components such as `` and `` which takes in a configuration object and renders the appropriate component. Since the layouts are defined on the server side, Next.js is able to use the configuration object to determine which component to render and send only the required component bundle to the client. - -## New Search Component - -What's a blog in 2023 without a command palette search bar? - -One of the most highly requested features have been added 🎉! The search component supports 2 search providers - Algolia and Kbar local search. - -### Algolia - -[Algolia Docsearch](https://docsearch.algolia.com/) is popular free service used across many documentation websites. It automatically scrapes the website that has is submitted for indexing and makes the search result available via a beautiful dialog modal. The pliny component is greatly inspired by the Docusaurus implementation and comes with a stylesheet that is compatible with the Tailwind CSS theme. - -### Kbar - -[Kbar](https://github.com/timc1/kbar) is a fast, portable, and extensible cmd+k interface. The pliny implementation uses kbar to create a local search dialog box. The component loads a JSON file, default `search.json`, that was created in the contentlayer build process. Try pressing ⌘-k or ctrl-k to see the search bar in action! - -## Styling and Layout Updates - -### Theming - -`tailwind.config.js` has been updated to use tailwind typography defaults where possible and to use the built-in support for dark mode via the `prose-invert` class. This replaces the previous `prose-dark` class and configuration. - -The primary theme color is updated from `teal` to `pink` and the primary gray theme from `neutral` to `gray`. - -Inter is now replaced with Space Grotesk as the default font. - -### New Layouts - -Layout components available in the `layouts` directory, provide a simple way to customize the look and feel of the blog.[^2] - -The downside of building a popular template is that you start seeing multiple similar sites everywhere 😆. While users are encouraged to customized the layouts to their liking, having more layout options that are easily switchable promotes diversity and perhaps can be a good starting point for further customizations. - -In v2, I added a new post layout - `PostBanner`. It features a large banner image and a centered content container. Check out "[Pictures of Canada](/blog/pictures-of-canada)" blog post which has been updated to use the new layout. - -The default blog listing layout has also been updated to include a side bar with blog tags. The search bar in the previous layout has been replace with the new command palette search. To switch back to the old layout, simply change the pages that use the `ListLayoutWithTags` component back to the original `ListLayout`. - -## Migration Recommendations - -Due to the large changes in directory structure, setup and tooling, I recommend starting from a fresh template and copying existing content, followed by incrementally migrating changes over to the new template. - -Styling changes should be relatively minor and can be copied over from the old `tailwind.config.js` to the new one. If copying over, you might need to add back the `prose-dark` class to components that opt into tailwind typography styling. Do modify the font import in the root layout component to use the desired font of choice. - -Changes to the MDX processing pipeline and schema can be easily ported to the new Contentlayer setup. If there are changes to the frontmatter fields, you can modify the document type in `contentlayer.config.ts` to include the new fields. Custom plugins can be added to the `remarkPlugins` and `rehypePlugins` properties in the `makeSource` export of `contentlayer.config.ts`. - -Markdown layouts are no longer sourced automatically from the `layouts` directory. Instead, they have to be specified in the `layouts` object defined in `blog/[...slug]/page.tsx`.[^3] - -To port over larger components or pages, I recommend first specificing it as a client component by using the `"use client"` directive. Once it renders correctly, you can split the interactive components (parts that rely on `use` hooks) as a client component and keep the remaining code as a server component. Consult the comprehensive Next.js [migration guide](https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#migrating-from-pages-to-app) for more details. - -## Conclusion - -I hope you enjoy the new features and improvements in V2. If you have any feedback or suggestions, feel free to open an issue or reach out to me on [Twitter](https://twitter.com/timlrx). - -## Support - -Using the template? Support this effort by giving a star on GitHub, sharing your own blog and giving a shoutout on Twitter or be a project [sponsor](https://github.com/sponsors/timlrx). - -## Licence - -[MIT](https://github.com/timlrx/tailwind-nextjs-starter-blog/blob/main/LICENSE) © [Timothy Lin](https://www.timrlx.com) - -[^1]: The previous version injects Preact into the production build. However, this is no longer possible as it does not support React Server Components. While overall bundle size has increased to about 85kB, most of the content can be pre-rendered on the server side, resulting in a low first contentful paint and time to interactive. Using React throughtout also leads to more consistent behavior with external libraries and components. -[^2]: This is different from Next.js App Directory layouts and are best thought of as reusable React containers. -[^3]: This takes advantage of Server Components by making it simple to specify the layout of choice in the markdown file and match against the `layouts` object which is then used to render the appropriate layout component. diff --git a/data/blog/the-time-machine.mdx b/data/blog/the-time-machine.mdx deleted file mode 100644 index 0f72790..0000000 --- a/data/blog/the-time-machine.mdx +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: 'The Time Machine' -date: '2018-08-15' -tags: ['writings', 'book', 'reflection'] -draft: false -summary: The Time Traveller (for so it will be convenient to speak of him) was - expounding a recondite matter to us. His pale grey eyes shone and - twinkled, and his usually pale face was flushed and animated... ---- - -# The Time Machine by H. G. Wells - -_Title_: The Time Machine - -_Author_: H. G. Wells - -_Subject_: Science Fiction - -_Language_: English - -_Source_: [Project Gutenberg](https://www.gutenberg.org/ebooks/35) - -## Introduction - -The Time Traveller (for so it will be convenient to speak of him) was -expounding a recondite matter to us. His pale grey eyes shone and -twinkled, and his usually pale face was flushed and animated. The fire -burnt brightly, and the soft radiance of the incandescent lights in the -lilies of silver caught the bubbles that flashed and passed in our -glasses. Our chairs, being his patents, embraced and caressed us rather -than submitted to be sat upon, and there was that luxurious -after-dinner atmosphere, when thought runs gracefully free of the -trammels of precision. And he put it to us in this way—marking the -points with a lean forefinger—as we sat and lazily admired his -earnestness over this new paradox (as we thought it) and his fecundity. - -“You must follow me carefully. I shall have to controvert one or two -ideas that are almost universally accepted. The geometry, for instance, -they taught you at school is founded on a misconception.” - -“Is not that rather a large thing to expect us to begin upon?” said -Filby, an argumentative person with red hair. - -“I do not mean to ask you to accept anything without reasonable ground -for it. You will soon admit as much as I need from you. You know of -course that a mathematical line, a line of thickness _nil_, has no real -existence. They taught you that? Neither has a mathematical plane. -These things are mere abstractions.” - -“That is all right,” said the Psychologist. - -“Nor, having only length, breadth, and thickness, can a cube have a -real existence.” - -“There I object,” said Filby. “Of course a solid body may exist. All -real things—” - -“So most people think. But wait a moment. Can an _instantaneous_ cube -exist?” - -“Don’t follow you,” said Filby. - -“Can a cube that does not last for any time at all, have a real -existence?” - -Filby became pensive. “Clearly,” the Time Traveller proceeded, “any -real body must have extension in _four_ directions: it must have -Length, Breadth, Thickness, and—Duration. But through a natural -infirmity of the flesh, which I will explain to you in a moment, we -incline to overlook this fact. There are really four dimensions, three -which we call the three planes of Space, and a fourth, Time. There is, -however, a tendency to draw an unreal distinction between the former -three dimensions and the latter, because it happens that our -consciousness moves intermittently in one direction along the latter -from the beginning to the end of our lives.” - -“That,” said a very young man, making spasmodic efforts to relight his -cigar over the lamp; “that . . . very clear indeed.” - -“Now, it is very remarkable that this is so extensively overlooked,” -continued the Time Traveller, with a slight accession of cheerfulness. -“Really this is what is meant by the Fourth Dimension, though some -people who talk about the Fourth Dimension do not know they mean it. It -is only another way of looking at Time. _There is no difference between -Time and any of the three dimensions of Space except that our -consciousness moves along it_. But some foolish people have got hold of -the wrong side of that idea. You have all heard what they have to say -about this Fourth Dimension?” - -“_I_ have not,” said the Provincial Mayor. - -“It is simply this. That Space, as our mathematicians have it, is -spoken of as having three dimensions, which one may call Length, -Breadth, and Thickness, and is always definable by reference to three -planes, each at right angles to the others. But some philosophical -people have been asking why _three_ dimensions particularly—why not -another direction at right angles to the other three?—and have even -tried to construct a Four-Dimensional geometry. Professor Simon Newcomb -was expounding this to the New York Mathematical Society only a month -or so ago. You know how on a flat surface, which has only two -dimensions, we can represent a figure of a three-dimensional solid, and -similarly they think that by models of three dimensions they could -represent one of four—if they could master the perspective of the -thing. See?” - -“I think so,” murmured the Provincial Mayor; and, knitting his brows, -he lapsed into an introspective state, his lips moving as one who -repeats mystic words. “Yes, I think I see it now,” he said after some -time, brightening in a quite transitory manner. - -“Well, I do not mind telling you I have been at work upon this geometry -of Four Dimensions for some time. Some of my results are curious. For -instance, here is a portrait of a man at eight years old, another at -fifteen, another at seventeen, another at twenty-three, and so on. All -these are evidently sections, as it were, Three-Dimensional -representations of his Four-Dimensioned being, which is a fixed and -unalterable thing. - -“Scientific people,” proceeded the Time Traveller, after the pause -required for the proper assimilation of this, “know very well that Time -is only a kind of Space. Here is a popular scientific diagram, a -weather record. This line I trace with my finger shows the movement of -the barometer. Yesterday it was so high, yesterday night it fell, then -this morning it rose again, and so gently upward to here. Surely the -mercury did not trace this line in any of the dimensions of Space -generally recognised? But certainly it traced such a line, and that -line, therefore, we must conclude, was along the Time-Dimension.” - -“But,” said the Medical Man, staring hard at a coal in the fire, “if -Time is really only a fourth dimension of Space, why is it, and why has -it always been, regarded as something different? And why cannot we move -in Time as we move about in the other dimensions of Space?” - -The Time Traveller smiled. “Are you so sure we can move freely in -Space? Right and left we can go, backward and forward freely enough, -and men always have done so. I admit we move freely in two dimensions. -But how about up and down? Gravitation limits us there.” - -“Not exactly,” said the Medical Man. “There are balloons.” - -“But before the balloons, save for spasmodic jumping and the -inequalities of the surface, man had no freedom of vertical movement.” - -“Still they could move a little up and down,” said the Medical Man. - -“Easier, far easier down than up.” - -“And you cannot move at all in Time, you cannot get away from the -present moment.” - -“My dear sir, that is just where you are wrong. That is just where the -whole world has gone wrong. We are always getting away from the present -moment. Our mental existences, which are immaterial and have no -dimensions, are passing along the Time-Dimension with a uniform -velocity from the cradle to the grave. Just as we should travel _down_ -if we began our existence fifty miles above the earth’s surface.” - -“But the great difficulty is this,” interrupted the Psychologist. ’You -_can_ move about in all directions of Space, but you cannot move about -in Time.” - -“That is the germ of my great discovery. But you are wrong to say that -we cannot move about in Time. For instance, if I am recalling an -incident very vividly I go back to the instant of its occurrence: I -become absent-minded, as you say. I jump back for a moment. Of course -we have no means of staying back for any length of Time, any more than -a savage or an animal has of staying six feet above the ground. But a -civilised man is better off than the savage in this respect. He can go -up against gravitation in a balloon, and why should he not hope that -ultimately he may be able to stop or accelerate his drift along the -Time-Dimension, or even turn about and travel the other way?” - -“Oh, _this_,” began Filby, “is all—” - -“Why not?” said the Time Traveller. - -“It’s against reason,” said Filby. - -“What reason?” said the Time Traveller. - -“You can show black is white by argument,” said Filby, “but you will -never convince me.” - -“Possibly not,” said the Time Traveller. “But now you begin to see the -object of my investigations into the geometry of Four Dimensions. Long -ago I had a vague inkling of a machine—” - -“To travel through Time!” exclaimed the Very Young Man. - -“That shall travel indifferently in any direction of Space and Time, as -the driver determines.” - -Filby contented himself with laughter. - -“But I have experimental verification,” said the Time Traveller. - -“It would be remarkably convenient for the historian,” the Psychologist -suggested. “One might travel back and verify the accepted account of -the Battle of Hastings, for instance!” - -“Don’t you think you would attract attention?” said the Medical Man. -“Our ancestors had no great tolerance for anachronisms.” - -“One might get one’s Greek from the very lips of Homer and Plato,” the -Very Young Man thought. - -“In which case they would certainly plough you for the Little-go. The -German scholars have improved Greek so much.” - -“Then there is the future,” said the Very Young Man. “Just think! One -might invest all one’s money, leave it to accumulate at interest, and -hurry on ahead!” - -“To discover a society,” said I, “erected on a strictly communistic -basis.” - -“Of all the wild extravagant theories!” began the Psychologist. - -“Yes, so it seemed to me, and so I never talked of it until—” - -“Experimental verification!” cried I. “You are going to verify _that_?” - -“The experiment!” cried Filby, who was getting brain-weary. - -“Let’s see your experiment anyhow,” said the Psychologist, “though it’s -all humbug, you know.” - -The Time Traveller smiled round at us. Then, still smiling faintly, and -with his hands deep in his trousers pockets, he walked slowly out of -the room, and we heard his slippers shuffling down the long passage to -his laboratory. - -The Psychologist looked at us. “I wonder what he’s got?” - -“Some sleight-of-hand trick or other,” said the Medical Man, and Filby -tried to tell us about a conjuror he had seen at Burslem, but before he -had finished his preface the Time Traveller came back, and Filby’s -anecdote collapsed. diff --git a/data/projectsData.ts b/data/projectsData.ts index 7cf8ed1..a593aef 100644 --- a/data/projectsData.ts +++ b/data/projectsData.ts @@ -7,20 +7,10 @@ interface Project { const projectsData: Project[] = [ { - title: 'A Search Engine', - description: `What if you could look up any information in the world? Webpages, images, videos - and more. Google has many features to help you find exactly what you're looking - for.`, - imgSrc: '/static/images/google.png', - href: 'https://www.google.com', - }, - { - title: 'The Time Machine', - description: `Imagine being able to travel back in time or to the future. Simple turn the knob - to the desired date and press "Go". No more worrying about lost keys or - forgotten headphones with this simple yet affordable solution.`, - imgSrc: '/static/images/time-machine.jpg', - href: '/blog/the-time-machine', + title: 'qbit-maid', + description: `Qbittorrent torrent cleaner built in python.`, + imgSrc: '/static/images/qbitmaid.jpg', + href: 'https://git.jonb.io/jblu/qbit-maid', }, ] diff --git a/public/static/images/canada/lake.jpg b/public/static/images/canada/lake.jpg deleted file mode 100644 index 4790472..0000000 Binary files a/public/static/images/canada/lake.jpg and /dev/null differ diff --git a/public/static/images/canada/maple.jpg b/public/static/images/canada/maple.jpg deleted file mode 100644 index 67e7c1e..0000000 Binary files a/public/static/images/canada/maple.jpg and /dev/null differ diff --git a/public/static/images/canada/mountains.jpg b/public/static/images/canada/mountains.jpg deleted file mode 100644 index 282da38..0000000 Binary files a/public/static/images/canada/mountains.jpg and /dev/null differ diff --git a/public/static/images/canada/toronto.jpg b/public/static/images/canada/toronto.jpg deleted file mode 100644 index 28f5169..0000000 Binary files a/public/static/images/canada/toronto.jpg and /dev/null differ diff --git a/public/static/images/github-traffic.png b/public/static/images/github-traffic.png deleted file mode 100644 index 103bb3a..0000000 Binary files a/public/static/images/github-traffic.png and /dev/null differ diff --git a/public/static/images/google.png b/public/static/images/google.png deleted file mode 100644 index 39efd89..0000000 Binary files a/public/static/images/google.png and /dev/null differ diff --git a/public/static/images/ocean.jpeg b/public/static/images/ocean.jpeg deleted file mode 100644 index e3e43b4..0000000 Binary files a/public/static/images/ocean.jpeg and /dev/null differ diff --git a/public/static/images/qbitmaid.jpg b/public/static/images/qbitmaid.jpg new file mode 100644 index 0000000..7d3d412 Binary files /dev/null and b/public/static/images/qbitmaid.jpg differ diff --git a/public/static/images/sparrowhawk-avatar.jpg b/public/static/images/sparrowhawk-avatar.jpg deleted file mode 100644 index 7d09105..0000000 Binary files a/public/static/images/sparrowhawk-avatar.jpg and /dev/null differ diff --git a/public/static/images/time-machine.jpg b/public/static/images/time-machine.jpg deleted file mode 100644 index 32849f2..0000000 Binary files a/public/static/images/time-machine.jpg and /dev/null differ