SlideShare a Scribd company logo
1 of 163
Download to read offline
Katarzyna Ostrowska
aka.ms/carnival-pwa
aka.ms/google-io-2018
aka.ms/tinder-pwa-2017
aka.ms/trivago-pwa-2017
aka.ms/west-elm-pwa-2017
Park Troopers
HTTPS
HTTPS Web App
Manifest
HTTPS Web App
Manifest
Service
Worker
Browser
Internet
Browser Browser
Internet Internet
Cache
Service Worker
Browser Browser
Internet Internet
Cache
Service Worker
HTTPS Web App
Manifest
Service
Worker
Ryan Wilson
PWAs start with a great web experience
and then enhance that experience for
performance, resilience, installation,
and engagement
Ryan Wilson
PWAs start with a great web experience
and then enhance that experience for
performance, resilience, installation,
and engagement
Ryan Wilson
Sign in and get to documents,
apps, and sites that are
relevant to you, in one place:
www.office.com.
Open and switch between apps
most relevant to you with
Office 365 app launcher.
Explore Office 365 apps
you are entitled to with the
personalized Office 365
gallery.
6x improved
search success rate with
new enterprise-wide search
Office.com growth
2x monthly users
so far in 2018 to
40M monthly
active users
Bringing the value of Office.com on the web to
Windows 10 users.
Installation
Engagement
Performance
Resilience
Extend the Office.com value to local
applications and documents.
Installation
Engagement
Performance
Resilience
5s / 1.5s
Installation
Engagement
Performance
Resilience
Using ServiceWorker we have been able to
significantly reduce the DOM render time
Installation
Engagement
Performance
Resilience
Supporting offline and low-bandwidth
network scenarios.
Bring the full value of
Office.com to Window 10
desktop users.
Extend the value to
provide app-specific
differentiated value.
Do so quickly.
Ryan Wilson
Ryan Wilson
Epicurrence
Consider forbes.com circa 2007
“Mobile first” thinking
isn’t just about mobile
Epicurrence
Epicurrence
Isa Martine
<br>
<div class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</div>
<article class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd>24 May 2017</dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
<div>I had the great pleasure of delivering a talk…</div>
<div>I do a lot of traveling and it’s…</div>
</div>
</article>
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
<p>I had the great pleasure of delivering a talk…</p>
<p>I do a lot of traveling and it’s…</p>
</div>
</article>
Isa Martine
“Hey Cortana, read me the top three
headlines in today’s New York Times”
function extractHeadlines( response ){
var $html = document.createElement('div'),
$headings, i=0, headlines=[];
$html.innerHTML = response.contents;
$headings = $html.querySelector('#top-news')
.querySelectorAll('article h1, article h2, article h3');
heading_count = $headings.length;
while (headlines.length < 3) {
let $link = $headings[i].querySelector('a');
if ($link && $link.href) {
headlines.push({
title: $headings[i].innerText.trim(),
link: $link.href
});
}
i++;
}
console.log( headlines );
}
More about semantics
for “headless” UIs
aka.ms/conversational-semantics
aka.ms/dependency-awareness
<a class="button" href="#">Sign Up</a>
<div class="button">Sign Up</div>
Sign Up
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
button[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
a link
Named
generic
Yes
Mouse, touch,
ENTER
No
div block
Not
exposed
No N/A No
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
button[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
a link
Named
generic
Yes
Mouse, touch,
ENTER
No
div block
Not
exposed
No N/A No
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] None None None None None
button[type=submit] None None None None None
a CSS ARIA None JavaScript JavaScript
div CSS ARIA HTML JavaScript JavaScript
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] None None None None None
button[type=submit] None None None None None
a CSS ARIA None JavaScript JavaScript
div CSS ARIA HTML JavaScript JavaScript
Dependencies
Potentialforfailure
Dependencies
Potentialforfailure
Capabilities
UserExperience
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Support for email input type?
2. Validation algorithm implemented?
3. Virtual keyboard?
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Support for HTML validation?
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Browser exposure of aria-required property?
2. Assistive tech implementation of aria-required?
Capabilities
UserExperience
Isa Martine
Isa MartineMatt Popovich
Capabilities
UserExperience
aka.ms/enhanced-css-layouts
Good design is
problem solving.
aka.ms/vertical-rhythm
☞
☞
☞
☞
☞
 Screen size
 Resolution
 Brightness
 Color density
 User preference
 Network speed & quality
 Assistive technology
