Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Space City JS — Using Electron & React to Build N1
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Nylas
May 14, 2016
Programming
0
110
Space City JS — Using Electron & React to Build N1
Using Electron & React to Build N1: The Open Source Email Client
Nylas
May 14, 2016
Tweet
Share
More Decks by Nylas
See All by Nylas
Switching Off to Switch On!
nylas
1
100
Why Observability Matters
nylas
0
450
Billions of Emails Synced with Python
nylas
0
310
Profiling Python in Production
nylas
1
230
Debugging Python using GDB
nylas
0
71
Plugins with React & Challenges with Data
nylas
0
120
Waffle JS: Desktop Apps with Electron, React, & Observables
nylas
0
450
Electron, Node, and the New Desktop @ SFNode
nylas
0
340
The New Desktop: Electron, React, and Pixel-Perfect Native-Feeling Experiences — Forward 4 Web Summit
nylas
1
970
Other Decks in Programming
See All in Programming
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
CSC307 Lecture 01
javiergs
PRO
0
690
AtCoder Conference 2025
shindannin
0
1.1k
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
180
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
470
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
470
Package Management Learnings from Homebrew
mikemcquaid
0
230
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
130
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
220
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Utilizing Notion as your number one productivity tool
mfonobong
3
220
Un-Boring Meetings
codingconduct
0
200
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Abbi's Birthday
coloredviolet
1
4.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
sira's awesome portfolio website redesign presentation
elsirapls
0
150
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
83
Why Our Code Smells
bkeepers
PRO
340
58k
My Coaching Mixtape
mlcsv
0
48
Transcript
Using Electron & React to Build N1: The Open Source
Email Client Evan Morikawa | @e0m |
[email protected]
| May 14 2016 Nylas
Standing on the shoulders of giants Evan Morikawa | @e0m
|
[email protected]
| May 14 2016 Nylas
None
None
None
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
Shell NW.js (Node Webkit) Swing | Qt | Cocoa |
GTK | WPF/WinRT
Shell
None
None
None
Chromium
Chromium Browser aka Backend aka Main Process
Chromium Browser aka Backend aka Main Process C++
Chromium Browser aka Backend aka Main Process C++ Renderer Renderer
Renderer HTML / JS (DOM) HTML / JS (DOM) HTML / JS (DOM)
Chromium Browser aka Backend aka Main Process C++ Renderer Renderer
Renderer HTML / JS (DOM) HTML / JS (DOM) HTML / JS (DOM) ipc
Browser aka Backend aka Main Process Renderer Renderer Renderer HTML
/ JS (DOM) HTML / JS (DOM) HTML / JS (DOM) ipc
Nylas N1
Nylas N1 main.js
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render() Composer Work Window
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
None
<div id=“actions”> <SendButton draft={this.props.draft} /> <AttachFileButton draft={this.props.draft} /> <TrashButton draft={this.props.draft}
/> </div>
<div id=“actions”> <InjectedComponentSet location={‘composer-actions’} passedProps={{draft: this.props.draft}} /> </div>
<div id=“actions”> <InjectedComponentSet location={‘composer-actions’} passedProps={{draft: this.props.draft}} /> </div> Actions.registerComponent(TranslateButton, {
location:’composer-actions’ })
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
React ReactiveX.js Redux Flux +
ReactiveX.js
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q).subscribe((threads)
=> { this.setState({threads}) })
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q)
.filter(myFn).subscribe((threads) => { this.setState({threads}) })
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q)
.filter(myFn) .map(mapFn).subscribe((threads) => { this.setState({threads}) })
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
Web SQL Local Storage
Web SQL Local Storage
Web SQL Local Storage
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
https://github.com/nylas/n1 Open Source
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
N1 Core Team @e0m @bengotow @juanstejada YOU! @karim_hamidou @jackiehluo
N1 Extended Team
Evan Morikawa | @e0m |
[email protected]
| May 2016 Thank
you Slides here