Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
1ea4751
build(deps): update project configuration and dependencies
dandedotdev Feb 19, 2026
8e24c8a
chore(deps): add `.mise.toml` for tool configuration with Node.js and…
dandedotdev Feb 19, 2026
17e81ce
chore(config): add `.editorconfig` for consistent coding styles acros…
dandedotdev Feb 19, 2026
bfcccc2
chore(config): add Prettier and ESLint configurations for improved co…
dandedotdev Feb 19, 2026
78ff606
chore(config): add Markdown linting configuration and ignore file for…
dandedotdev Feb 19, 2026
b091d10
build(nextjs): enable React compiler in Next.js configuration for imp…
dandedotdev Feb 19, 2026
2917ba4
chore(config): update TypeScript configuration with new options and s…
dandedotdev Feb 19, 2026
70cdadc
style(*): format files
dandedotdev Feb 19, 2026
b6e9b24
feat(blog): revise the content as personal blog
dandedotdev Feb 19, 2026
e0c89bc
chore(config): add MCP and worktree configuration files for Cursor
dandedotdev Feb 19, 2026
81c28fd
chore(config): add VSCode settings and recommended extensions for imp…
dandedotdev Feb 19, 2026
bc7bf9e
chore(config): update `.gitignore` to include AI-related directories
dandedotdev Feb 19, 2026
11a2077
chore(github): add `CODEOWNERS` file
dandedotdev Feb 19, 2026
4949ca0
chore(license): add MIT License file
dandedotdev Feb 19, 2026
3693093
chore(github): add Dependabot configuration for weekly npm updates
dandedotdev Feb 19, 2026
38a1f4f
chore(github): add CI workflow for pull requests with linting and dep…
dandedotdev Feb 19, 2026
57749e2
chore(github): add workflow to check for secrets in pull requests
dandedotdev Feb 19, 2026
c1bccbc
fix(*): update as code review suggestions
dandedotdev Feb 19, 2026
a4c5ecd
chore(config): add initial configuration for Coderabbit integration
dandedotdev Feb 19, 2026
4e67c32
fix(*): update as code review suggestions
dandedotdev Feb 19, 2026
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
27 changes: 27 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
# yaml template to refer to https://docs.coderabbit.ai/reference/yaml-template#enterprise

language: en-US

reviews:
profile: assertive
auto_review:
enabled: true
drafts: false
collapse_walkthrough: false
high_level_summary: true
high_level_summary_in_walkthrough: true
finishing_touches:
docstrings:
enabled: false
unit_tests:
enabled: false
in_progress_fortune: true
poem: true
request_changes_workflow: true
sequence_diagrams: true
suggested_reviewers: false

issue_enrichment:
auto_enrich:
enabled: true
8 changes: 8 additions & 0 deletions .cursor/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
}
}
}
3 changes: 3 additions & 0 deletions .cursor/worktrees.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"setup-worktree": ["pnpm install", "cp $ROOT_WORKTREE_PATH/.env .env"]
}
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# Matches all files
[*]
end_of_line = lf
insert_final_newline = true
indent_size = 2
indent_style = space
max_line_length = 80
trim_trailing_whitespace = true

# Matches all Markdown files
[*.md]
trim_trailing_whitespace = false
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
##########################
#### CODE OWNER BLOCK ####
##########################

* @dandedotdev
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
25 changes: 25 additions & 0 deletions .github/workflows/check-secrets.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Check Secrets

on:
pull_request:
branches:
- "**"
workflow_dispatch:

jobs:
check-secrets:
runs-on: ubuntu-latest

steps:
- name: Git checkout
uses: actions/checkout@v4

- name: Install Git Secrets
run: |
sudo apt-get update -y
sudo apt-get install -y git-secrets

- name: Scan for secrets
run: |
git secrets --register-aws
git secrets --scan
87 changes: 87 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: CI workflow

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

env:
NODE_VERSION: 25.3.0
PNPM_VERSION: 10.30.0

on:
pull_request:
branches:
- "**"
workflow_dispatch:

jobs:
init:
name: Initial Common Steps
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache.outputs.cache-hit }}

steps:
- name: Git checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}

- name: Cache dependencies
id: cache
uses: actions/cache@v4
with:
path: |
node_modules
~/.pnpm-store
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}

- name: Install dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: pnpm install --frozen-lockfile

lint:
name: Lint
runs-on: ubuntu-latest
needs: init

steps:
- name: Git checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}

- name: Cache dependencies
id: cache
uses: actions/cache@v4
with:
path: |
node_modules
~/.pnpm-store
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}

- name: Install dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: pnpm install --frozen-lockfile

- name: Run Type Check
run: pnpm type-check

- name: Run linters
run: pnpm lint
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.


# =================================== #
# AI #
# =================================== #

.agents/skills
.claude/skills
.cursor/*
!.cursor/mcp.json
!.cursor/worktrees.json


# dependencies
/node_modules
/.pnp
Expand Down
5 changes: 5 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"MD013": false,
"MD040": false,
"MD041": false
}
1 change: 1 addition & 0 deletions .markdownlintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/node_modules
3 changes: 3 additions & 0 deletions .mise.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[tools]
node = "25.3.0"
pnpm = "10.30.0"
37 changes: 37 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# =================================== #
# AI #
# =================================== #

.agents
.claude
.cursor


# =================================== #
# MISC
# =================================== #

.DS_Store


# =================================== #
# Next.js
# =================================== #

.next
.cache
*.local
dist
dist-ssr
pnpm-lock.yaml
public
node_modules
next-env.d.ts
next.config.ts


# =================================== #
# Testing
# =================================== #

**/coverage
15 changes: 15 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"recommendations": [
"streetsidesoftware.code-spell-checker",
"fill-labs.dependi",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"yzhang.markdown-all-in-one",
"shd101wyy.markdown-preview-enhanced",
"esbenp.prettier-vscode",
"yoavbls.pretty-ts-errors",
"kisstkondoros.vscode-gutter-preview",
"DavidAnson.vscode-markdownlint",
"bradlc.vscode-tailwindcss"
]
}
20 changes: 17 additions & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
{
"files.associations": {
"wrangler.json": "jsonc"
}
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.markdownlint": "explicit",
"source.fixAll.prettier": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
},
"files.associations": {
"wrangler.json": "jsonc"
},
"json.schemaDownload.enable": false,
"terminal.integrated.suggest.enabled": true,
"workbench.editor.customLabels.patterns": {
"**/index.*": "${dirname} (index)",
"**/layout.tsx": "${dirname} (layout)",
"**/page.tsx": "${dirname} (page)"
}
}
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 dandedotdev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
39 changes: 39 additions & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type { Metadata } from "next"
import { Geist, Geist_Mono } from "next/font/google"

import "@/styles/globals.css"

const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
})

const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
})

export const metadata: Metadata = {
title: "Dandelion Huang",
description:
"Full-stack Engineer focused on building scalable applications with seamless user experiences, using React and Rust, with a focus on AI and System Design.",
}

export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
return (
<html lang="en">
<head>
<link href="/favicon.ico" rel="icon" type="image/x-icon"></link>
</head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
</body>
</html>
)
}
Loading
Loading