Confirm Cancel
Confirm Cancel
Don’t rely on color
alone to convey
important information
aka.ms/color-contrast
Good contrast
ensures your
content is readable
Explicit connections
ensure everyone can
follow references
<a href="#figure-3-3">Figure
3.3</a> shows the lodging
article in Safari with only the
default browser styles applied.
…
<figure id="figure-3-3">
…
</figure>
Explicit connections
ensure everyone can
follow references
Consider what
your design
leaves unsaid
Consider what
your design
leaves unsaid
<b class="hidden">You can</b>
<b class="hidden">“The Web
Should Just Work for
Everyone” in less than
10 minutes</b>
Consider what
your design
leaves unsaid
Consider what
your design
leaves unsaid
<a href="…"
>Finish Reading</a>
Consider what
your design
leaves unsaid
Capabilities
UserExperience
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Older browsers without RGBa support, ignore the second rule
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Modern browsers with RGBa support, overwrite the first rule
(That selects h1s that have adjacent sibling paragraphs.)
Passwords can be
a hassle
Browsers that don’t support :has() ignore the entire rule set
Passwords can be
a hassle
As browsers support :has(), matching h1s will turn green
Passwords can be
a hassle
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Browsers without media query support ignore the block
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Browsers with media query support apply it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Browsers that don’t grok @supports ignore the block
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Browsers that understand @supports, but don’t display grid ignore it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Browsers that understand @supports and grid apply it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across
all of their accounts.
Matt Popovich
Matt Popovich
aka.ms/enhanced-css-layouts
Capabilities
UserExperience
“Mobile first” design
“Desktop first”
@media (max-width:599px) {
.primary, .secondary {
float: none;
width: auto;
}
}
“Desktop first”
.primary {
float: left;
width: 68%;
}
.secondary {
float: right;
width: 32%;
}
“Desktop first”
“Mobile first”
@media (min-width:600px) {
.primary {
float: left;
width: 68%;
}
.secondary {
float: right;
width: 32%;
}
}
“Mobile first”
Capabilities
UserExperience
Matt PopovichRodolfo Marques
Rodolfo Marques
document.body.innerHTML += '<p>Can I count to four?</p>’;
for ( let i=1; i<=4; i++ )
{
document.body.innerHTML += '<p>' + i + '</p>';
}
document.body.innerHTML += '<p>Success!</p>';
document.body.innerHTML += '<p>Can I count to four?</p>’;
for ( let i=1; i<=4; i++ )
{
document.body.innerHTML += '<p>' + i + '</p>';
}
document.body.innerHTML += '<p>Success!</p>';
aka.ms/js-let-down
aka.ms/js-let-down
Dependencies
Potentialforfailure
aka.ms/github-removes-jquery
aka.ms/github-removes-jquery
As part of our refined approach to building frontend
features on GitHub.com, we focused on getting away
with regular HTML foundation as much as we could, and
only adding JavaScript behaviors as progressive
enhancement. As a result, even those web forms and
other UI elements that were enhanced using JS would
usually also work with JavaScript disabled in the
browser.
aka.ms/github-removes-jquery
As part of our refined approach to building frontend
features on GitHub.com, we focused on getting away
with regular HTML foundation as much as we could, and
only adding JavaScript behaviors as progressive
enhancement. As a result, even those web forms and
other UI elements that were enhanced using JS would
usually also work with JavaScript disabled in the
browser.
Rodolfo Marques
Capabilities
UserExperience
if ( navigator.credentials ) {
// Actual logic goes here
}
// Create a credential with WebAuthn APIs
navigator.credentials.create({
publicKey: {
rp: { /* relying party info */ },
user: { /* user info */ },
authenticatorSelection: {
authenticatorAttachment: "platform"
},
pubKeyCredParams: [{
type: "public-key",
alg: -257 /* Accept RS256 credentials */
}],
// and other required parameters such as challenge, timeout, ...
}
}).then(attestation => {
// Send the credential to your server, which decodes it and stores the public key
sendToServer(attestation);
});
// Next time the user visits the page, call the WebAuthn APIs
navigator.credentials.get({
publicKey: {
allowCredentials: [{
type: "public-key",
id: credentialId // ID of credential(s) previously created
}]
// and other required parameters such as challenge, timeout, ...
}
}).then(assertion => {
// Send the assertion to your server, which decodes it and ensures the
// contained signature matches the public key received at credential creation
sendToServer(assertion);
});
Capabilities
UserExperience
Rodolfo Marques
if ( navigator.serviceWorker ) {
navigator.serviceWorker.register('/serviceworker.js')
.then(function(registration) {
console.log('Success!', registration.scope);
})
.catch(function(error) {
console.error('Failure!', error);
});
}
navigator.serviceWorker.register('/serviceworker.js')
.then(function(registration) {
console.log('Success!', registration.scope);
})
.catch(function(error) {
console.error('Failure!', error);
});
Capabilities
UserExperience
Capabilities
UserExperience
Capabilities
UserExperience
if (window.Windows) {
var uiSettings = new Windows.UI
.ViewManagement
.UISettings();
var color = uiSettings
.getColorValue(
Windows.UI
.ViewManagement
.UIColorType
.background
);
if (color.r == 0 && color.g == 0
&& color.b == 0) {
// changes for Dark Mode
}
}
Detecting “dark mode”
if (window.Windows) {
var uiSettings = new Windows.UI
.ViewManagement
.UISettings();
var color = uiSettings
.getColorValue(
Windows.UI
.ViewManagement
.UIColorType
.background
);
if (color.r == 0 && color.g == 0
&& color.b == 0) {
// changes for Dark Mode
}
}
Detecting “dark mode”
if (window.Windows) {
var uiSettings = new Windows.UI
.ViewManagement
.UISettings();
var color = uiSettings
.getColorValue(
Windows.UI
.ViewManagement
.UIColorType
.background
);
if (color.r == 0 && color.g == 0
&& color.b == 0) {
// changes for Dark Mode
}
}
Detecting “dark mode”
if (window.Windows) {
var uiSettings = new Windows.UI
.ViewManagement
.UISettings();
var color = uiSettings
.getColorValue(
Windows.UI
.ViewManagement
.UIColorType
.background
);
if (color.r == 0 && color.g == 0
&& color.b == 0) {
// changes for Dark Mode
}
}
Detecting “dark mode”
if (window.Windows) {
var uiSettings = new Windows.UI
.ViewManagement
.UISettings();
var color = uiSettings
.getColorValue(
Windows.UI
.ViewManagement
.UIColorType
.background
);
if (color.r == 0 && color.g == 0
&& color.b == 0) {
// changes for Dark Mode
}
}
Detecting “dark mode”
aka.ms/dark-mode-pwa-demo
Rodolfo Marques
Capabilities
UserExperience
Ryan Wilson
PWAs start with a great web experience
and then enhance that experience for
performance, resilience, installation,
and engagement
Ryan Wilson
Design
Markup
JavaScript
Focus
aarongu@microsoft.com
@AaronGustafson
aka.ms/modern-web-course
aka.ms/adaptive-web-design
PWA: Where Do I Begin? [Microsoft Ignite 2018]

