Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .prettierignore

This file was deleted.

18 changes: 0 additions & 18 deletions .prettierrc.cjs

This file was deleted.

6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ bun run preview # Preview production build locally
bun run build # Production build to ./dist/

# Quality
bun run lint # ESLint check (.js, .ts, .astro files)
bun run lint:fix # Auto-fix lint issues
bun run format # Prettier format all files
bun run lint # Biome check (lint + format) all files
bun run lint:fix # Auto-fix lint and format issues
bun run format # Biome format all files
bun run format:check # Check formatting without writing

# Analysis
Expand Down
12 changes: 12 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.13/schema.json",
"extends": ["ultracite/biome/astro"],
"files": {
"includes": ["**", "!!**/.astro", "!!**/dist"]
},
"css": {
"parser": {
"cssModules": true
}
}
}
595 changes: 46 additions & 549 deletions bun.lock

Large diffs are not rendered by default.

107 changes: 0 additions & 107 deletions eslint.config.js

This file was deleted.

93 changes: 42 additions & 51 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,52 +1,43 @@
{
"name": "personal-website",
"type": "module",
"version": "0.0.1",
"scripts": {
"predev": "node scripts/sync-public-env.js",
"prestart": "node scripts/sync-public-env.js",
"prebuild": "node scripts/sync-public-env.js && node scripts/generate-llms-txt.js",
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"postbuild": "node scripts/generate-headers.js",
"preview": "astro preview",
"astro": "astro",
"optimize": "astro build --experimental-optimize",
"analyze": "astro build --analyze",
"test": "echo \"No tests yet\" && exit 0",
"lint": "eslint . --ext .js,.ts,.astro",
"lint:fix": "eslint . --ext .js,.ts,.astro --fix",
"format": "prettier --write \"**/*.{js,ts,astro,css,md,json}\"",
"format:check": "prettier --check \"**/*.{js,ts,astro,css,md,json}\""
},
"dependencies": {
"@fontsource/playfair-display": "^5.2.8",
"@fontsource/plus-jakarta-sans": "^5.2.8",
"@fontsource/roboto-slab": "^5.2.8",
"astro": "6.0.0-beta.3",
"date-fns": "^4.1.0",
"gsap": "^3.14.2",
"rehype-mermaid": "^3.0.0"
},
"devDependencies": {
"@astrojs/mdx": "^4.3.13",
"@astrojs/sitemap": "^3.7.0",
"@tailwindcss/cli": "^4.1.17",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^22.13.4",
"@typescript-eslint/eslint-plugin": "^8.41.0",
"@typescript-eslint/parser": "^8.41.0",
"astro-eslint-parser": "^1.2.2",
"eslint": "^9.34.0",
"eslint-config-prettier": "^10.1.8",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-astro": "^1.3.1",
"eslint-plugin-import": "^2.32.0",
"playwright": "^1.53.0",
"prettier": "^3.6.2",
"prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.6.14",
"tailwindcss": "^4.1.17"
}
}
"name": "personal-website",
"type": "module",
"version": "0.0.1",
"scripts": {
"predev": "node scripts/sync-public-env.js",
"prestart": "node scripts/sync-public-env.js",
"prebuild": "node scripts/sync-public-env.js && node scripts/generate-llms-txt.js",
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"postbuild": "node scripts/generate-headers.js",
"preview": "astro preview",
"astro": "astro",
"optimize": "astro build --experimental-optimize",
"analyze": "astro build --analyze",
"test": "echo \"No tests yet\" && exit 0",
"lint": "biome check .",
"lint:fix": "biome check . --write",
"format": "biome format . --write",
"format:check": "biome format ."
},
"dependencies": {
"@fontsource/playfair-display": "^5.2.8",
"@fontsource/plus-jakarta-sans": "^5.2.8",
"@fontsource/roboto-slab": "^5.2.8",
"astro": "6.0.0-beta.3",
"date-fns": "^4.1.0",
"gsap": "^3.14.2",
"rehype-mermaid": "^3.0.0"
},
"devDependencies": {
"@astrojs/mdx": "^4.3.13",
"@astrojs/sitemap": "^3.7.0",
"@biomejs/biome": "^2.3.13",
"@tailwindcss/cli": "^4.1.17",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^22.13.4",
"playwright": "^1.53.0",
"tailwindcss": "^4.1.17",
"ultracite": "^7.1.1"
}
}
7 changes: 6 additions & 1 deletion public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ I've always gravitated toward problems where engineering, intelligence, and real
- [The Secret to MCP Servers That LLMs Love Using](https://soumyo.com/blog/the-secret-to-mcp-servers-that-llms-love-using)
The Model Context Protocol revolution requires a shift from engineering to product design thinking—building experiences that transform how work gets done, not just tools that LLMs can use

## Projects

- [Food Blog Platform](https://soumyo.com/projects/food-blog-platform)
A modern food blog platform built with Next.js

## Newsletter

Subscribe to "Stochastic Musings" - Notes on product intuition, engineering systems, and signals from the AI landscape.
Expand All @@ -41,4 +46,4 @@ Subscribe to "Stochastic Musings" - Notes on product intuition, engineering syst

---

This site is built with Astro, optimized for performance and accessibility. Last updated: 2026-01-26
This site is built with Astro, optimized for performance and accessibility. Last updated: 2026-01-29
80 changes: 41 additions & 39 deletions scripts/fix-fonts.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

/**
* This script does the following:
Expand All @@ -12,51 +12,53 @@ import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const FONTS_DIR = path.join(__dirname, '../public/fonts');
const HEADERS_FILE = path.join(__dirname, '../_headers');
const FONTS_DIR = path.join(__dirname, "../public/fonts");
const HEADERS_FILE = path.join(__dirname, "../_headers");

// Function to check if a file is a valid font file
function checkFontFile(fontPath) {
console.log(`Checking font file: ${fontPath}`);
console.log(`Checking font file: ${fontPath}`);

if (!fs.existsSync(fontPath)) {
console.error(`Font file not found: ${fontPath}`);
return false;
}
if (!fs.existsSync(fontPath)) {
console.error(`Font file not found: ${fontPath}`);
return false;
}

// Check file size (should be at least 10KB for a font file)
const stats = fs.statSync(fontPath);
if (stats.size < 10 * 1024) {
console.error(`Font file too small, might be corrupted: ${fontPath} (${stats.size} bytes)`);
return false;
}
// Check file size (should be at least 10KB for a font file)
const stats = fs.statSync(fontPath);
if (stats.size < 10 * 1024) {
console.error(
`Font file too small, might be corrupted: ${fontPath} (${stats.size} bytes)`,
);
return false;
}

// All checks passed
console.log(`Font file looks good: ${fontPath} (${stats.size} bytes)`);
return true;
// All checks passed
console.log(`Font file looks good: ${fontPath} (${stats.size} bytes)`);
return true;
}

// Main function
async function main() {
console.log('Starting font fix...');
console.log("Starting font fix...");

// Create fonts directory if it doesn't exist
if (!fs.existsSync(FONTS_DIR)) {
console.log(`Creating fonts directory: ${FONTS_DIR}`);
fs.mkdirSync(FONTS_DIR, { recursive: true });
}
// Create fonts directory if it doesn't exist
if (!fs.existsSync(FONTS_DIR)) {
console.log(`Creating fonts directory: ${FONTS_DIR}`);
fs.mkdirSync(FONTS_DIR, { recursive: true });
}

// Check for Inter variable font
const interVarPath = path.join(FONTS_DIR, 'inter-var.woff2');
const _interVarExists = checkFontFile(interVarPath);
// Check for Inter variable font
const interVarPath = path.join(FONTS_DIR, "inter-var.woff2");
const _interVarExists = checkFontFile(interVarPath);

// Add headers file with CORS settings
console.log('Adding CORS headers for font files...');
// Add headers file with CORS settings
console.log("Adding CORS headers for font files...");

// Create or update _headers file in the root directory for Netlify
fs.writeFileSync(
HEADERS_FILE,
`
// Create or update _headers file in the root directory for Netlify
fs.writeFileSync(
HEADERS_FILE,
`
# CORS headers for font files
/fonts/*
Access-Control-Allow-Origin: *
Expand All @@ -70,13 +72,13 @@ async function main() {
Access-Control-Allow-Headers: Content-Type
Cache-Control: public, max-age=31536000, immutable
`,
);
);

console.log('Headers file created/updated.');
console.log('Font fix script completed.');
console.log("Headers file created/updated.");
console.log("Font fix script completed.");
}

main().catch((err) => {
console.error('Error:', err);
process.exit(1);
console.error("Error:", err);
process.exit(1);
});
Loading