Build your student or internship website

Back to Resources

Goal: make your own site, work on your computer, and publish a checked update. The commands below use Windows PowerShell. Git commands also work on macOS and Linux.

New to version control? Complete Git and GitHub basics first.

Contents

  1. Choose a starter
  2. Clone your repository
  3. Change your name and website address
  4. Set up publishing
  5. Add your work and meeting notes
  6. Preview on your computer
  7. Save and upload an update
  8. Fix common problems

1. Choose a starter

StarterUse it forMain files to edit
2026studentMaster’s and PhD studentsdocs/_config.yml, docs/_semesters/, docs/_showcases/
2026internVisiting research internsdocs/_config.yml, docs/_highlights/

Both starters use meetings/ for private meeting source files. Both publish the website from docs/ with GitHub Actions. The internship starter is named 2026intern on GitHub.

A repository is the project folder stored on GitHub. A clone is a copy on your computer. A commit is a saved set of changes. A push uploads those commits.

  1. Install Git and VS Code.
  2. Sign in to your GitHub account. Accept the lab repository invitation.
  3. Ask the professor which repository belongs to you. Keep meeting source files in a private repository. Its published Pages website can still be public.
  4. Use the repository already made for you. Use the next optional section only when creating a new site.

If you need a new repository

These starters are not currently marked as GitHub template repositories, so a Use this template button may not appear.

  1. Create an empty, private repository under the owner agreed with the professor. Do not add a README, license, or .gitignore during creation.
  2. Use a short name such as 2026yourname. Replace YOUR-OWNER and 2026yourname below with the real owner and repository name.
  3. Run this example for the internship starter. For a graduate site, replace 2026intern.git with 2026student.git in the first command.
git clone https://github.com/hendrisutrisno/2026intern.git 2026yourname
cd 2026yourname
git remote set-url origin https://github.com/YOUR-OWNER/2026yourname.git
git remote -v
code .
  1. Check that both origin URLs show your new repository, not the starter. This keeps your future uploads in your own repository.
  2. In this new copy only, remove sample .rst notes from meetings/. Keep _templates/regular-meeting.rst and scripts/build_protected_meetings.py.
  3. Complete sections 3 and 4 below. Then commit your changes and run git push -u origin main for the first upload.

If the destination already has files or history, clone that destination instead. Do not replace its history or use a force push.

Source: Git remote commands.

2. Clone your repository

Skip this step if you just cloned a starter for a new site.

  1. Open your own repository on GitHub.
  2. Select Code, choose HTTPS, and copy the address.
  3. Open PowerShell in the folder where you keep projects.
  4. Replace the example address below with the address you copied.
git clone https://github.com/YOUR-OWNER/2026yourname.git
cd 2026yourname
git remote -v
git branch --show-current
code .
  1. Complete GitHub sign-in if a browser window opens. Do not enter your normal GitHub password into Git commands.
  2. If code is not found, open VS Code and select File > Open Folder. Open the cloned folder.

Check: you can see .github, docs, meetings, and _templates in the project. An empty meetings folder may be created when you add your first note.

Source: Clone a repository.

3. Change your name and website address

  1. Open both _config.yml and docs/_config.yml.
  2. Set url to the website owner’s address, without a final slash.
  3. Set baseurl to a slash followed by the exact repository name.
url: "https://YOUR-OWNER.github.io"
baseurl: "/2026yourname"

For example, a repository owned by hendrisutrisno and named 2026aroy uses url: "https://hendrisutrisno.github.io" and baseurl: "/2026aroy".

  1. In the student starter, edit the existing student: block in both files. Keep the two-space indentation.
student:
  name: "Your Full Name"
  degree: "Master's Student"
  lab: "CSDI Lab"
  university: "National Taipei University of Technology"
  joined: "2026"
  interests: "Your research topic"
  summary: "Two short sentences about your research."
  1. In the internship starter, edit the existing intern: block in both files.