More Related Content

Similar to PWA: Where Do I Begin? [Microsoft Ignite 2018]

Enough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasEnough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasKubide
 
Responsive Web Design for Universal Access
Responsive Web Design for Universal AccessResponsive Web Design for Universal Access
Responsive Web Design for Universal AccessKate Walser
 
Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.Jason Conger
 
Business of Front-end Web Development
Business of Front-end Web DevelopmentBusiness of Front-end Web Development
Business of Front-end Web DevelopmentRachel Andrew
 
MongoDB.local Seattle 2019: MongoDB Stitch Tutorial
MongoDB.local Seattle 2019: MongoDB Stitch TutorialMongoDB.local Seattle 2019: MongoDB Stitch Tutorial
MongoDB.local Seattle 2019: MongoDB Stitch TutorialMongoDB
 
SharePoint Framework SPS Madrid 2016
SharePoint Framework SPS Madrid 2016SharePoint Framework SPS Madrid 2016
SharePoint Framework SPS Madrid 2016Sonja Madsen
 
Web Extensions Solve all Enterprise-y Everythings
Web Extensions Solve all Enterprise-y EverythingsWeb Extensions Solve all Enterprise-y Everythings
Web Extensions Solve all Enterprise-y EverythingsDavid Wesst
 
Web Design Solutions
Web Design Solutions Web Design Solutions
Web Design Solutions APARNA SANAKA
 
Developing for Responsive Design - Frederic Welterlin
Developing for Responsive Design - Frederic WelterlinDeveloping for Responsive Design - Frederic Welterlin
Developing for Responsive Design - Frederic WelterlinRazorfish
 
Design Systems, Pattern Libraries & WordPress
Design Systems, Pattern Libraries & WordPressDesign Systems, Pattern Libraries & WordPress
Design Systems, Pattern Libraries & WordPressJesse James Arnold
 
CSS3 Media Queries: Mobile Elixir or CSS Snake Oil
CSS3 Media Queries: Mobile Elixir or CSS Snake OilCSS3 Media Queries: Mobile Elixir or CSS Snake Oil
CSS3 Media Queries: Mobile Elixir or CSS Snake Oiljameswillweb
 
Let's get accessible!
Let's get accessible!Let's get accessible!
Let's get accessible!Tady Walsh
 
Digital Practices - introductions
Digital Practices - introductionsDigital Practices - introductions
Digital Practices - introductionsprisca schmarsow
 
