Skip to content

Commit ebe991e

Browse files
committed
update blog
1 parent a12f5ff commit ebe991e

File tree

5 files changed

+76
-10
lines changed

5 files changed

+76
-10
lines changed

app/components/MarkdownContent.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const markdownStyles = {
3737
ol: '[&_ol]:list-decimal [&_ol]:pl-6 [&_ol]:mb-6',
3838
li: '[&_li]:mb-2',
3939
},
40+
blockquotes:
41+
'[&_blockquote]:border-l-4 [&_blockquote]:border-gray-300 [&_blockquote]:dark:border-gray-600 [&_blockquote]:pl-4 [&_blockquote]:mb-4 [&_blockquote]:italic [&_blockquote]:font-inter [&_blockquote]:text-gray-700/75 [&_blockquote]:dark:text-gray-200/75',
4042
}
4143

4244
interface MarkdownContentProps
@@ -54,6 +56,7 @@ export function MarkdownContent({ html, className, variant, ...props }: Markdown
5456
markdownStyles.links,
5557
Object.values(markdownStyles.headings).join(' '),
5658
Object.values(markdownStyles.lists).join(' '),
59+
markdownStyles.blockquotes,
5760
'mb-12',
5861
className
5962
)}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { SVGProps } from 'react'
2+
3+
export function LinkIcon(props: SVGProps<SVGSVGElement>) {
4+
return (
5+
<svg
6+
width="24"
7+
height="24"
8+
viewBox="0 0 24 24"
9+
fill="none"
10+
stroke="currentColor"
11+
strokeWidth="2"
12+
strokeLinecap="round"
13+
strokeLinejoin="round"
14+
{...props}
15+
>
16+
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" />
17+
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />
18+
</svg>
19+
)
20+
}