intern:
  name: "Your Full Name"
  program: "TEEP Research Internship"
  lab: "CSDI Lab"
  university: "National Taipei University of Technology"
  home_university: "Your Home University"
  country: "Your Country"
  stay: "August 2026 - January 2027"
  focus: "Your research topic"
  summary: "Two short sentences about your internship."
  looking_back: ""
  1. Keep the other configuration fields. Do not replace the whole file with these short examples.
  2. In the student starter’s root configuration, also update github_owner and repository_branch if they are present.
  3. Use VS Code search to find /2026student or /2026intern. Change old website paths to your own base URL. Do not change links that are meant to point to the original starter repository.

Check: names and addresses match in both configuration files. YAML uses spaces, not tabs. Your name is a value inside the correct student: or intern: block.

4. Set up publishing

Ask the repository owner to complete any setting you cannot open.

  1. On GitHub, open Settings > Secrets and variables > Actions.
  2. Create a repository secret named MEETING_PASSWORD. Enter the password agreed privately with your supervisor. Do not put it in a file, screenshot, commit, or tutorial.
  3. This secret is required even when there are no meeting notes.
  4. Open Settings > Pages. Set the publishing source to GitHub Actions.
  5. Open .github/workflows/publish.yml. Its push branch must match the repository’s default branch. The starters use main.
  6. Keep the existing steps that generate meeting pages, build ./docs, upload the artifact, and deploy Pages. Do not publish the repository root.
  7. After your first push, open Actions. Select Publish graduate journey or Publish intern journey. Wait for build and deploy to finish successfully.
  8. Open the website address shown by Settings > Pages, normally https://YOUR-OWNER.github.io/2026yourname/.

GitHub Pages for private repositories needs a supported GitHub plan. Keep the source private; ask the owner to check the plan if Pages is unavailable.

Sources: Pages settings, repository secrets, Pages access.

5. Add your work and meeting notes

Graduate student site

  1. Edit files in docs/_semesters/ for your semester progress. Copy _templates/semester.md when you need another semester.
  2. Add project reports in docs/_showcases/. Start from _templates/showcase.md.
  3. Keep the YAML section between the two --- lines. Change its title, date, summary, and links.
  4. Put approved public images in docs/assets/photos/. Use paths such as /assets/photos/my-project.jpg in the file’s image field.
  5. Remove an optional image field when you do not have that image. Do not leave a path to a missing sample file.

Internship site

  1. Edit the sample files in docs/_highlights/ to describe your real work and life in Taiwan.
  2. For a new entry, copy docs/_templates/monthly-highlight.md into docs/_highlights/. Use a dated name such as 2026-11-02-first-experiment.md.
  3. Set the date, research, taiwan, and learning fields. The supplied template has a monthly name; you can still use an actual weekly or two-week start date.
  4. Replace fictional sample text. Remove demo: true from an entry when it describes real work. Set the site’s demo setting to false after replacing the sample entries.
  5. Share only photos and research details approved for public viewing.

Before every meeting

  1. Copy _templates/regular-meeting.rst to meetings/YYYY-MM-DD.rst. Use the actual meeting date, for example meetings/2026-11-07.rst.
  2. Replace YOUR_NAME and the date in the file. Fill in progress, evidence, learning, and questions before the meeting.
  3. After the meeting, add decisions and next steps.
  4. Save private meeting images under meetings/assets/. The image path inside the note is relative, for example assets/2026-11-07-results.png.
  5. Keep raw notes and private images outside docs/. The build creates encrypted HTML for the public site. Meeting dates are public.
  6. Do not commit a generated dated HTML page under docs/meetings/.

For an image, use this reStructuredText format:

.. figure:: assets/2026-11-07-results.png
   :alt: Result from the first experiment
   :width: 720px

   A short description of the result.

6. Preview on your computer

