-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.html
More file actions
285 lines (248 loc) · 16.7 KB
/
index.html
File metadata and controls
285 lines (248 loc) · 16.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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="description" content="Sauce for Strava™ is a browser extension that upgrades Strava with more stats, features and layouts. It's free, lightweight and easy to use."/>
<title>Sauce, LLC - Extending popular cycling and running apps</title>
<link rel="manifest" href="manifest.json"/>
<link id="favicon" rel="shortcut icon" href="images/favicon.webp"/>
<link rel="stylesheet" type="text/css" href="css/common.css"/>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"url": "https://www.sauce.llc",
"logo": "https://www.sauce.llc/images/logo_vert_240x640.webp"
}
</script>
<script defer type="text/javascript" src="js/common.js"></script>
</head>
<body id="top">
<header id="nav">
<nav>
<div class="left">
<a class="anchor logo" href="/"><img class="branding" src="images/logo_horiz_320x120.webp"/></a>
<a class="anchor" href="#products">Products</a>
<a class="anchor" href="#history">History</a>
<a class="anchor" href="#patron">Patron</a>
<a class="anchor" href="#contact">Contact</a>
<a class="" href="/supporters">Supporters</a>
</div>
<div class="right">
<a class="social" href="https://github.com/SauceLLC"
title="GitHub"><img src="images/github.webp"/></a>
<a class="social" href="mailto:support@sauce.llc"
title="Email for support or questions"><img src="images/email.webp"/></a>
<a class="social" href="https://www.youtube.com/channel/UCXrFzJ5OxYeuChyQt9-Ku7A"
title="Sauce Channel on YouTube"><img src="images/youtube.webp"/></a>
</div>
</nav>
</header>
<section id="products" class="full but-wait-theres-more">
<div id="product-choices">
<div class="product strava">
<header>
<a href="/products/sauce4strava/"><huge>Sauce<span class="reduced"> for <tm>Strava</tm></span></huge></a>
<tagline>A browser extension that upgrades
<a href="https://www.strava.com">Strava</a>
with more stats and features</tagline>
</header>
<main>
<div class="image-compare">
<img src="/images/strava-compare-sauce.webp"/>
<figcaption>Sauce</figcaption>
<slider></slider>
<img src="/images/strava-compare-stock.webp"/>
<figcaption>Stock</figcaption>
<div class="request-full-screen" title="Fullscreen"></div>
</div>
</main>
</div>
<div class="product zwift">
<header>
<a href="/products/sauce4zwift/"><huge>Sauce<span class="reduced"> for <tm addspace>Zwift</tm></span></huge></a>
<tagline>Overlay dozens of configurable widgets on top of
<a href="https://www.zwift.com">Zwift</a></tagline>
</header>
<main>
<img src="/images/zwift-slideshow.webp"/>
</main>
</div>
</div>
</section>
<section id="history" class="full scrollable">
<card>
<bignote class="left history">
<huge>Hi I'm Justin</huge>
<h3 class="caption">No relation to Jon Mayfield</h3>
</bignote>
<img class="visual" src="images/me.webp"/>
<h3 class="caption">Watching the Tour de France in 2019</h3>
</card>
<div class="history-text">
If you're interested in how Sauce came to be, you've have come to the right place. The TL;DR is
that Sauce was a side project that turned into a full time job for me. If you
want to know the full history, keep reading.
<hr/>
<a class="float" href="/images/sauce-first-snapshot.webp"><figure><img loading="lazy" src="/images/sauce-first-snapshot.webp"/><figcaption>First Known Screenshot</figcaption></figure></a>
In 2015, after having recently retired from a startup company, I was riding bikes quite a
bit and getting into Strava for the first time. While I loved the social aspects of Strava, like the segment
leaderboards, I found it still lacked a few more nerdy features that I used in my racing days. Nothing that
would be particularly difficult to implement. So without much thought, I slapped together a
brutally simple Chrome Extension to add the things I wanted and published it to the Chrome Web Store.
<br/><br/>
The main feature was the <i>Critical Power</i> table, inspired by the great <a href="#tp">TrainingPeaks</a> WKO
software. For quite a while that was really it. I went back to full-time work in 2016, but kept making
enhancements and adding things in my spare time. The <i>Critical Power</i>
table became the selectable <i>Peak</i> tables which added heart rate, cadence, speed, and several other categories.
Around then, I also changed the name from "Strava Sauce" to "Sauce for Strava™". I still hear old-school users call
it the former.
<hr/>
By the end of 2019, Sauce had grown to several thousand active users, and I started seeing it show up in videos
from YouTubers like
<a href="https://www.youtube.com/channel/UC77UtoyivVHkpApL0wGfH5w">Lanterne Rouge</a> and
<a href="https://www.youtube.com/@NorCalCycling">NorCal Cycling</a>. My
"real job" was a startup building a privacy focused messaging platform; basically Slack with Signal encryption.
We were unfortunately running out of money and didn't have enough revenue to keep operating, so as that door was
closing, I decided I might as well put my full attention on Sauce and see what I could do with it.
<br/><br/>
As it turned out, 2020 was a really good year to start working from home! 😂
<br/><br/>
My main goal was to build a more complete analysis suite that could track all your training data, what became
<a href="https://www.youtube.com/watch?v=p0-ZYPwI42I">Sauce Performance</a>, but also to
build on the existing features with a renewed level of commitment. I launched a Patreon account and
tied some of the new "Bonus" features to it. Sauce wasn't paying my bills by any means, but all signs were
suggesting that the increased focus was working.
<hr/>
Sauce for <tm>Strava</tm> was reaching some good stability in 2021 and growth continued, reaching tens of thousands of users.
Winter was approaching, marking the start of the Zwift season in Idaho. During one of my indoor sessions, while
lamenting some missing features in Zwift such as time-gaps between groups and average power, I
realized I could probably build something that did for Zwift what I was already doing for Strava.
I had more time in my schedule to take on new developments, so I whipped up a
<a href="https://www.youtube.com/watch?v=JEmPKlhIXbU">proof of concept</a>, uploaded it to YouTube
and posted a message on Reddit to see if anyone was interested. The response was highly favorable and I started
working on Sauce for <tm>Zwift</tm> immediately.
<br/><br/>
However, things were not especially smooth for this project in the beginning. Before I could even launch the first
public version, Zwift reached out to developers in the community to let us know they were enabling encryption
on their data protocol. While this was 100% the right thing for Zwift to do, it meant Sauce for Zwift, and dozens of
other tools that extended Zwift, were dead in the water. We all used the same method of listening to the network
data directly on the computer running Zwift, but this only works if there is no encryption.
<br/><br/>
A bit deflated by the whole situation, I reluctantly decided that this was the end of the road for any Zwift related software.
I updated the source code repository to indicate it was inactive and made it available to the public with a GPL license.
<hr/>
Just before giving up completely, I had one fleeting thought. If you can use Zwift to "Fan View" another athlete,
why couldn't I do the same thing? I'd have to write a Zwift-compatible game client from scratch, and I'd have to
figure out their encryption protocol. Both of which I'd have no documentation or support for. But in theory,
if the Zwift servers thought my software was just another game, connecting to watch another athlete, we would be back
in action!
<br/><br/>
Thus began several months of head-down work to try and understand all the pieces involved. During this
time, I had essentially no clue if I was going to be successful. The best way to describe this task is like
trying to recreate a cake recipe but you don’t know which ingredients were used, have no idea about quantities,
and can only ever see the original cake after it has been run through a blender. I won't bore you with the details,
but let's just say I was reading a lot of assembly code and my former encryption experience
was pretty useful.
<br/><br/>
Eventually, and to my utter surprise, I did get it working. I was able to successfully connect to the Zwift network,
fully encrypted, and activate the "Fan View" mode that turns on the data stream. This was a real Eureka moment,
and it was incredibly satisfying to know that so much effort was not wasted. There was still more effort to tackle the
final 20%, but the hard part was over and I was able to start shipping early Betas soon after.
<hr/>
Since then, I've been building and maintaining both products full time. There is a vibrant Discord community for
<a href="https://www.patreon.com/bePatron?u=32064618">patrons</a>. There is also a group of fine
folks who build customizations on top of Sauce for Zwift in the form of <a href="https://mods.sauce.llc/">Mods</a>. Some
of these have become very popular for the Zwift Racing League events.
<br/><br/>
It's been an amazing ride, and I seriously love what I do. If you're one of the many people that have supported
Sauce over the years, I want to let you know I'm truly grateful.
<br/><br/>
Okay, back to it,<br/>
-Justin
</div>
</section>
<section id="patron" class="full left patron">
<card>
<bignote class="bottom patron">
<huge>Help feed my dog
<div style="font-size: 0.4em; opacity: 0.5;">...and me</div></huge>
<h3 class="caption">People like <a href="supporters.html" class="supporter-highlight">Cody Rayl</a> make this sustainable</h3>
<a href="https://www.patreon.com/bePatron?u=32064618"
class="patron"><img src="images/become_a_patron_button@2x.webp"/></a>
</bignote>
<img loading="lazy" src="/images/frank_dinner_table.webp" class="visual"/>
</card>
<h3 class="caption">Frank's hungry, you wouldn't let him starve would you?</h3>
<p>
<a href="https://www.patreon.com/bePatron?u=32064618">Your generous support</a>
means I can continue to work on Sauce and avoid getting a real job.
</p>
</section>
<section id="contact" class="full right scrollable">
<card>
<bignote class="left contact">
<huge>Need help?<br/>
Questions?<br/>
Suggestions?</huge>
<h3 class="caption"></h3>
</bignote>
<img loading="lazy" class="visual" src="images/support.webp"/>
</card>
<h3 class="caption">Don't Panic</h3>
<p>The Discord server available to <a href="https://www.patreon.com/bePatron?u=32064618">patrons</a> is for the best place to talk shop. There are usually a few hundred people there, myself included, that have likely encountered whatever issue or question you have. It's also just a positive and fun place to hangout (very nerdy). ★★★★★
</p>
<p>
If you want to send me a suggestion or just chat about life, the universe, everything, then send an email to <a href="mailto:support@sauce.llc" target="_blank">support@sauce.llc</a>. I try my best to answer every email, but I can't make promises about turnaround time. ★★★☆☆
</p>
<row class="p">
<column>
Sauce for <tm>Strava</tm> links:
<ul>
<li><a href="https://github.com/SauceLLC/sauce4strava/issues">Issue Tracker</a> ★★★★☆</li>
<li><a href="https://github.com/SauceLLC/sauce4strava/discussions">Discussions Forum</a> ★★☆☆☆</li>
</ul>
</column>
<column>
Sauce for <tm>Zwift</tm> links:
<ul>
<li><a href="https://github.com/SauceLLC/sauce4zwift/issues">Issue Tracker</a> ★★★★☆</li>
<li><a href="https://github.com/SauceLLC/sauce4zwift/discussions">Discussions Forum</a> ★★☆☆☆</li>
</ul>
</column>
</row>
</section>
<footer>
<row>
<column>
<b>Copyright 2020-2026 Sauce, LLC</b>
<ul>
<li><a href="mailto:support@sauce.llc" target="_blank">Contact Me</a>
<li><a href="/sauce4strava/pages/privacy">Privacy Policy - S4S</a></li>
<li><a href="/legal/sauce4zwift-privacy">Privacy Policy - S4Z</a></li>
<li>Updated: Jan 8, 2026</li>
</ul>
</column>
<column>
<b>Social</b>
<ul>
<li><a href="https://www.patreon.com/sauce4strava">Patreon</a></li>
<li><a href="https://www.github.com/SauceLLC">GitHub</a></li>
<li><a href="https://www.strava.com/clubs/sauce4strava">Strava Club</a></li>
<li><a href="https://www.youtube.com/channel/UCXrFzJ5OxYeuChyQt9-Ku7A">YouTube Channel</a></li>
</ul>
</column>
</row>
<row>
<p id="tp" tabindex="0">
Normalized Power®, NP®, Training Stress Score®, TSS®, Intensity Factor®, IF® are trademarks of TrainingPeaks, LLC.<br/><br/>
Learn more at <a href="https://www.trainingpeaks.com/learn/articles/glossary-of-trainingpeaks-metrics/?utm_source=newsletter&utm_medium=partner&utm_term=sauce_trademark&utm_content=cta&utm_campaign=sauce">https://www.trainingpeaks.com/learn/articles/glossary-of-trainingpeaks-metrics</a>
</p>
</row>
</footer>
<a class="anchor top" href="#top" title="Scroll to top">⬆</a>
</body>
</html>