12.14 — Portfolio, GitHub & LinkedIn

Opening scenario

A recruiter pastes your GitHub URL into a slack channel. The hiring manager has 90 seconds to decide whether to forward your résumé to the iOS team. What do they see in those 90 seconds?

Context — your public surface

Three artifacts get reviewed for senior iOS roles:

ArtifactAudienceTime to decide
GitHub profileHiring manager + engineers90 sec
Shipped apps (App Store)Hiring manager + design + product5 min installing + using
LinkedInRecruiter, then hiring manager60 sec

Each must do its job in the time allotted. Polished beats voluminous.

The “2–3 polished beats 10 half-finished” rule

A common mistake: 47 repos, all half-finished, no README, last commit 18 months ago. This hurts — it signals starting without shipping.

Better: 2–3 pinned repos that are clearly finished, well-documented, with recent commits. The rest hidden or archived.

What “finished” looks like:

  • README with screenshots/GIF and clear build instructions
  • Tests (even minimal)
  • License (MIT for personal projects)
  • Recent activity in the last 3 months (even one commit fixing a deprecation)
  • No build warnings on latest Xcode

GitHub profile checklist

  1. Profile photo: clear, professional-ish. No avatar = -10 points of trust.
  2. Bio: one sentence — “Senior iOS engineer, ex-Acme, Swift Concurrency / SwiftUI.”
  3. Pinned repos (6 slots, use 2–3):
    • One substantive app or library that demonstrates iOS expertise.
    • One small tool that shows your taste (CLI, macro, framework).
    • Optionally one contribution to a well-known OSS project (PR in main).
  4. README.md on your profile (the meta-README) with: 1-line bio, current focus, links to apps you’ve shipped, blog/talks if any.
  5. Contribution graph: not a daily streak target, but mostly-green months show ongoing activity.
  6. Stars and follows: build them via genuine work; never buy or solicit. Reviewers check inflation.

What pinned repos should look like

Example: a published Swift Package

SwiftThrottle — A throttle/debounce utility built on Swift Concurrency.

[badge] Swift 6  [badge] iOS 17+ macOS 14+  [badge] MIT  [badge] tests passing

Brief 2-paragraph explanation of what + why.

## Install