You can edit locally and let GitHub Actions build the site. Use the following extra steps when you need a local website preview. Jekyll needs Ruby; installing Python alone is not enough.

  1. Install Ruby with the build tools. On Windows, follow Jekyll’s RubyInstaller steps. On other systems, use the Jekyll installation guide.
  2. Open a new terminal in your repository. Install Jekyll. Windows also needs timezone data.
gem install jekyll tzinfo-data
  1. Add .preview-site/ and .jekyll-cache/ to .gitignore if they are missing. Keep .venv/ there too if you create a Python environment.
  2. Run this command from the repository root:
jekyll serve --source docs --config docs/_config.yml --destination .preview-site
  1. Open http://127.0.0.1:4000/2026yourname/, using the repository name from your baseurl. Check your name, images, links, and small-screen layout. Press Ctrl+C to stop the preview.
  2. Restart Jekyll after editing a configuration file. Use the same baseurl for local and published pages so you can check the real project paths.

To preview encrypted meeting pages too, first create a Python venv and install the generator’s dependencies:

python -m pip install "docutils>=0.20,<0.23" "cryptography>=43,<48"

Set MEETING_PASSWORD only for this terminal, using hidden input. The following PowerShell commands do not put the password text in your command history:

$meetingCredential = Get-Credential -UserName "meeting-preview" -Message "Enter the meeting password"
$env:MEETING_PASSWORD = $meetingCredential.GetNetworkCredential().Password
python scripts/build_protected_meetings.py
Remove-Item Env:MEETING_PASSWORD
Remove-Variable meetingCredential

Run Jekyll after generation. Open http://127.0.0.1:4000/2026yourname/meetings/, select a date, and test the password. Do not upload .preview-site/, Python environments, or generated meeting HTML.

Sources: Jekyll commands, build options.

7. Save and upload an update

Use this routine each time. For the very first upload to a new empty repository, skip git pull and use git push -u origin main at the end.

git status
git pull --ff-only
  1. Finish or save existing local work before pulling. If Git reports a conflict, stop and ask for help. Do not use a force push.
  2. Edit and save your files. Check them in VS Code.
  3. Run git diff. Read each change.
  4. Stage only the files you changed. This is one example; replace its paths with your real files:
git add _config.yml docs/_config.yml meetings/2026-11-07.rst
git diff --staged
git commit -m "Update my profile and meeting note"
git push
  1. Open Actions on GitHub. Wait for a successful deployment.
  2. Open your site and /meetings/. Test the new content. If the old page remains, reload without the browser cache.

Check before every commit: no password, .venv/, .preview-site/, _site/, cache file, or unapproved private data is staged.

Source: Git push.

8. Fix common problems

ProblemDo this
Git says Author identity unknownSet this repository’s identity with git config user.name "Your Full Name" and git config user.email "YOUR-GITHUB-VERIFIED-EMAIL". Use your verified email or GitHub no-reply address. Retry the commit.
GitHub says repository not foundSign in with the invited account. Accept the invitation and check the copied URL.
The page has plain, joined text or missing coloursCheck url and baseurl in both configs. In the browser, confirm the CSS URL uses your repository path.
Your name did not changeEdit docs/_config.yml, not just the root config. Check the last deployment.
A build says Missing MEETING_PASSWORDAsk the repository owner to set the Actions secret with that exact name.
Jekyll shows a YAML errorCheck spaces, quotes, and the --- lines. Read the file and line number in the log.
A meeting page fails to buildCheck its real date and YYYY-MM-DD.rst filename. Check private image paths.
git push is rejectedFetch or pull the latest work, then resolve the difference with help. Do not force push.
Pages does not updateOpen Actions, select the latest run, and read the first failed step. Check that Pages uses GitHub Actions.
Jekyll reports cannot load such file -- webrickRun gem install webrick, then try the preview again.
Local preview differs from GitHubRestart Jekyll, check docs/_config.yml, and use the deployed site as the final publishing check.