How to make an internship portfolio on one page

One short page of projects and coursework, behind one link, is quick to open, easy to update and easy to put into an application. A long document is none of those.

An internship portfolio can be one web page: your name and the kind of internship you want, three projects, the coursework that fits, and one way to reach you. Paste it into NOS, create a share link, and put that link in your application.

One question on Quora asks, "What are some free websites to build a portfolio?" For a single page you may not need a site builder at all. Ask an AI chat for the HTML, check it, and turn it into a link.

Here is a finished example with made-up details. Tap Data, Team or Writing to filter the projects.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mira Voss - Internship portfolio</title>
<style>
  * { box-sizing: border-box; }
  body {
    margin: 0; font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
    color: #1c2430; background: #f6f7f9; line-height: 1.5;
  }
  .wrap { max-width: 760px; margin: 0 auto; padding: 28px 20px 40px; }
  header h1 { margin: 0; font-size: 28px; line-height: 1.15; }
  header .role { margin: 6px 0 0; font-size: 16px; color: #334155; }
  header .contact { margin: 10px 0 0; font-size: 14px; color: #475569; }
  header .contact span { white-space: nowrap; margin-right: 14px; }
  h2 { font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: #64748b; margin: 30px 0 10px; }
  .chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
  .chip {
    font: inherit; font-size: 13px; padding: 6px 12px; border-radius: 999px;
    border: 1px solid #cbd5e1; background: #fff; color: #334155; cursor: pointer;
  }
  .chip[aria-pressed="true"] { background: #0f766e; border-color: #0f766e; color: #fff; }
  .project {
    background: #fff; border: 1px solid #e2e8f0; border-radius: 12px;
    padding: 16px 18px; margin-bottom: 12px;
  }
  .project[hidden] { display: none; }
  .project h3 { margin: 0 0 2px; font-size: 18px; }
  .project .meta { font-size: 13px; color: #64748b; margin: 0 0 8px; }
  .project p { margin: 4px 0; font-size: 15px; }
  .project b { color: #0f766e; }
  .course { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 18px; padding: 0; margin: 0; list-style: none; font-size: 15px; }
  .course li { padding: 6px 0; border-bottom: 1px solid #e2e8f0; }
  .course small { color: #64748b; }
  .skills { font-size: 15px; margin: 0; }
  @media (max-width: 520px) {
    .course { grid-template-columns: 1fr; }
    header h1 { font-size: 24px; }
  }
</style>
</head>
<body>
<div class="wrap">

  <header>
    <h1>Mira Voss</h1>
    <p class="role">Business analytics student, looking for a summer 2027 data analyst internship</p>
    <p class="contact">
      <span>mira.voss@example.com</span>
      <span>Third year, Northfield University</span>
      <span>Available June to August</span>
    </p>
  </header>

  <h2>Projects</h2>
  <div class="chips" id="chips">
    <button class="chip" data-tag="all" aria-pressed="true">All</button>
    <button class="chip" data-tag="data" aria-pressed="false">Data</button>
    <button class="chip" data-tag="team" aria-pressed="false">Team</button>
    <button class="chip" data-tag="writing" aria-pressed="false">Writing</button>
  </div>

  <article class="project" data-tags="data">
    <h3>Campus cafe sales: what sells when</h3>
    <p class="meta">Course project, Data Analysis II, autumn 2026 - spreadsheet and charts</p>
    <p><b>Question:</b> which items should the cafe stock more of on Monday mornings?</p>
    <p><b>What I did:</b> cleaned a practice sales file, grouped sales by weekday and hour, and made three charts.</p>
    <p><b>Result:</b> a one-page recommendation that I presented to the class.</p>
  </article>

  <article class="project" data-tags="data team">
    <h3>Student survey on study spaces</h3>
    <p class="meta">Group project of four, Research Methods, spring 2026 - survey and report</p>
    <p><b>Question:</b> why do students avoid the library at peak hours?</p>
    <p><b>What I did:</b> wrote half of the survey questions and analysed the free-text answers.</p>
    <p><b>Result:</b> a 10-page report. My part: sections 3 and 4.</p>
  </article>

  <article class="project" data-tags="writing">
    <h3>Plain-language guide to budgeting</h3>
    <p class="meta">Volunteer work, student finance club, 2025 - handout</p>
    <p><b>Question:</b> how do first-year students plan a term budget?</p>
    <p><b>What I did:</b> wrote a two-page guide with a worked example and a blank table.</p>
    <p><b>Result:</b> the club handed it out at orientation week.</p>
  </article>

  <h2>Relevant coursework</h2>
  <ul class="course">
    <li>Data Analysis II <small>- B+</small></li>
    <li>Statistics for Business</li>
    <li>Research Methods</li>
    <li>Databases <small>- in progress</small></li>
  </ul>

  <h2>Tools</h2>
  <p class="skills">Excel and Google Sheets (pivot tables, lookups), SQL basics, charts, short written reports.</p>

</div>

<script>
  // Filter the project cards by tag. Cards can have more than one tag.
  const chips = document.querySelectorAll('.chip');
  const cards = document.querySelectorAll('.project');

  chips.forEach((chip) => {
    chip.addEventListener('click', () => {
      const tag = chip.dataset.tag;
      chips.forEach((c) => c.setAttribute('aria-pressed', c === chip ? 'true' : 'false'));
      cards.forEach((card) => {
        const tags = card.dataset.tags.split(' ');
        card.hidden = tag !== 'all' && !tags.includes(tag);
      });
    });
  });
</script>
</body>
</html>
A one-page internship portfolio. Everything in it is made up; replace it with your own work.

The page has four blocks, and each one has a job.

The four blocks of a one-page internship portfolio and what each one says.
The four blocks of a one-page internship portfolio and what each one says.

Notice what is missing: no long biography, no list of every class, no photo gallery. The reader should know in one screen who you are, what you want and where the proof is.

Make it with AI

You supply the facts; the AI supplies the layout. Paste this into ChatGPT, Claude or Gemini, then fill in the list at the end with your own details.

Make one self-contained HTML page: an internship portfolio for a student.
Use only the facts I give below. Do not invent projects, grades, numbers or employers. If something is missing, write [add this] in its place.

Layout, top to bottom:
1. My name, the internship I want, the term I am free, my email.
2. Three projects. For each: title, where it was done (course, club or on my own), the question, what I did, the result. For a group project, say which part was mine.
3. Relevant coursework, as a short list.
4. Tools I have used, in one line.

Rules: one HTML file with CSS and JavaScript inside it. No images from other websites; use plain shapes or inline SVG if a picture is needed. No contact form. It must read well on a phone and a laptop. Plain colours and large readable text.

My details:
- Name:
- Internship I want and the term:
- Email:
- Project 1:
- Project 2:
- Project 3:
- Coursework:
- Tools:

Then check the result before you send it to anyone.

  • Every sentence is true. AI fills gaps with things that sound right. Delete any number, grade or claim you cannot back up.
  • No placeholders left. Search the page for the square brackets.
  • Your part is clear. In group projects, the page must say what you did.
  • It fits a phone. The page needs the viewport meta tag, and the text should be readable without zooming.

The tag looks like this:

<meta name="viewport" content="width=device-width, initial-scale=1">

MDN recommends setting the viewport width to the device width, which keeps a phone from showing a shrunken desktop layout. If your chat does not give you a ready file, host ChatGPT HTML output shows how to copy the code out.

Attaching an HTML file asks the reader to open it correctly. A link does not. Opening an HTML file on a phone covers why attachments can fail there.

From AI chat to a link in your application, in four steps.
From AI chat to a link in your application, in four steps.
  1. Open NOS and paste the full HTML. HTML to link walks through it.
  2. Choose Create share link and copy the address.
  3. Open the address on your phone and read it once as a stranger would.
  4. Put the address in the application.

The page renders as written and its scripts run, so the filter buttons in the example work for the reader. Anyone with the link can open it in a browser, on a phone too, without an account. They cannot edit it.

Found a typo after you applied? Change the code in NOS. The same link shows the new version, so you do not need to send anything again.

Where the link goes:

  • On your resume, written out as text next to your name. Link a portfolio in a resume explains why it should be short enough to type.
  • In any form field that asks for a website or portfolio.
  • In the first lines of an email, before the attachment.
  • On LinkedIn: the Featured section lets you add external links such as a portfolio, according to LinkedIn Help as of October 2026.

One page, a PDF, or both

A PDF and a link do different jobs, and you can use both.

Sending a file means resending after every fix. A link stays the same.
Sending a file means resending after every fix. A link stays the same.
Long document as attachment One page as a link
Reader opens it In a file viewer or after a download In a browser, phone included
After you fix a typo Send the file again Same link, new version
On a phone Depends on the phone and mail app Opens in the phone's browser
Fits a "website" field No Yes
Fits an "upload" box Yes No

If the form wants a file, upload the PDF and put the link inside it. Sharing your resume as a link goes through that case.

When you have little to show

You do not need a finished project from outside class. Look for work that already exists.

A course assignment with a question and a result is a project. So is a group report, if you say which sections were yours.

A handout for a club, a spreadsheet you built for a family budget, or an analysis you did for fun also counts.

Write each one the same way: the question, what you did, what came out. Keep the claims small and true. If a project is unfinished, say so in the meta line, as the example does with a course that is still in progress.

For more on choosing and ordering pieces, see How to make a portfolio. Student-specific options are in Student portfolio.

A second example shows one project on its own page, with a small chart and a "what I would do next" note. It is useful when an application asks for one piece of work rather than a whole portfolio.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Campus cafe sales - project page</title>
<style>
  * { box-sizing: border-box; }
  body {
    margin: 0; font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
    color: #1c2430; background: #fff; line-height: 1.55;
  }
  .wrap { max-width: 680px; margin: 0 auto; padding: 26px 20px 40px; }
  .back { font-size: 14px; color: #64748b; margin: 0 0 8px; }
  h1 { margin: 0; font-size: 26px; line-height: 1.2; }
  .by { margin: 6px 0 18px; font-size: 14px; color: #64748b; }
  h2 { font-size: 17px; margin: 24px 0 6px; color: #0f766e; }
  p { margin: 6px 0; font-size: 16px; }
  .tabs { display: flex; gap: 6px; margin: 10px 0; flex-wrap: wrap; }
  .tab {
    font: inherit; font-size: 14px; padding: 7px 14px; border-radius: 8px;
    border: 1px solid #cbd5e1; background: #fff; color: #334155; cursor: pointer;
  }
  .tab[aria-selected="true"] { background: #0f766e; border-color: #0f766e; color: #fff; }
  .chart { border: 1px solid #e2e8f0; border-radius: 12px; padding: 12px 14px 8px; background: #f8fafc; }
  .chart svg { width: 100%; height: auto; display: block; }
  .chart .cap { font-size: 13px; color: #64748b; margin: 4px 0 0; }
  .note { background: #f0fdfa; border-left: 4px solid #0f766e; padding: 10px 14px; border-radius: 6px; font-size: 15px; margin-top: 18px; }
</style>
</head>
<body>
<div class="wrap">
  <p class="back">Mira Voss / Projects</p>
  <h1>Campus cafe sales: what sells when</h1>
  <p class="by">Course project, Data Analysis II. Practice data supplied by the course. Worked alone.</p>

  <h2>The question</h2>
  <p>Which items should the cafe stock more of on Monday mornings?</p>

  <h2>What I did</h2>
  <p>Cleaned the sales file, grouped sales by weekday and hour, and compared the busiest hours across items.</p>

  <h2>What I found</h2>
  <div class="tabs" role="tablist">
    <button class="tab" role="tab" aria-selected="true" data-view="a">Coffee</button>
    <button class="tab" role="tab" aria-selected="false" data-view="b">Pastries</button>
  </div>
  <div class="chart">
    <svg viewBox="0 0 400 150" role="img" aria-label="Bar chart of sales by weekday">
      <line x1="30" y1="120" x2="390" y2="120" stroke="#cbd5e1"/>
      <g id="bars"></g>
      <g font-size="12" fill="#64748b" text-anchor="middle">
        <text x="63" y="138">Mon</text><text x="123" y="138">Tue</text><text x="183" y="138">Wed</text>
        <text x="243" y="138">Thu</text><text x="303" y="138">Fri</text><text x="363" y="138">Sat</text>
      </g>
    </svg>
    <p class="cap" id="cap"></p>
  </div>

  <p class="note"><b>What I would do next:</b> repeat the check with a full term of data, and ask the cafe staff whether the Monday rush matches what they see.</p>
</div>

<script>
  // Sample figures for the example. Replace them with your own.
  const views = {
    a: { values: [95, 60, 55, 58, 70, 40], cap: 'Coffee: units sold per weekday (sample data). Monday is the highest.' },
    b: { values: [30, 45, 50, 48, 62, 66], cap: 'Pastries: units sold per weekday (sample data). Friday and Saturday are the highest.' },
  };
  const bars = document.getElementById('bars');
  const cap = document.getElementById('cap');

  function draw(key) {
    const v = views[key];
    bars.innerHTML = v.values.map((n, i) => {
      const h = n * 1.0;
      return '<rect x="' + (45 + i * 60) + '" y="' + (120 - h) + '" width="36" height="' + h + '" rx="4" fill="#0f766e"/>' +
             '<text x="' + (63 + i * 60) + '" y="' + (114 - h) + '" font-size="12" text-anchor="middle" fill="#1c2430">' + n + '</text>';
    }).join('');
    cap.textContent = v.cap;
  }

  document.querySelectorAll('.tab').forEach((tab) => {
    tab.addEventListener('click', () => {
      document.querySelectorAll('.tab').forEach((t) => t.setAttribute('aria-selected', t === tab ? 'true' : 'false'));
      draw(tab.dataset.view);
    });
  });
  draw('a');
</script>
</body>
</html>
One project on its own page. Tap Coffee or Pastries to switch the chart.

When it does not work

Symptom Cause Fix
The page looks tiny on a phone The viewport meta tag is missing Add the tag shown above
A picture is missing It was loaded from another website, which is blocked Use inline SVG or CSS, or describe it in text
The contact form does nothing Sending a form to a server is blocked Write your email address as plain text
The page contains a made-up grade The AI filled a gap Delete it and re-read every line
Text still says [add this] A placeholder was never filled Search for the square brackets and fix them
The reader cannot change the page Share links are view-only Edit the code in NOS yourself

An internship portfolio on one page is small enough to keep honest and easy enough to keep current. Choose three projects, let AI do the layout, check every fact, and send the link.

Then, when you finish another course project in the spring, you add one block and everyone who has your link sees it.

Questions people ask

How many projects should an internship portfolio have?

There is no rule. Three is a practical size for one page because each project gets enough room to say what the question was, what you did and what came out of it. If you only have two good ones, show two.

What can I show if I have never had a job?

Course assignments, group projects, club or volunteer work, and things you made on your own all count. Say where each one was done and what your part was. A real small project described clearly is better than a large one described vaguely.

Do I need a website builder or my own domain?

Not for one page. You can paste the HTML into NOS and create a share link. If you later want a longer or multi-page site, that is a separate decision, and the one-page version still works as the front door.

Should I still attach a PDF?

If the application has an upload box that asks for a file, yes. Use the PDF for that box and put the link on your resume and in any field for a website or portfolio, so the reader can open the live page.

Can I show the link on my LinkedIn profile?

LinkedIn's help page on the Featured section lists external links, such as a personal blog or portfolio, among the things you can feature. As of October 2026 that is what the page says, so check it if the layout has changed.

Keep reading