MongoDB.local Dallas 2019: MongoDB Stitch Tutorial
MongoDB.local Dallas 2019: MongoDB Stitch TutorialMongoDB.local Dallas 2019: MongoDB Stitch Tutorial
MongoDB.local Dallas 2019: MongoDB Stitch TutorialMongoDB
 
Responsive content
Responsive contentResponsive content
Responsive contenthonzie
 
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...“Good design is obvious. Great design is transparent.” — How we use Bootstrap...
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...Roni Banerjee
 
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)Michael Kennedy
 
Font End Development + Automation with Django
Font End Development + Automation with DjangoFont End Development + Automation with Django
Font End Development + Automation with DjangoEvan Reiser
 

Similar to PWA: Where Do I Begin? [Microsoft Ignite 2018] (20)

Enough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasEnough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas Zakas
 
Responsive Web Design for Universal Access
Responsive Web Design for Universal AccessResponsive Web Design for Universal Access
Responsive Web Design for Universal Access
 
Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.Customize all the Things! How to customize Windows and Web applications.
Customize all the Things! How to customize Windows and Web applications.
 
Business of Front-end Web Development
Business of Front-end Web DevelopmentBusiness of Front-end Web Development
Business of Front-end Web Development
 
MongoDB.local Seattle 2019: MongoDB Stitch Tutorial
MongoDB.local Seattle 2019: MongoDB Stitch TutorialMongoDB.local Seattle 2019: MongoDB Stitch Tutorial
MongoDB.local Seattle 2019: MongoDB Stitch Tutorial
 
SharePoint Framework SPS Madrid 2016
SharePoint Framework SPS Madrid 2016SharePoint Framework SPS Madrid 2016
SharePoint Framework SPS Madrid 2016
 
Web Extensions Solve all Enterprise-y Everythings
Web Extensions Solve all Enterprise-y EverythingsWeb Extensions Solve all Enterprise-y Everythings
Web Extensions Solve all Enterprise-y Everythings
 
Web Design Solutions
Web Design Solutions Web Design Solutions
Web Design Solutions
 
Developing for Responsive Design - Frederic Welterlin
Developing for Responsive Design - Frederic WelterlinDeveloping for Responsive Design - Frederic Welterlin
Developing for Responsive Design - Frederic Welterlin
 
HTML5
HTML5 HTML5
HTML5
 
Microformats
MicroformatsMicroformats
Microformats
 
Design Systems, Pattern Libraries & WordPress
Design Systems, Pattern Libraries & WordPressDesign Systems, Pattern Libraries & WordPress
Design Systems, Pattern Libraries & WordPress
 
CSS3 Media Queries: Mobile Elixir or CSS Snake Oil
CSS3 Media Queries: Mobile Elixir or CSS Snake OilCSS3 Media Queries: Mobile Elixir or CSS Snake Oil
CSS3 Media Queries: Mobile Elixir or CSS Snake Oil
 
Let's get accessible!
Let's get accessible!Let's get accessible!
Let's get accessible!
 
Digital Practices - introductions
Digital Practices - introductionsDigital Practices - introductions
Digital Practices - introductions
 
MongoDB.local Dallas 2019: MongoDB Stitch Tutorial
MongoDB.local Dallas 2019: MongoDB Stitch TutorialMongoDB.local Dallas 2019: MongoDB Stitch Tutorial
MongoDB.local Dallas 2019: MongoDB Stitch Tutorial
 
Responsive content
Responsive contentResponsive content
Responsive content
 
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...“Good design is obvious. Great design is transparent.” — How we use Bootstrap...
“Good design is obvious. Great design is transparent.” — How we use Bootstrap...
 
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
 
Font End Development + Automation with Django
Font End Development + Automation with DjangoFont End Development + Automation with Django
Font End Development + Automation with Django
 

More from Aaron Gustafson

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Aaron Gustafson
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Aaron Gustafson
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Aaron Gustafson
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Aaron Gustafson
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Aaron Gustafson
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Aaron Gustafson
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Aaron Gustafson
 
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Aaron Gustafson
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Aaron Gustafson
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Aaron Gustafson
 
Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Aaron Gustafson
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for EveryoneAaron Gustafson
 
Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Aaron Gustafson
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Aaron Gustafson
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Aaron Gustafson
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Aaron Gustafson
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Aaron Gustafson
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Aaron Gustafson
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Aaron Gustafson
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Aaron Gustafson
 

More from Aaron Gustafson (20)

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]
 
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]
 
Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for Everyone
 
Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]
 

Recently uploaded

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 

Recently uploaded (20)

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 

PWA: Where Do I Begin? [Microsoft Ignite 2018]