app/components/ShareButtons/index.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useState } from 'react'
2-
import { CopyIcon } from './icons/CopyIcon'
2+
import { LinkIcon } from './icons/LinkIcon'
33
import { TwitterIcon } from './icons/TwitterIcon'
44
import { LinkedInIcon } from './icons/LinkedInIcon'
55
import { BlueskyIcon } from './icons/BlueskyIcon'
@@ -50,45 +50,45 @@ export function ShareButtons({ url, title }: ShareButtonsProps) {
5050
<div className="flex flex-wrap gap-2">
5151
<button
5252
onClick={() => handleShare('reddit')}
53-
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors"
53+
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors cursor-pointer"
5454
aria-label="Share on Reddit"
5555
>
5656
<RedditIcon className="w-5 h-5" />
5757
</button>
5858

5959
<button
6060
onClick={() => handleShare('linkedin')}
61-
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors"
61+
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors cursor-pointer"
6262
aria-label="Share on LinkedIn"
6363
>
6464
<LinkedInIcon className="w-5 h-5" />
6565
</button>
6666

6767
<button
6868
onClick={() => handleShare('bluesky')}
69-
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors"
69+
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors cursor-pointer"
7070
aria-label="Share on Bluesky"
7171
>
7272
<BlueskyIcon className="w-5 h-5" />
7373
</button>
7474

7575
<button
7676
onClick={() => handleShare('twitter')}
77-
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors"
77+
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors cursor-pointer"
7878
aria-label="Share on Twitter"
7979
>
8080
<TwitterIcon className="w-5 h-5" />
8181
</button>
8282

8383
<button
8484
onClick={handleCopy}
85-
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors relative"
85+
className="p-2 rounded-lg bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 transition-colors cursor-pointer relative"
8686
aria-label="Copy link to clipboard"
8787
>
88-
<CopyIcon className="w-5 h-5" />
88+
<LinkIcon className="w-5 h-5" />
8989
{copied && (
9090
<span className="absolute -top-8 left-1/2 transform -translate-x-1/2 bg-gray-800 dark:bg-gray-200 text-white dark:text-gray-800 text-xs px-2 py-1 rounded">
91-
Copied!
91+
URL Copied!
9292
</span>
9393
)}
9494
</button>

app/utils/markdown.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,31 @@ const md = new MarkdownIt({
66
typographer: true,
77
})
88

9+
const defaultRender =
10+
md.renderer.rules.link_open ||
11+
function (tokens, idx, options, env, renderer) {
12+
return renderer.renderToken(tokens, idx, options)
13+
}
14+
15+
md.renderer.rules.link_open = function (tokens, idx, options, env, renderer) {
16+
const token = tokens[idx]
17+
const hrefIndex = token.attrIndex('href')
18+
19+
if (hrefIndex >= 0) {
20+
const href = token.attrs![hrefIndex][1]
21+
22+
// Check if it's an external link (starts with http/https and not our domain)
23+
if (href.startsWith('http') && !href.includes('mawburn.com')) {
24+
// Add target="_blank"
25+
token.attrSet('target', '_blank')
26+
// Add rel="noopener noreferrer" for security and SEO
27+
token.attrSet('rel', 'noopener noreferrer')
28+
}
29+
}
30+
31+
return defaultRender(tokens, idx, options, env, renderer)
32+
}
33+
934
export const markdownToHtml = (markdown: string): string => {
1035
return md.render(markdown)
1136
}

content/blog/2025-12-31-how-i-ai.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
2-
title: 'How I use AI in my workflow'
2+
title: 'How I use Claude Code'
33
date: '2025-12-31 16:00'
44
image: '2025-12-31-shopify-ai-chat.webp'
5-
excerpt: 'How I use AI tooling in my everyday workflow as a software engineer.'
5+
excerpt: 'How I use Claude Code and other AI tooling in my everyday workflow as a software engineer.'
66
tags:
77
[
88
'AI tools',
@@ -14,3 +14,21 @@ tags:
1414
'vibe coding',
1515
]
1616
---
17+
18+
I'm not ashamed to admit it, but my workflow is almost entirely AI driven now. But this is a culmination of using it heavily since around the time **GPT-4** was released, all the way back in the ancestral times of March **2023**. Since then, I've used just about every major model and molded my workflow around it.
19+
20+
## How it began
21+
22+
I can clearly remember when it all started. I had broken my dominant hand's wrist and was using it to write a random name generator for tabletop gaming since I couldn't type very well. I was using JavaScript, since that's what I gravitate towards, and was having trouble parsing through multi-gigabyte CSV files of common and fictional names to build [Markov chains](https://en.wikipedia.org/wiki/Markov_chain). Unsurprisingly, JS was taking upwards of 15 to 20 **minutes** to process the files. Every time I would stick something in there and try to speed it up, ChatGPT would say something like:
23+
24+
> You should use Python, it has libraries that will make it faster.
25+
26+
And for a while I ignored it... until I didn't and I let it write Python script to do it, and it dropped it from 15 minutes to 15 seconds. Then I was sold.
27+
28+
From there, I was using it to generate tests, write snippets of code, and just about basically everything I could figure out a use case for.
29+
30+
## How it's going
31+
32+
Almost my entire life is driven by AI at this point, especially coding. I've had ChatGPT plan a vacation itinerary for me and my family back in June, I'm currently playing with Claude's Research to pick stocks _(for fun)_ which has so far been turning a profit, and I've experimented with it for dozens of other things. But what really changed things for work and code in general, was [Claude Code](https://www.anthropic.com/claude-code), that's really where the magic is happening now.
33+
34+
If you're not familiar with it, it's a command line application that uses [agentic workflows](https://claude.ai/share/88fb030c-ce12-4072-b3ec-6fa402936f44) that will take crunch through your codebase and gather all the context it needs, then systematically solve the task you've given it. From day one of using Claude Code, it was a game changer and it's consistently gotten better since. I know there are a lot of naysayers out there who don't believe in these tools because they've used them and they didn't work well, gave messy code, or any number of other (legitimate) reasons, but hard reality the power is really in the developer. All AI is just a tool, just like your code editor is a tool, or the developer console is a tool. Claude Code is f'ing **incredible**, but it's **still just a tool**.

0 commit comments

Comments
 (0)