<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://code.secondbit.org/ducky/web/</link>
    <language>en-us</language>

    <title>ducky/web Changelog</title>
    <description>ducky/web Changelog</description>
    <item>
    <title>[default] Switch to being a website instead of a Chrome app.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/21f80f56cda9</guid>
             <link>http://code.secondbit.org/ducky/web/rev/21f80f56cda9</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>21f80f56cda9</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td>default</td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td>tip</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Switch to being a website instead of a Chrome app.<br/>
<br/>
Update our CNAME to be the more appropriate &quot;prototype.useducky.com&quot; when we<br/>
deploy.<br/>
<br/>
Create a homepage and a non-onboarding page template. This mostly consisted of<br/>
setting up a header component and the associated styles, and then a logged-in<br/>
vs. guest flavor of said header, changing the links appropriately.<br/>
<br/>
We also created a simple homepage that describes what Ducky is and does, and<br/>
gave a jumping-off point for it.<br/>
<br/>
Stubbed out a basic links page, just to get an idea for what the homepage would<br/>
be like when a logged-in user navigated to the homepage (e.g., not the marketing<br/>
copy).<br/>
<br/>
Updated our login page to _actually work_, and redirected it to the new URL for<br/>
the payment setup page.<br/>
<br/>
Updated the payment page to actually create a subscription, and moved it from<br/>
/register/payment to just /payment.<br/>
<br/>
Fixed a bug in our registration page that was looking for an invalid_form error<br/>
when it really meant an invalid_format error. Ooops. Also, updated it to point<br/>
to the new /payment endpoint instead of /register/payment.<br/>
<br/>
Updated our router to use the new homepage, the new links page, and updated the<br/>
URL for the payment page.<br/>
<br/>
Updated our button styles so they should all have the right font color, padding,<br/>
and border-radius, but could've potentially screwed something up. Oops.<br/>
<br/>
Updated our backgrounds all over to have a transparent-y white background behind<br/>
the content, and a simple pattern for the rest of the body. Not sure how I feel<br/>
about it just yet, but I'm not going to keep futzing with it.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>build/CNAME<br />src/components/header-guest.jsx<br />src/components/header-user.jsx<br />src/components/header.jsx<br />src/img/ps_neutral.png<br />src/pages/home.jsx<br />src/pages/links.jsx<br />src/pages/login.jsx<br />src/pages/payment.jsx<br />src/pages/register.jsx<br /><br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:39:53 -0400</pubDate>
</item>
<item>
    <title>Implement subscriptions.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/bc1478742a50</guid>
             <link>http://code.secondbit.org/ducky/web/rev/bc1478742a50</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>bc1478742a50</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Implement subscriptions.<br/>
<br/>
Create a Subscription model and a Subscriptions collection, and attach them to<br/>
the app context. Add a helper to our Profile model to retrieve the Subscription<br/>
of that model. Still not sure this should be on the Profile--wouldn't it be<br/>
better on the Me model? Isn't that generally where we would need it?</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/main.js<br />src/models/profile.js<br />src/models/subscription.js<br />src/models/subscriptions.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:29:19 -0400</pubDate>
</item>
<item>
    <title>Remove local-storage wrapper, minor updates to Me model.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/13d27b50d79e</guid>
             <link>http://code.secondbit.org/ducky/web/rev/13d27b50d79e</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>13d27b50d79e</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Remove local-storage wrapper, minor updates to Me model.<br/>
<br/>
No longer use our local-storage helper (remove it entirely), as we're no longer<br/>
going to be a Chrome app. So let's just always rely on localStorage.<br/>
<br/>
Update our Me URL to use the nginx-fronted URL.<br/>
<br/>
Add an email property to our Me model, to keep track of the email we logged in<br/>
with. This is mostly used for setting up our subscription, and should be<br/>
deprecated in the future.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/helpers/local-storage.js<br />src/models/me.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:25:49 -0400</pubDate>
</item>
<item>
    <title>Update to hosted URL, use oauth-refresh in profiles.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/6b7037b4cbe7</guid>
             <link>http://code.secondbit.org/ducky/web/rev/6b7037b4cbe7</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>6b7037b4cbe7</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Update to hosted URL, use oauth-refresh in profiles.<br/>
<br/>
When syncing the profiles, use our oauth-refresh sync helper, so it won't fail<br/>
because of an expired OAuth token.<br/>
<br/>
Also, update our URL to use the nginx-fronted URL.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/models/profiles.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:21:28 -0400</pubDate>
</item>
<item>
    <title>Fix bug in oauth-refresh, update for hosted path.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/9b97c908a706</guid>
             <link>http://code.secondbit.org/ducky/web/rev/9b97c908a706</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>9b97c908a706</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Fix bug in oauth-refresh, update for hosted path.<br/>
<br/>
Our nginx-fronted path has changed, so update the helper to hit the right URL.<br/>
<br/>
Also, fix a bug that would cause every failed request to be retried, which was<br/>
suboptimal.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/helpers/oauth-refresh.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:19:11 -0400</pubDate>
</item>
<item>
    <title>Use our &quot;production&quot; config values.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/313780205e39</guid>
             <link>http://code.secondbit.org/ducky/web/rev/313780205e39</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>313780205e39</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Use our &quot;production&quot; config values.<br/>