.package(url: “https://github.com/you/SwiftThrottle”, from: “1.2.0”)


## Usage
```swift
let throttle = Throttle(interval: .milliseconds(300))
await throttle.run { await search() }

Why this package

Swift Concurrency’s missing debounce. Built actor-based to be Sendable-safe under Swift 6.

Test coverage

85% (run swift test --enable-code-coverage).


### Example: a sample iOS app

HackerWatch — A SwiftUI Hacker News client, my testing ground for new APIs.

[Screenshots: 3 device shots in a row, light + dark]

What’s interesting in here

  • TCA architecture
  • SwiftData offline cache
  • WidgetKit widget
  • Live Activity for top stories

Why I built it

Reading HN every day; wanted a calmer UI than the alternatives.

Build

Xcode 16+, iOS 17+. Open HackerWatch.xcodeproj, build & run.


## Commit hygiene

- Commit messages in imperative mood ("Add throttle actor" not "Added throttle actor").
- One logical change per commit. Squash before merging giant branches.
- Use conventional commits (`feat:`, `fix:`, `refactor:`) if your team does; otherwise be consistent.
- Authors who push 30 commits with "wip", "wip2", "fix typo" reveal undisciplined habits.

## App Store apps

If you've shipped, link them. Include in the LinkedIn featured section *and* on GitHub profile README:

🚀 Apps I’ve shipped

  • [App Name](App Store link) — 50k downloads, 4.7★, Swift + Core Data
  • [Other App](App Store link) — internal tool, B2B

Hiring managers click. They see the polish, ratings, last updated date. An app that hasn't been updated in 3 years but still works is fine; one that hasn't been updated and is broken is bad.

## Blog posts and talks

Even 3–5 technical blog posts move the needle significantly. They demonstrate:

- Ability to write and communicate
- Depth in some area you can speak to
- Self-marketing without being obnoxious

Topics that work: a hard bug you debugged with the process, a deep-dive on a Swift feature, a comparison of architectures with data. Avoid: "10 tips for iOS devs" listicles. Hiring managers skim.

For talks: even a meetup talk recorded counts. Conference talks count more.

## LinkedIn

### Headline formula

[Role] @ [Company] | [Tech stack] | [Differentiator]


Examples:
- "Senior iOS Engineer @ Acme | Swift, SwiftUI, Combine | Shipping for 5M MAU"
- "iOS Engineer @ Stealth | Swift Concurrency, SwiftData | Ex-Apple"
- "Independent iOS Contractor | Swift 6, visionOS | Available Q2 2026"

Skip vague: "Passionate technologist" / "10x developer" — instant downgrade.

### About section

3 paragraphs:
1. What you build and for whom.
2. What technologies you specialize in.
3. What you're looking for next (optional but useful for recruiters).

### Experience entries

For each role, three bullets:
- What the company / team does
- What you specifically owned
- One outcome with a number

Example:

iOS Engineer · Acme Corp · 2022–Present Acme makes a B2C health app, 8M MAU, top 100 Health & Fitness.

  • Led migration of core meal-tracking flow from UIKit to SwiftUI (12 screens, 40k LOC).
  • Built offline sync layer using SwiftData + CloudKit; reduced sync-related crashes 80%.
  • Mentored 2 mid-level engineers, both promoted within 18 months.

Numbers and outcomes are the differentiator. "Worked on iOS app" is invisible.

### Featured section

Pin your best 3:
- A shipped app (link)
- A blog post or talk
- A GitHub repo

This is the carousel a recruiter sees first.

### Skills

iOS / Swift / SwiftUI / UIKit + 2–3 specialties (Concurrency, Core Data, etc.). Don't pad with 30 skills; recruiters discount overstuffed lists.

## Recommendations

3–5 thoughtful recommendations from prior managers or senior peers beat 30 generic ones. Ask for specifics ("could you mention the time we shipped X").

## iOS-specific job boards

Beyond LinkedIn:
- [iosdevjobs.com](https://iosdevjobs.com)
- [WeWorkRemotely](https://weworkremotely.com) — iOS tag
- [Otta](https://otta.com) — curated, well-designed
- [HN Who Is Hiring](https://news.ycombinator.com) — monthly thread, often great roles
- [Hacker News Who's Hiring](https://www.hntohired.com/) — searchable mirror
- iOS-Dev Weekly's job section — high quality, low volume

## Contractor path

If targeting contract/freelance iOS work:

- [Toptal](https://www.toptal.com) — vetted network, 30 % cut, premium rates ($100–200/hr).
- [Gun.io](https://www.gun.io) — engineering-focused contract platform.
- Direct via LinkedIn — best rates, requires marketing yourself.

Build a public "Hire me" page on your portfolio site: what you do, rates (or NDA range), past clients (with permission), case studies.

## Company tier map (rough 2026 guide)

| Tier | Examples | Typical TC senior iOS (US) |
|---|---|---|
| Faang | Apple, Google, Meta, Amazon | $400–600k |
| Top product | Stripe, Airbnb, Shopify, Notion | $350–500k |
| Mid product | DoorDash, Robinhood, Pinterest | $280–400k |
| Mid SaaS | Atlassian, GitLab, Datadog | $250–350k |
| Series B–D startup | Various | $200–320k + equity range |
| Series A startup | Various | $170–250k + meaningful equity |
| Bootstrap / agency | Various | $130–200k |
| Big enterprise | Banks, insurance | $180–260k |

These vary wildly by location, remote-vs-in-office, and individual negotiation. See [12.15](salary-negotiation-offers.md) for negotiation craft.

## Common misconceptions

1. **"More repos = better signal."** Inverted — quality and recency matter, not count.
2. **"LinkedIn doesn't matter for engineers."** It's 60 % of where recruiters source. Treat it as your inbound funnel.
3. **"My job history speaks for itself."** Only if every reader recognizes your past employers. For everyone else, the bullet point detail matters.
4. **"I should have a personal blog."** Optional but high ROI if you actually write. Don't start one you'll abandon in 2 months.
5. **"I need a fancy portfolio website."** A clean GitHub profile README often suffices for engineers. A separate site adds value only if you have something specific to host (case studies, contract availability).

## Seasoned engineer's take

Your public surface is your slow-acting recruiter. Spend an afternoon every quarter polishing it: refresh pinned repos, update LinkedIn headline, ensure shipped apps still build on latest Xcode. The maintenance cost is small; the optionality it creates (recruiters reaching out, opportunities you didn't apply for) compounds across a career.

> **TIP**: Add a Plausible/Fathom analytics tag to your personal site or blog. Seeing real recruiter traffic each week is motivating.

> **WARNING**: Don't post controversial takes that the hiring manager will see during background research. You're not censoring yourself; you're being strategic about a public surface that lasts decades.

## Interview corner

**Junior**: "What should be on my GitHub for iOS roles?"
2–3 pinned repos with clean READMEs, screenshots if it's an app, and a profile README with 1-line bio + apps you've shipped if any.

**Mid**: "How do I move from inbound recruiter spam to good opportunities?"
Polish the headline + about section on LinkedIn so it filters for the right role; pin 3 outcome-focused recommendations; link to shipped apps. Then ignore generic recruiters and reply only to ones who reference specifics from your profile.

**Senior**: "How would you build a personal brand as an iOS engineer over 2 years?"
I'd anchor on one technical area I find genuinely interesting — say, Swift Concurrency or visionOS — and produce 4 deliverables per year there: a blog post, a meetup talk, an OSS contribution, and ideally a small package or tool people use. Each compounds: the blog post leads to talk invites; the OSS contribution lands me in maintainers' networks; the tool drives GitHub stars that recruiters notice. Two years in, I'd have a public résumé that I never need to send out cold — relevant opportunities find me, and the quality of inbound is dramatically higher than the LinkedIn-only baseline.

**Red-flag answer**: "I don't believe in personal branding." Even if you're not actively marketing, your public surface is being read. Better to curate than to leave it to chance.

## Lab preview

This weekend: archive any GitHub repo that's not finished. Update your pinned 3 with current screenshots. Rewrite your LinkedIn headline using the formula above. Refresh the featured section. Time-box to 2 hours.

---

Next: [12.15 — Salary Negotiation & Offer Evaluation](salary-negotiation-offers.md)