Skip to content

Commit c750cf0

Browse files
committed
feat: initialize Next.js resume site with GitHub Pages deployment workflow
- Added deployment workflow to GitHub Pages. - Included initial project structures such as README, .gitignore, and configuration files. - Composed resume content and structure with achievements, professional experience, and personal information formatted for display.
1 parent e975f0f commit c750cf0

File tree

155 files changed

+3318
-21
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

155 files changed

+3318
-21
lines changed

.github/workflows/deploy.yml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: Deploy Next.js site to Pages
2+
3+
on:
4+
# Runs on pushes targeting the main branch
5+
push:
6+
branches:
7+
- main
8+
9+
# Allows you to run this workflow manually from the Actions tab
10+
workflow_dispatch:
11+
12+
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
13+
permissions:
14+
contents: read
15+
pages: write
16+
id-token: write
17+
18+
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
19+
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
20+
concurrency:
21+
group: "pages"
22+
cancel-in-progress: false
23+
24+
jobs:
25+
build:
26+
runs-on: ubuntu-latest
27+
steps:
28+
- name: Checkout
29+
uses: actions/checkout@v4
30+
31+
- uses: pnpm/action-setup@v4
32+
name: Install pnpm
33+
with:
34+
version: 10
35+
run_install: false
36+
37+
- name: Install Node.js
38+
uses: actions/setup-node@v4
39+
with:
40+
node-version: 22
41+
cache: 'pnpm'
42+
43+
- name: Install dependencies
44+
run: pnpm install
45+
46+
- name: Setup Pages
47+
id: setup_pages
48+
uses: actions/configure-pages@v5
49+
50+
- name: Restore cache
51+
uses: actions/cache@v4
52+
with:
53+
path: |
54+
.next/cache
55+
# Generate a new cache whenever packages or source files change.
56+
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
57+
# If source files changed but packages didn't, rebuild from a prior cache.
58+
restore-keys: |
59+
${{ runner.os }}-nextjs-${{ hashFiles('**/pnpm-lock.yaml') }}-
60+
61+
- name: Build with Next.js
62+
run: pnpm run build
63+
env:
64+
PAGES_BASE_PATH: ${{ steps.setup_pages.outputs.base_path }}
65+
66+
- name: Upload artifact
67+
uses: actions/upload-pages-artifact@v3
68+
with:
69+
path: ./out
70+
71+
deploy:
72+
environment:
73+
name: github-pages
74+
url: ${{ steps.deployment.outputs.page_url }}
75+
runs-on: ubuntu-latest
76+
needs: build
77+
steps:
78+
- name: Deploy to GitHub Pages
79+
id: deployment
80+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.*
7+
.yarn
8+
.yarnrc.yml
9+
.npmrc
10+
package-lock*
11+
yarn.lock
12+
pnpm-lock*
13+
14+
# testing
15+
/coverage
16+
17+
# next.js
18+
/.next/
19+
/out/
20+
21+
# production
22+
/build
23+
24+
# misc
25+
.DS_Store
26+
*.pem
27+
28+
# debug
29+
npm-debug.log*
30+
yarn-debug.log*
31+
yarn-error.log*
32+
33+
# local env files
34+
.env.local
35+
.env.development.local
36+
.env.test.local
37+
.env.production.local
38+
.env
39+
40+
# vercel
41+
.vercel
42+
43+
# PWA workers
44+
**/public/workbox-*.js
45+
**/public/sw.js
46+
**/public/worker-*.js
47+
48+
# other
49+
tsconfig.tsbuildinfo
50+
51+
# Contentlayer
52+
.contentlayer

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lts/*

.syncpackrc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"dependencyTypes": [
3+
"prod",
4+
"dev"
5+
],
6+
"semverGroups": [
7+
{
8+
"label": "use exact version numbers in production",
9+
"packages": [
10+
"**"
11+
],
12+
"dependencyTypes": [
13+
"prod"
14+
],
15+
"dependencies": [
16+
"**"
17+
],
18+
"range": ""
19+
},
20+
{
21+
"label": "use exact version numbers in dev",
22+
"packages": [
23+
"**"
24+
],
25+
"dependencyTypes": [
26+
"dev"
27+
],
28+
"dependencies": [
29+
"**"
30+
],
31+
"range": ""
32+
}
33+
]
34+
}

LICENSE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Copyright (c) 2025 Qiang Li
2+
3+
The [MIT License](https://opensource.org/license/mit) except for my personal data in the source files.

README.md

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,58 @@
1-
# site
1+
# Qiang Li
2+
3+
This is a resume written in Next.js which can be deployed to GitHub Pages as a static site.
4+
5+
It is created with the help from a custom build of [Continue](https://github.com/openaide/awesome/tree/main/docker/continue) and the command line tool [AI](https://github.com/qiangli/ai) based on the repos listed in the credits section.
6+
7+
`Continue` is used for general coding advices and `AI` is used for converting screenshots into html/css for some of the initial content.
8+
9+
## Live resume site
10+
11+
[http://qiang.li/](http://qiang.li)
12+
13+
## Build and Run
14+
15+
Build locally
16+
17+
```bash
18+
npm install
19+
npm run format
20+
npm run lint
21+
npm run build
22+
```
23+
24+
Serve the out/ directory locally after the build
25+
26+
```bash
27+
go run server/main.go
28+
```
29+
30+
Visit http://localhost:8080/
31+
32+
33+
## Credits
34+
35+
Next.js Template
36+
37+
+ [https://github.com/nextjs/deploy-github-pages](https://github.com/nextjs/deploy-github-pages)
38+
39+
Cool Resume Repos
40+
41+
+ [https://github.com/colinhemphill/nextjs-resume](https://github.com/colinhemphill/nextjs-resume)
42+
43+
+ [https://github.com/guilhermeborgesbastos/live-resume](https://github.com/guilhermeborgesbastos/live-resume)
44+
45+
+ [https://github.com/tthugy/resume-template-nextJS](https://github.com/tthugy/resume-template-nextJS)
46+
47+
Cool Icons
48+
49+
+ [https://icons.getbootstrap.com/](https://icons.getbootstrap.com/)
50+
51+
+ [https://simpleicons.org/](https://simpleicons.org/)
52+
53+
+ [https://fontawesome.com/](https://fontawesome.com/)
54+
55+
56+
## License
57+
58+
MIT LICENSE except for my personal information in the source files. Feel free to use this repo as your starting point.

contentlayer.config.ts

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import {
2+
defineDocumentType,
3+
defineNestedType,
4+
makeSource,
5+
} from 'contentlayer2/source-files';
6+
7+
export const Personal = defineDocumentType(() => ({
8+
name: 'Personal',
9+
filePathPattern: 'personal.md',
10+
isSingleton: true,
11+
fields: {
12+
givenName: {
13+
type: 'string',
14+
description: 'Your first name or given name',
15+
required: true,
16+
},
17+
familyName: {
18+
type: 'string',
19+
description: 'Your last name or family name',
20+
required: true,
21+
},
22+
title: {
23+
type: 'string',
24+
description: 'Your current job title or a short description of your goal',
25+
required: false,
26+
},
27+
location: {
28+
type: 'string',
29+
description:
30+
'Your general location of residence, not your personal address',
31+
required: false,
32+
},
33+
},
34+
}));
35+
36+
export const ProfessionalTitle = defineNestedType(() => ({
37+
name: 'ProfessionalTitle',
38+
fields: {
39+
title: {
40+
type: 'string',
41+
description: 'A title at this organization',
42+
required: false,
43+
},
44+
startDate: {
45+
type: 'string',
46+
description: 'The year when you started the role',
47+
required: false,
48+
},
49+
endDate: {
50+
type: 'string',
51+
description:
52+
'The year when you ended the role, or empty if it is your current role',
53+
required: false,
54+
},
55+
description: {
56+
type: 'string',
57+
description:
58+
'A description of the work you did under this role, or your accomplishments that led to a promotion',
59+
required: false,
60+
},
61+
},
62+
}));
63+
64+
export const ProfessionalExperience = defineDocumentType(() => ({
65+
name: 'ProfessionalExperience',
66+
filePathPattern: 'professional-experiences/*.md',
67+
fields: {
68+
organization: {
69+
type: 'string',
70+
description: 'The name of the company or organization you worked with',
71+
required: false,
72+
},
73+
titles: {
74+
type: 'list',
75+
of: ProfessionalTitle,
76+
required: true,
77+
},
78+
tags: {
79+
type: 'list',
80+
of: { type: 'string' },
81+
required: false,
82+
},
83+
},
84+
}));
85+
86+
export const Achievement = defineDocumentType(() => ({
87+
name: 'Achievement',
88+
filePathPattern: 'achievements/*.md',
89+
fields: {
90+
achievement: {
91+
type: 'string',
92+
description:
93+
'The name of the degree or certification of your achievement',
94+
required: false,
95+
},
96+
organization: {
97+
type: 'string',
98+
description:
99+
'The name of the school, organization, or program you earned your achievement from',
100+
required: false,
101+
},
102+
completionYear: {
103+
type: 'number',
104+
description: 'The year you earned your achievement',
105+
required: false,
106+
},
107+
},
108+
}));
109+
110+
export const AdditionalInfo = defineDocumentType(() => ({
111+
name: 'AdditionalInfo',
112+
filePathPattern: 'additional-items/*.md',
113+
isSingleton: false,
114+
fields: {
115+
title: {
116+
type: 'string',
117+
description: 'The name of the additional info section',
118+
required: false,
119+
},
120+
},
121+
}));
122+
123+
export const PrivateField = defineDocumentType(() => ({
124+
name: 'PrivateField',
125+
filePathPattern: 'private-fields/*.md',
126+
fields: {
127+
label: {
128+
type: 'string',
129+
description: 'A label to describe the private field',
130+
required: false,
131+
},
132+
},
133+
}));
134+
135+
export default makeSource({
136+
contentDirPath: 'edit-me/content',
137+
documentTypes: [
138+
Personal,
139+
ProfessionalExperience,
140+
Achievement,
141+
AdditionalInfo,
142+
PrivateField,
143+
],
144+
});

0 commit comments

Comments
 (0)