<br/>
Use config values for our hosted test instance of the services. These aren't<br/>
actually production values, but they're at least _live_ values.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/config.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:17:49 -0400</pubDate>
</item>
<item>
    <title>Make production builds possible.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/5d47855181e1</guid>
             <link>http://code.secondbit.org/ducky/web/rev/5d47855181e1</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>5d47855181e1</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Make production builds possible.<br/>
<br/>
Our production builds were erroring out, making it hard to deploy. This fixes<br/>
things so that our production builds succeed, though I'm lying if I say I<br/>
understand all the reasoning behind it. The major reasoning seems to be &quot;BUGS&quot;.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>build/200.html<br />index.html<br />package.json<br />webpack.config.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 07 Jul 2015 21:16:30 -0400</pubDate>
</item>
<item>
    <title>Upgrade babel.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/0340f522bce9</guid>
             <link>http://code.secondbit.org/ducky/web/rev/0340f522bce9</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>0340f522bce9</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Upgrade babel.<br/>
<br/>
Take advantage of shorter compilation times. Woohoo!</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>package.json<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Fri, 03 Jul 2015 20:00:45 -0400</pubDate>
</item>
<item>
    <title>Persist session data to localStorage.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/275a83e4c02e</guid>
             <link>http://code.secondbit.org/ducky/web/rev/275a83e4c02e</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>275a83e4c02e</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Persist session data to localStorage.<br/>
<br/>
Create a helper library that figures out whether to write to<br/>
chrome.storage.local or window.localStorage, and unifies their two APIs.<br/>
<br/>
Update the Me model to use the getOrFetch method for the profiles collection<br/>
when retrieving the user's profile. This, unfortunately, makes it an async call<br/>
(because we may need to fetch data from the server), so we can no longer have it<br/>
be a derived property, which is a shame. It instead must just be the me.profile()<br/>
function.<br/>
<br/>
Separate out the logic to determine when an access token expires, and turn it<br/>
into the tokenExpires function.<br/>
<br/>
Fill the writeToCache placeholder with the logic to store the current session in<br/>
either window.localStorage or chrome.storage.local, whichever is the more<br/>
appropriate, using the helper library.<br/>
<br/>
Create the load helper function that will attempt to read session data from<br/>
localStorage or chrome.storage.local, whichever the library decides is<br/>
available, and updates the session based on it.<br/>
<br/>
Implement the logout function, which just uses the helper library to remove the<br/>
session data from window.localStorage or chrome.storage.local. We should also be<br/>
resetting the app.me variable, however.<br/>
<br/>
Create a debouncedWriteToCache function that will only write to the cache once<br/>
every 250 ms, to avoid rushes on the cache.<br/>
<br/>
When instantiating our app.me variable, load it in from localStorage or<br/>
chrome.storage.local if we can. Also, listen for changes to app.me, and persist<br/>
them to chrome.storage.local or localStorage.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/helpers/local-storage.js<br />src/main.js<br />src/models/me.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 30 Jun 2015 01:33:23 -0400</pubDate>
</item>
<item>
    <title>Update our profiles collection to use ampersand-rest-collection.</title>
    <guid isPermaLink="true">http://code.secondbit.org/ducky/web/rev/d51e39bf909c</guid>
             <link>http://code.secondbit.org/ducky/web/rev/d51e39bf909c</link>
    <description>
              <![CDATA[
	<table>
	<tr>
		<th style="text-align:left;">changeset</th>
		<td>d51e39bf909c</td>
              </tr>
              <tr>
                              <th style="text-align:left;">branch</th>
                              <td></td>
              </tr>
              <tr>
                              <th style="text-align:left;">bookmark</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;">tag</th>
		<td></td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">user</th>
		<td>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">description</th>
		<td>Update our profiles collection to use ampersand-rest-collection.<br/>
<br/>
Use ampersand-rest-collection instead of ampersand-collection, so we can take<br/>
advantage of the excellent &quot;getOrFetch&quot; function to fall back on the server when<br/>
looking for a member of the collection that isn't downloaded yet.<br/>
<br/>
Also, use the correct Authorization header when making profile collection<br/>
requests.<br/>
<br/>
Finally, if the profile collection requests fail due to an expired access token,<br/>
use the refresh token to acquire a new access token, then retry the request.</td>
	</tr>
	<tr>
		<th style="text-align:left;vertical-align:top;">files</th>
		<td>src/models/profiles.js<br /></td>
	</tr>
	</table>
	]]></description>
    <author>&#80;&#97;&#100;&#100;&#121;&#32;&#60;&#112;&#97;&#100;&#100;&#121;&#64;&#115;&#101;&#99;&#111;&#110;&#100;&#98;&#105;&#116;&#46;&#111;&#114;&#103;&#62;</author>
    <pubDate>Tue, 30 Jun 2015 01:25:20 -0400</pubDate>
</item>

  </channel>
</rss>