-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
746 lines (731 loc) · 36.7 KB
/
index.html
File metadata and controls
746 lines (731 loc) · 36.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
---
layout: default
---
<main class="single-page">
<section id="hero" class="section section-hero">
<div class="section-inner">
<div class="hero-layout">
<div class="hero-copy">
<p class="eyebrow">Graeme Arthur</p>
<h1>Software Engineer</h1>
<p class="lead">
Senior software engineer with 12+ years of experience specialising in Apple platforms, building products in privacy and audio, with trusted user experiences and high-impact native systems for the greater good.
</p>
<div class="hero-links hero-links--icon-buttons">
<a class="social-button social-button--github" href="https://github.com/{{ site.github_username }}" target="_blank" rel="noopener noreferrer" aria-label="Open GitHub profile">
<span class="social-button__icon" aria-hidden="true">{% include icon-github.svg %}</span>
</a>
<a class="social-button social-button--linkedin" href="https://linkedin.com/in/{{ site.linkedin_username }}" target="_blank" rel="noopener noreferrer" aria-label="Open LinkedIn profile">
<span class="social-button__icon" aria-hidden="true">{% include icon-linkedin.svg %}</span>
</a>
<a class="social-button social-button--email" href="mailto:{{ site.email | default: 'graeme@protonmail.com' }}" data-open-contact-email-modal aria-haspopup="dialog" aria-controls="contact-email-modal" aria-label="Send email">
<span class="social-button__icon" aria-hidden="true">{% include icon-mail.svg %}</span>
</a>
<a class="social-button social-button--cv" href="/files/graeme_arthur_cv_2026.pdf" download="graeme_arthur_cv_2026.pdf" aria-label="Download CV PDF">
<span class="social-button__icon" aria-hidden="true">{% include icon-download.svg %}</span>
</a>
</div>
</div>
<div class="hero-photo-wrap">
<img class="hero-photo" src="/images/profile/graeme_shadow.png" alt="Graeme Arthur profile photo">
</div>
</div>
</div>
</section>
<section id="about" class="section">
<div class="section-inner">
<h2>About</h2>
<div class="glass-card">
<p>
I’m a senior software engineer with 12+ years of experience building native products for iOS and macOS, from early-stage launches to large-scale apps used by tens of millions of people.
</p>
<p>
My work spans privacy products, audio streaming, subscription systems, SDK architecture, and cross-platform infrastructure. I care deeply about thoughtful engineering, measurable product outcomes, and building software that aligns with user wellbeing.
</p>
<p>
I collaborate closely with product, design, backend, web, Android, and infrastructure teams to ship robust features with strong testing, observability, and release practices.
</p>
</div>
</div>
</section>
<section id="experience" class="section">
<div class="section-inner">
<h2>Experience</h2>
<div class="timeline">
<article class="timeline-item glass-card">
<h3>DuckDuckGo</h3>
<p class="meta">Senior Software Engineer (Sep 2022 - Nov 2025)</p>
<p>Senior engineer on the Apple platforms team, shipping privacy-focused iOS and macOS experiences to tens of millions of users.</p>
<div class="role-stack">
<p class="role-stack-label">Core stack used across this role</p>
<ul class="skill-tags">
<li>SwiftUI</li>
<li>UIKit</li>
<li>AppKit</li>
<li>WebKit</li>
<li>Swift Package Manager</li>
<li>MVVM-C</li>
</ul>
</div>
<details class="experience-projects">
<summary>
<span>View Projects (7)</span>
<span class="projects-chevron" aria-hidden="true"></span>
</summary>
<div class="projects-grid">
<article class="project-card" id="proj-ddg-network-protection">
<h4>DuckDuckGo VPN</h4>
<p>Led architecture and rollout of the iOS VPN, and contributed to the macOS VPN as a core part of DuckDuckGo’s first paid subscription bundle.</p>
<ul class="project-tags">
<li>WireGuard</li>
<li>Network Extension</li>
<li>XPC</li>
<li>Widgets</li>
<li>NotificationCenter</li>
<li>Activities</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-duckplayer">
<h4>DuckPlayer</h4>
<p>Contributed to DuckPlayer by inspecting and analyzing web content to enable privacy-respecting Picture-in-Picture video experiences.</p>
<ul class="project-tags">
<li>JavaScript</li>
<li>HTML</li>
<li>PiP</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-sync-import">
<h4>Data Import</h4>
<p>Led data-import improvements that increased adoption 3-4x and reduced macOS import failures by over 50%.</p>
<ul class="project-tags">
<li>Data Import</li>
<li>Cryptography</li>
<li>Grafana</li>
<li>Retention</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-sync-security">
<h4>Sync</h4>
<p>Built and evolved sync experience and hardened security by improving key exchange flow while improving overall reliability.</p>
<ul class="project-tags">
<li>Security</li>
<li>Key Exchange</li>
<li>Keychain</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-password-manager">
<h4>Password Manager & Autofill</h4>
<p>Partnered with web engineers to review/debug TypeScript and design robust frontend-native messaging for password and autofill flows.</p>
<ul class="project-tags">
<li>TypeScript</li>
<li>Autofill</li>
<li>WebKit</li>
<li>GRDB</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-cross-platform-delivery">
<h4>Feature Flags</h4>
<p>Led shared feature-flag infrastructure across iOS and macOS, then supported release and incident rotations with strong observability.</p>
<ul class="project-tags">
<li>Feature Flags</li>
<li>Remote Configuration</li>
<li>Grafana</li>
<li>Elasticsearch</li>
</ul>
</article>
<article class="project-card" id="proj-ddg-alpha-nightly">
<h4>Alpha & Nightly Distribution</h4>
<p>Led creation of alpha CI builds and internal TestFlight distribution from scratch to speed up feedback before public release.</p>
<ul class="project-tags">
<li>GitHub Actions</li>
<li>TestFlight</li>
<li>Fastlane</li>
<li>Release Trains</li>
</ul>
</article>
</div>
</details>
</article>
<article class="timeline-item glass-card">
<h3>Mimi Hearing Technologies</h3>
<p class="meta">iOS Tech Lead (Feb 2022 - Aug 2022)</p>
<p>Led iOS SDK architecture and engineering for a hearing health company serving international B2B partners.</p>
<div class="role-stack">
<p class="role-stack-label">Core stack used across this role</p>
<ul class="skill-tags">
<li>Swift</li>
<li>Circle CI</li>
<li>Modular Frameworks</li>
</ul>
</div>
<details class="experience-projects">
<summary>
<span>View Projects (3)</span>
<span class="projects-chevron" aria-hidden="true"></span>
</summary>
<div class="projects-grid">
<article class="project-card" id="proj-mimi-sdk-architecture">
<h4>SDK Architecture & Standards</h4>
<p>Defined modular architecture, coding standards, and testing practices to improve integration quality and long-term maintainability.</p>
<ul class="project-tags">
<li>SDK Design</li>
<li>Testing Standards</li>
<li>SwiftLint</li>
</ul>
</article>
<article class="project-card" id="proj-mimi-release-reliability">
<h4>Release Reliability</h4>
<p>Introduced internal feature-flag and release-train systems for safer deployment and faster partner-focused iteration.</p>
<ul class="project-tags">
<li>Feature Flags</li>
<li>Release Trains</li>
<li>Partner Integrations</li>
</ul>
</article>
<article class="project-card" id="proj-mimi-technical-leadership">
<h4>Technical Leadership</h4>
<p>Provided technical vision while staying hands-on, aligning cross-functional teams and external partners on practical integration requirements.</p>
<ul class="project-tags">
<li>Tech Leadership</li>
<li>B2B Integrations</li>
<li>Delivery</li>
</ul>
</article>
</div>
</details>
</article>
<article class="timeline-item glass-card">
<h3>SoundCloud</h3>
<p class="meta">Senior Software Engineer (2016 - 2021)</p>
<p>iOS representative for streaming and playback infrastructure, owning core player and queueing systems across app generations.</p>
<div class="role-stack">
<p class="role-stack-label">Core stack used across this role</p>
<ul class="skill-tags">
<li>Swift</li>
<li>Objective-C</li>
<li>VIPER</li>
<li>Firebase</li>
<li>GoCD</li>
</ul>
</div>
<details class="experience-projects">
<summary>
<span>View Projects (9)</span>
<span class="projects-chevron" aria-hidden="true"></span>
</summary>
<div class="projects-grid">
<article class="project-card" id="proj-sc-playback-platform">
<h4>Playback Platform</h4>
<p>Led the playback experience for iOS, owning queueing and playback library behavior across major app surfaces.</p>
<ul class="project-tags">
<li>AVFoundation</li>
<li>Performance Optimization</li>
<li>Modularization</li>
<li>A/B Testing</li>
<li>Push Notifications</li>
<li>Google Data Platform</li>
</ul>
</article>
<article class="project-card" id="proj-sc-streaming-engine">
<h4>Shared C++ Streaming Engine</h4>
<p>Worked on the cross-platform C++ streaming engine ("Flipper"), including CMake integration to produce an iOS framework.</p>
<ul class="project-tags">
<li>C++</li>
<li>CMake</li>
<li>Cross-platform</li>
<li>Jenkins</li>
<li>Core Audio</li>
</ul>
</article>
<article class="project-card" id="proj-sc-hardware-playback">
<h4>Hardware Playback Integrations</h4>
<p>Integrated and maintained AVFoundation, AirPlay, Chromecast, and CarPlay playback paths across app releases.</p>
<ul class="project-tags">
<li>AVFoundation</li>
<li>Chromecast</li>
<li>CarPlay</li>
</ul>
</article>
<article class="project-card" id="proj-sc-chromecast">
<h4>Chromecast</h4>
<p>Worked across iOS and TypeScript layers, collaborated with Google on Chromecast integration.</p>
<ul class="project-tags">
<li>Chromecast</li>
<li>TypeScript</li>
</ul>
</article>
<article class="project-card" id="proj-sc-ads">
<h4>Ads</h4>
<p>Implemented optimized ad-content preloading that increased ad revenue by 7%, supported by monitoring and product dashboards.</p>
<ul class="project-tags">
<li>A/B Testing</li>
<li>Monitoring</li>
<li>Performance Optimization</li>
<li>Revenue Impact</li>
</ul>
</article>
<article class="project-card" id="proj-sc-listening-team">
<h4>Listening Team Features</h4>
<p>Built and maintained Playback, Stations, and Recently Played features across iOS.</p>
<ul class="project-tags">
<li>React Native</li>
<li>CoreData</li>
<li>Scala</li>
<li>BFF</li>
</ul>
</article>
<article class="project-card" id="proj-sc-subscription-product">
<h4>Subscription Product</h4>
<p>Built onboarding, upgrade and downgrade flows for SoundCloud’s first subscription offering with data-led retention improvements.</p>
<ul class="project-tags">
<li>StoreKit</li>
<li>Experimentation</li>
<li>Retention</li>
</ul>
</article>
<article class="project-card" id="proj-sc-engineering-standards">
<h4>Engineering Standards</h4>
<p>Led Swift testing and mocking standards, contributed to modular architecture efforts, and supported UI automation patterns.</p>
<ul class="project-tags">
<li>XCTest</li>
<li>UI Testing</li>
<li>Page Object Model</li>
<li>Mocking</li>
</ul>
</article>
<article class="project-card" id="proj-sc-backend-data-reliability">
<h4>Backend, Data & Reliability</h4>
<p>Built Scala BFF features, maintained streaming anomaly monitoring, supported Airflow ETLs and cloud dashboards, and contributed to backend maintenance rotation.</p>
<ul class="project-tags">
<li>Airflow</li>
<li>AWS</li>
<li>Prometheus</li>
<li>Python</li>
<li>Microservices</li>
</ul>
</article>
</div>
</details>
</article>
<article class="timeline-item glass-card">
<h3>Kotikan / FanDuel</h3>
<p class="meta">Software Engineer (2013 - 2016)</p>
<p>Built consumer iOS products across travel, fintech, public-health, and sports platforms, while establishing quality-focused engineering practices.</p>
<div class="role-stack">
<p class="role-stack-label">Core stack used across this role</p>
<ul class="skill-tags">
<li>Objective-C</li>
<li>VIPER/MVP</li>
<li>TDD/BDD</li>
<li>Jenkins</li>
</ul>
</div>
<details class="experience-projects">
<summary>
<span>View Projects (4)</span>
<span class="projects-chevron" aria-hidden="true"></span>
</summary>
<div class="projects-grid">
<article class="project-card" id="proj-kotikan-skyscanner-ios">
<h4>Skyscanner iOS</h4>
<p>Contributed to adaptive layouts, price-alert notifications, and shared authentication components used across multiple apps.</p>
<ul class="project-tags">
<li>Objective-C</li>
<li>Auto Layout</li>
<li>Push Notifications</li>
<li>SSO</li>
<li>OCMockito</li>
<li>OpenGL</li>
</ul>
</article>
<article class="project-card" id="proj-kotikan-standard-life-ios">
<h4>Standard Life iOS</h4>
<p>Built a transactional finance app from scratch under strict security and accessibility requirements.</p>
<ul class="project-tags">
<li>MVP</li>
<li>Clean Architecture</li>
<li>Accessibility</li>
</ul>
</article>
<article class="project-card" id="proj-kotikan-who-health-stats">
<h4>WHO Health Stats</h4>
<p>Built an iOS app from scratch to visualize global health metrics across interactive maps and charts under tight deadlines.</p>
<ul class="project-tags">
<li>Data Visualization</li>
<li>Interactive Charts</li>
</ul>
</article>
<article class="project-card" id="proj-kotikan-fanduel-ios">
<h4>FanDuel iOS</h4>
<p>Delivered KYC identity verification and internal UI testing tooling, then chose to move on due to ethical concerns around gambling.</p>
<ul class="project-tags">
<li>KYC</li>
<li>Snapshot Tooling</li>
<li>KIF</li>
</ul>
</article>
</div>
</details>
</article>
<article class="timeline-item glass-card">
<h3>Freelance Audio Designer & Engineer</h3>
<p class="meta">2008 - 2012</p>
<p>Produced, edited, mastered, and programmed audio for games, film, and theatre for clients.</p>
</article>
<article class="timeline-item glass-card">
<h3>The Beat Suite</h3>
<p class="meta">Audio Editor & Designer (2007 - 2008)</p>
<p>Designed ad jingles and edited/mastered content for a production audio library.</p>
</article>
<article class="timeline-item glass-card">
<h3>Dare to Be Digital — Dundee</h3>
<p class="meta">Programmer & Audio Designer (2010)</p>
<p>Part of Team Abnormal Creations, shipping a Unity/FMOD game prototype in a 10-week intensive competition. Contributed C# gameplay/audio programming and sound design in Unity during a time-boxed team build.</p>
</article>
</div>
</div>
</section>
<section id="apps" class="section">
<div class="section-inner">
<h2>Apps</h2>
<div class="apps-grid">
<article class="app-item" data-app-name="DuckDuckGo">
<button class="app-shot-trigger" type="button" aria-label="Open DuckDuckGo screenshots">
<figure class="app-shot">
<img src="/images/projects/ddg_import_mac_MOCKUP.png" alt="DuckDuckGo import on macOS">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>DuckDuckGo</h3>
<p class="meta">Platforms: iPhone, iPad, macOS</p>
<p>iOS VPN experience, sync and import user journeys, DuckPlayer web-to-native Picture-in-Picture, and password manager/autofill flows.</p>
<div class="app-actions">
<a href="https://apps.apple.com/app/id663592361" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/ddg_import_mac.png" alt="DuckDuckGo import on macOS">
<img src="/images/projects/ddg_sync_mac.png" alt="DuckDuckGo sync on macOS">
<img src="/images/projects/ddg_vpn_iphone.png" alt="DuckDuckGo VPN on iPhone">
<img src="/images/projects/ddg_sync_iphone.png" alt="DuckDuckGo sync on iPhone">
<img src="/images/projects/ddg_vpn-widget_iphone.png" alt="DuckDuckGo VPN Widget on iPhone">
<img src="/images/projects/ddg_vpn_locations_iphone.png" alt="DuckDuckGo VPN Locations on iPhone">
</div>
</article>
<article class="app-item" data-app-name="Mimi">
<button class="app-shot-trigger" type="button" aria-label="Open Mimi screenshots">
<figure class="app-shot">
<img src="/images/projects/mimi_1_iphone_MOCKUP.png" alt="Mimi Hearing Test on iPhone">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>Mimi</h3>
<p class="meta">Platforms: iPhone</p>
<p>Hearing-test and hearing-profile product experiences supported by robust SDK integration paths for partner apps.</p>
<div class="app-actions">
<a href="https://apps.apple.com/app/id932496645" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/mimi_1_iphone.png" alt="Mimi Hearing Test on iPhone">
<img src="/images/projects/mimi_2_iphone.png" alt="Mimi SDK Test Screen on iPhone">
</div>
</article>
<article class="app-item" data-app-name="SoundCloud">
<button class="app-shot-trigger" type="button" aria-label="Open SoundCloud screenshots">
<figure class="app-shot">
<img src="/images/projects/sc_player_1_iphone_MOCKUP.png" alt="SoundCloud Player on iPhone">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>SoundCloud</h3>
<p class="meta">Platforms: iPhone, iPad</p>
<p>Playback and queueing, Stations, Collection, listening history, Chromecast/AirPlay/CarPlay support, and subscription purchase/onboarding/downgrade journeys.</p>
<div class="app-actions">
<a href="https://apps.apple.com/app/id336353151" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/sc_player_1_iphone.png" alt="SoundCloud Player on iPhone">
<img src="/images/projects/sc_player_2_iphone.png" alt="SoundCloud Player detail on iPhone">
<img src="/images/projects/sc_home_iphone.png" alt="SoundCloud Home on iPhone">
<img src="/images/projects/sc_collection_iphone.png" alt="SoundCloud Collection on iPhone">
</div>
</article>
<article class="app-item" data-app-name="Skyscanner">
<button class="app-shot-trigger" type="button" aria-label="Open Skyscanner screenshots">
<figure class="app-shot">
<img src="/images/projects/ss_prices_ipad_MOCKUP.png" alt="Skyscanner Price Comparison on iPad">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>Skyscanner</h3>
<p class="meta">Platforms: iPhone, iPad</p>
<p>Adaptive iOS UI refresh for new size classes, fare price alerts, globe exploration interactions, and shared auth login journeys.</p>
<div class="app-actions">
<a href="https://apps.apple.com/app/id415458524" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/ss_prices_ipad.png" alt="Skyscanner Price Comparison on iPad">
<img src="/images/projects/ss_globe_ipad.png" alt="Skyscanner Globe on iPad">
<img src="/images/projects/ss_recents_iphone.png" alt="Skyscanner Recent Searches on iPhone">
<img src="/images/projects/ss_cal_iphone.png" alt="Skyscanner Calendar on iPhone">
</div>
</article>
<article class="app-item" data-app-name="FanDuel">
<button class="app-shot-trigger" type="button" aria-label="Open FanDuel screenshots">
<figure class="app-shot">
<img src="/images/projects/fd_recents_ipad_MOCKUP.png" alt="FanDuel recents on iPad">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>FanDuel</h3>
<p class="meta">Platforms: iPhone, iPad</p>
<p>KYC identity verification and navigation pattern prototypes evaluated through A/B testing in the daily fantasy app.</p>
<div class="app-actions">
<a href="https://apps.apple.com/app/id568168374" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/fd_recents_ipad.png" alt="FanDuel recents on iPad">
</div>
</article>
<article class="app-item" data-app-name="Standard Life">
<button class="app-shot-trigger" type="button" aria-label="Open Standard Life screenshots">
<figure class="app-shot">
<img src="/images/projects/sl_topup_iphone_MOCKUP.png" alt="Standard Life Top-up on iPhone">
</figure>
</button>
<div class="app-company glass-card">
<div class="app-heading">
<h3>Standard Life</h3>
<p class="meta">Platforms: iPhone</p>
<p>Pension and investment plan views, in-app top-up journeys, and secure transactional user flows designed for accessibility.</p>
<div class="app-actions">
<a href="https://apps.apple.com/gb/app/standard-life/id485692917" target="_blank" rel="noopener noreferrer">App Store</a>
</div>
</div>
</div>
<div class="carousel-sources">
<img src="/images/projects/sl_topup_iphone.png" alt="Standard Life Top-up on iPhone">
</div>
</article>
</div>
</div>
</section>
<section id="skills" class="section">
<div class="section-inner">
<h2>Capabilities</h2>
<p class="capabilities-intro">Each capability links directly to projects where the work and outcomes were delivered.</p>
<div class="skills-grid">
<article class="glass-card skill-panel">
<h3>Privacy & Security Delivery</h3>
<p>Build privacy-critical Apple platform features with secure defaults and production reliability.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-ddg-network-protection" class="proof-link">DuckDuckGo: Network Protection</a>
<a href="#proj-ddg-sync-security" class="proof-link">DuckDuckGo: Sync Security</a>
</span>
</p>
</article>
<article class="glass-card skill-panel">
<h3>Apple Platform Architecture</h3>
<p>Design modular native systems that improve long-term maintainability and iteration speed.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-mimi-sdk-architecture" class="proof-link">Mimi: SDK Architecture & Standards</a>
<a href="#proj-ddg-cross-platform-delivery" class="proof-link">DuckDuckGo: Cross-Platform Delivery</a>
</span>
</p>
</article>
<article class="glass-card skill-panel">
<h3>Streaming & Playback Systems</h3>
<p>Ship robust media playback experiences across native and connected-device surfaces.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-sc-playback-platform" class="proof-link">SoundCloud: Playback Platform</a>
<a href="#proj-sc-streaming-engine" class="proof-link">SoundCloud: Shared C++ Streaming Engine</a>
</span>
</p>
</article>
<article class="glass-card skill-panel">
<h3>Release Engineering & CI Automation</h3>
<p>Improve release confidence and speed through delivery automation and safer rollout controls.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-ddg-alpha-nightly" class="proof-link">DuckDuckGo: Alpha & Nightly Distribution</a>
<a href="#proj-mimi-release-reliability" class="proof-link">Mimi: Release Reliability</a>
</span>
</p>
</article>
<article class="glass-card skill-panel">
<h3>Quality Engineering</h3>
<p>Raise delivery confidence with pragmatic testing standards and maintainable test tooling.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-sc-engineering-standards" class="proof-link">SoundCloud: Engineering Standards</a>
<a href="#proj-kotikan-fanduel-ios" class="proof-link">FanDuel iOS: Internal UI Testing Tooling</a>
</span>
</p>
</article>
<article class="glass-card skill-panel">
<h3>Cross-Platform Collaboration</h3>
<p>Bridge native, web, and backend systems to ship user-facing features end to end.</p>
<p class="capability-proof">
<span class="role-stack-label">Experience</span>
<span class="capability-proof-links">
<a href="#proj-ddg-password-manager" class="proof-link">DuckDuckGo: Password Manager & Autofill</a>
<a href="#proj-sc-chromecast" class="proof-link">SoundCloud: Chromecast</a>
</span>
</p>
</article>
</div>
<details class="toolkit-details">
<summary>
<span>Additional toolkit and background technologies</span>
<span class="projects-chevron" aria-hidden="true"></span>
</summary>
<ul class="skill-tags">
<li>SwiftUI</li>
<li>UIKit</li>
<li>AppKit</li>
<li>Cocoa Touch</li>
<li>Combine</li>
<li>Swift Concurrency</li>
<li>CoreData</li>
<li>SQLite</li>
<li>SOLID</li>
<li>Repository Pattern</li>
<li>Feature Flag Infrastructure</li>
<li>OCMock</li>
<li>TDD</li>
<li>Xcode</li>
<li>Cursor</li>
<li>Claude</li>
<li>Git</li>
<li>Danger</li>
<li>CocoaPods</li>
<li>Bundler</li>
<li>Data-informed Delivery</li>
<li>Java</li>
</ul>
</details>
</div>
</section>
<section id="education" class="section">
<div class="section-inner">
<h2>Education</h2>
<div class="education-grid">
<article class="glass-card education-card">
<h3>MSc with Distinction, Software Development</h3>
<p class="meta">University of Glasgow (2012 - 2013)</p>
<p>MSc project: built an iOS campus navigation app for university Estates and IT Services teams.</p>
</article>
<article class="glass-card education-card">
<h3>MSc, Sound Design</h3>
<p class="meta">University of Edinburgh (2009 - 2011)</p>
<p>MSc project: built a first-person 5.1 audio game in C# with Unity.</p>
</article>
<article class="glass-card education-card">
<h3>BA (Hons) 2:1, Music</h3>
<p class="meta">Newcastle University (2005 - 2008)</p>
</article>
</div>
</div>
</section>
<section id="contact" class="section">
<div class="section-inner">
<h2>Contact</h2>
<div class="glass-card">
<p>
I’m always interested in hearing about new opportunities, collaborations, and engineering discussions.
</p>
<div class="contact-actions">
<button class="contact-card contact-card--email" type="button" id="open-contact-email-modal" data-open-contact-email-modal aria-haspopup="dialog" aria-controls="contact-email-modal">
<span class="contact-card__icon" aria-hidden="true">{% include icon-mail.svg %}</span>
<span class="contact-card__text">
<span class="contact-card__title">Email</span>
<span class="contact-card__meta">Send a message</span>
</span>
</button>
<a class="contact-card contact-card--linkedin" href="https://linkedin.com/in/{{ site.linkedin_username }}" target="_blank" rel="noopener noreferrer" aria-label="Open LinkedIn profile">
<span class="contact-card__icon" aria-hidden="true">{% include icon-linkedin.svg %}</span>
<span class="contact-card__text">
<span class="contact-card__title">LinkedIn</span>
<span class="contact-card__meta">/in/{{ site.linkedin_username }}</span>
</span>
</a>
<a class="contact-card contact-card--github" href="https://github.com/{{ site.github_username }}" target="_blank" rel="noopener noreferrer" aria-label="Open GitHub profile">
<span class="contact-card__icon" aria-hidden="true">{% include icon-github.svg %}</span>
<span class="contact-card__text">
<span class="contact-card__title">GitHub</span>
<span class="contact-card__meta">@{{ site.github_username }}</span>
</span>
</a>
<a class="contact-card contact-card--cv" href="/files/graeme_arthur_cv_2026.pdf" download="graeme_arthur_cv_2026.pdf" aria-label="Download CV PDF">
<span class="contact-card__icon" aria-hidden="true">{% include icon-download.svg %}</span>
<span class="contact-card__text">
<span class="contact-card__title">Download</span>
<span class="contact-card__meta">Full CV (PDF)</span>
</span>
</a>
</div>
</div>
</div>
</section>
</main>
<div class="contact-modal" id="contact-email-modal" hidden>
<div class="contact-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="contact-email-modal-title">
<button class="contact-modal__close" type="button" id="close-contact-email-modal" aria-label="Close email form">×</button>
<h3 class="contact-modal__title" id="contact-email-modal-title">Send me a message</h3>
<form class="contact-modal__form" id="contact-email-form" action="https://api.web3forms.com/submit" method="POST">
<input type="hidden" name="access_key" value="f36e4a21-c7a3-4e57-805c-0b44501678af">
<label class="contact-modal__field">
<span>Name</span>
<input type="text" name="name" autocomplete="name" required>
</label>
<label class="contact-modal__field">
<span>Email</span>
<input type="email" name="email" autocomplete="email" required>
</label>
<label class="contact-modal__field">
<span>Message</span>
<textarea name="message" rows="5" required></textarea>
</label>
<div class="contact-modal__actions">
<button type="button" class="contact-modal__button contact-modal__button--secondary" id="cancel-contact-email-modal">Cancel</button>
<button type="submit" class="contact-modal__button contact-modal__button--primary">Send email</button>
</div>
</form>
</div>
</div>
<div class="contact-toast" id="contact-email-toast" role="status" aria-live="polite">
Message sent successfully.
</div>
<div class="carousel-modal" id="app-carousel-modal" hidden>
<div class="carousel-modal-inner" role="dialog" aria-modal="true" aria-label="App screenshot carousel">
<button class="carousel-close" type="button" aria-label="Close carousel">×</button>
<p class="carousel-title" id="carousel-app-title"></p>
<button class="carousel-nav carousel-prev" type="button" aria-label="Previous image">❮</button>
<img class="carousel-image" id="carousel-image" src="" alt="">
<button class="carousel-nav carousel-next" type="button" aria-label="Next image">❯</button>
<p class="carousel-caption" id="carousel-caption"></p>
<div class="carousel-dots" id="carousel-dots" aria-label="Carousel slide selector"></div>
</div>
</div>