diff --git a/src/index.md b/src/index.md
index 8a60028..538a3f5 100644
--- a/src/index.md
+++ b/src/index.md
@@ -6,20 +6,18 @@ title: Home
# {{ title }}
Hello! I'm Kayce. Welcome to my website. I live in San Francisco. I'm married
-to [Gabi](https://gabjoart.com). We have a little dog named Cheese. I work on
-[Pigweed](https://pigweed.dev) and [Fuchsia](https://fuchsia.dev) as a
-technical writer.
+to [Gabi](https://gabjoart.com). We have a little dog named Cheese.
+
+## Work
+
+My career is technical writing. I've been doing it for more than 10 years now.
+I currently work on [Pigweed](https://pigweed.dev).
+
+* [Portfolio](/portfolio/)
## Blog
* [Proper Full Moon songs](/blog/moon/)
* [You (maybe?) have thousands of ancestors from the 1600s](/blog/ancestors/)
-* [Vim cheatsheet](/blog/vim/)
* [Why I'm taking a sabbatical](/blog/sabbatical/)
-
-## Favorites
-
-My favorite...
-
-* [Words (and phrases)](/favorites/words/)
-* [Lyrics](/favorites/lyrics/)
+* [My favorite words](/favorites/words/)
diff --git a/src/portfolio.md b/src/portfolio.md
new file mode 100644
index 0000000..73f2765
--- /dev/null
+++ b/src/portfolio.md
@@ -0,0 +1,519 @@
+---
+layout: base.njk
+title: Portfolio
+---
+
+# {{title}}
+
+This is a comprehensive, roughly chronological list of everything I've created as a technical
+writer.
+
+
Talks
+
+* [Improving Response Rates](https://youtu.be/d_ZXFqG39hc). My lightning talk
+ from Write The Docs 2018 (Portland). I discuss using experimentation and
+ the scientific method to improve engagement on "was this page helpful?"
+ widgets.
+
+
Open source contributions
+
+
Docusaurus
+
+* [Clarified the usage of `slug`](https://github.com/facebook/docusaurus/pull/6926)
+
+
Corrily (August 2021)
+
+[corrilybefore]: https://drive.google.com/drive/folders/190k32-cnDdD054VjeTYPYU89i5JF9Cgu?usp=sharing
+
+I helped Corrily with their docs for a little less than 1 month. I worked 21 hours
+per week. I also created a sample app for them. Here is how the docs looked
+[before][corrilybefore] I worked with the team.
+
+* [Homepage](http://web.archive.org/web/20220215040848/https://docs.corrily.com/)
+ ([PDF](https://drive.google.com/file/d/1918XardFBOkTasTCAmQ6yEt3nIjQLANo/view?usp=sharing))
+* Basics
+ * [Quickstart guide](http://web.archive.org/web/20220215041000/https://docs.corrily.com/docs/quickstart-guide)
+ ([PDF](https://drive.google.com/file/d/17tI-Z9G__I30h8kdVlNl9WcXZdSG-BgC/view?usp=sharing))
+ * [Setup](http://web.archive.org/web/20220215041326/https://docs.corrily.com/docs/setup)
+ ([PDF](https://drive.google.com/file/d/10vcQaC7HxlwMaifabNsrBTfXaDWYuDi4/view?usp=sharing))
+* Users
+ * [User IDs](http://web.archive.org/web/20220215041429/https://docs.corrily.com/docs/user-ids)
+ ([PDF](https://drive.google.com/file/d/1m1PQLNegWhVK5kWyBRxr1y0guJjQZWHB/view?usp=sharing))
+ * [User characteristics](http://web.archive.org/web/20220215041508/https://docs.corrily.com/docs/user-characteristics)
+ ([PDF](https://drive.google.com/file/d/1RempdsNG1dQMDa2rLqrhruUFeyQSXC0A/view?usp=sharing))
+* Pricing
+ * [Price optimization overview](http://web.archive.org/web/20220215041553/https://docs.corrily.com/docs/price-optimization-overview)
+ ([PDF](https://drive.google.com/file/d/1OvIvdU__zSolrvAW3xjPl-7PMZbGrApt/view?usp=sharing))
+ * [Pricing page integration guide](http://web.archive.org/web/20220215041807/https://docs.corrily.com/docs/pricing-page-integration-guide)
+ ([PDF](https://drive.google.com/file/d/1v1iN8j8znpMbD6jdFbUBfJLaDEyEg_e4/view?usp=sharing))
+ * [Calculate price API examples](http://web.archive.org/web/20220215041643/https://docs.corrily.com/docs/calculate-price-api-examples)
+ ([PDF](https://drive.google.com/file/d/1pLuOexI2Rsv0R4AH5KNwl-_PI8Fnw5s3/view?usp=sharing))
+* Payment gateways
+ * [Payment gateway overview](http://web.archive.org/web/20220215041730/https://docs.corrily.com/docs/payment-gateway-overview)
+ ([PDF](https://drive.google.com/file/d/13p4BycHpHXjr-vIFj7ie6ztMEB7zk-El/view?usp=sharing))
+ * [Payment gateway integration guide](http://web.archive.org/web/20220215041937/https://docs.corrily.com/docs/payment-gateway-integration-guide)
+ ([PDF](https://drive.google.com/file/d/1k2pmhsE7qFBeL1WqgVvaQjADlrqloTZ6/view?usp=sharing))
+ * [Sample app guide](http://web.archive.org/web/20220215042020/https://docs.corrily.com/docs/sample-app-guide)
+ ([PDF](https://drive.google.com/file/d/16zJBPsgX7EQq-w_Vnaj6pEbrpf_k-Xto/view?usp=sharing))
+ * [Sample app source code](https://github.com/kaycebasques/corrily)
+* API reference
+ * [Calculate price](http://web.archive.org/web/20220215042730/https://docs.corrily.com/reference/calculate-price)
+ ([PDF](https://drive.google.com/file/d/1JMZSc4Waoocorgr08rvFs4OdwFsCNLkQ/view?usp=sharing))
+ * [Calculate price response](https://drive.google.com/file/d/1NGTDwKy8Ytt9Sk5ikweX-HYcE3Cq7ym0/view?usp=sharing)
+ * [Set user characteristics](http://web.archive.org/web/20220215052230/https://docs.corrily.com/reference/set-user-characteristics)
+ ([PDF](https://drive.google.com/file/d/1PKonNJNqYXQ_04IktLnlbxIp7DMS4TW8/view?usp=sharing))
+ * [Create subscription](http://web.archive.org/web/20220215052645/https://docs.corrily.com/reference/create-subscription)
+ ([PDF](https://drive.google.com/file/d/1-oEV1mJ1o8nsB_D5pFEF7SvSQocJvQ_x/view?usp=sharing))
+ * [Get subscription](http://web.archive.org/web/20220215053029/https://docs.corrily.com/reference/get-subscription)
+ ([PDF](https://drive.google.com/file/d/1paQKYCb_zk9nv2ND3R-lDFwN6e890e4x/view?usp=sharing))
+ * [Update subscription](http://web.archive.org/web/20220215053119/https://docs.corrily.com/reference/update-subscription)
+ ([PDF](https://drive.google.com/file/d/1VJV7tzfH5MdIw8gFlVBSjGKZQGK2rRVG/view?usp=sharing))
+ * [Delete subscription](http://web.archive.org/web/20220215053540/https://docs.corrily.com/reference/delete-subscription)
+ ([PDF](https://drive.google.com/file/d/1p349WM57VnpGq2HxnVVQBZRSB3MBVi-Q/view?usp=sharing))
+ * [Create charge](http://web.archive.org/web/20220215053647/https://docs.corrily.com/reference/create-charge)
+ ([PDF](https://drive.google.com/file/d/1-RrF4gnGYaFVRw7S0icsKLrj0PS_zX1R/view?usp=sharing))
+ * [Get charge](http://web.archive.org/web/20220215053734/https://docs.corrily.com/reference/get-charge)
+ ([PDF](https://drive.google.com/file/d/1fXcoE1Z0qCH8GY9GpCYQkBM9W8b8Tr_9/view?usp=sharing))
+ * [Update charge](http://web.archive.org/web/20220215053859/https://docs.corrily.com/reference/update-charge)
+ ([PDF](https://drive.google.com/file/d/1aeGpFnB4Hxr3jiZWGyNS96XHLPU7HWGb/view?usp=sharing))
+ * [Delete charge](http://web.archive.org/web/20220215053934/https://docs.corrily.com/reference/delete-charge)
+ ([PDF](https://drive.google.com/file/d/14NmnVE7PA9psxH1vzehZx70D_UzNFXy_/view?usp=sharing))
+
+
Google (2015 to 2021)
+
+
Tools
+
+* [docs-migration-tool](https://github.com/kaycebasques/docs-migration-tool).
+ A tool that I wrote to automate most of the migration from the old
+ developer.chrome.com site to the new one. The old site used templated HTML,
+ whereas we wanted Markdown on the new one. I used Puppeteer to scrape the
+ old site's HTML content and convert it to Markdown. The tool also did
+ lots of normalization transformations on the content.
+* [chrome-devrel-review-bot](https://github.com/GoogleChromeLabs/chrome-devrel-review-bot).
+ A GitHub bot that did automated content quality reviews on https://web.dev
+ pull requests.
+
+
Push notifications
+
+Note: I was the sole author on the latest iteration of these documents.
+If you see 2 or more authors, it means I based the content off of earlier
+work that other people had created.
+
+* [Overview](https://web.dev/push-notifications-overview/)
+ ([PDF](https://drive.google.com/file/d/1y11BEQ1XHMlYhsA5YADPEYTlv-gR9IU6/view?usp=sharing))
+* [Codelab: Build a push notification server](https://web.dev/push-notifications-server-codelab/)
+ ([PDF](https://drive.google.com/file/d/1GsEcquutN-ZCrT4Hfg513z_EcOj9JAJZ/view?usp=sharing))
+ * [Example application source code](https://glitch.com/edit/#!/push-notifications-client-codelab-complete)
+* [Codelab: Build a push notification client](https://web.dev/push-notifications-client-codelab/)
+ ([PDF](https://drive.google.com/file/d/19F-cb4A5bmXIhCZllMNsTQ70Iigg0cpu/view?usp=sharing))
+ * [Example application source code](https://glitch.com/edit/#!/push-notifications-server-codelab-complete)
+
+
+
+* [Critical Request Chains](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)
+ ([PDF](https://drive.google.com/open?id=1zkQNI-KaJQoSw_jkiNyrHviyqesq0es7))
+* [Defer Unused CSS](https://developers.google.com/web/tools/lighthouse/audits/unused-css)
+ ([PDF](https://drive.google.com/open?id=1fwmJSrfH5Z8ujPBzJx_zddU0bQvfFk1J))
+* [Enable Text Compression](https://developers.google.com/web/tools/lighthouse/audits/text-compression)
+ ([PDF](https://drive.google.com/open?id=1SbvmawemhNJWkFOoPENi5y3jiNuHhkws))
+* [Estimated Input Latency](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)
+ ([PDF](https://drive.google.com/open?id=1VyG9xFjFveGtN9LAj-kCxVNRYQwbmDZU))
+* [First Contentful Paint](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)
+ ([PDF](https://drive.google.com/open?id=1PH1-uu3VmCq0fuS-gakLqvE500OtqszO))
+* [First CPU Idle](https://developers.google.com/web/tools/lighthouse/audits/first-cpu-idle)
+ ([PDF](https://drive.google.com/open?id=1Iah03q3kUFnzaFgPKdfl6fIIw3zKyDa6))
+* [First Meaningful Paint](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)
+ ([PDF](https://drive.google.com/open?id=1aFmMcSWoQga9wNlc9gXCd5r98CUpE0ct))
+* [Avoids Enormous Network Payloads](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)
+ ([PDF](https://drive.google.com/open?id=1V65wkr_BPrYbBiwwj2FXj9LpiW2aBgnM))
+* [Has Multiple Page Redirects](https://developers.google.com/web/tools/lighthouse/audits/redirects)
+ ([PDF](https://drive.google.com/open?id=1ElMUc3Pa5IpXnT6Y8ZgkRw-a1041ERA_))
+* [JavaScript Bootup Time Is Too High](https://developers.google.com/web/tools/lighthouse/audits/bootup)
+ ([PDF](https://drive.google.com/open?id=1qTg81lZBL8NIwwZs7BZM51UvbwhHu41J))
+* [Keep Server Response Times Low](https://developers.google.com/web/tools/lighthouse/audits/ttfb)
+ ([PDF](https://drive.google.com/open?id=1hfixZM2okAL9AEre8vjQZ_Fj_ovOvGEB))
+* [Minify CSS](https://developers.google.com/web/tools/lighthouse/audits/minify-css)
+ ([PDF](https://drive.google.com/open?id=1LUXDCFWibW5flZhgKBXo3RM2s-lRDWU4))
+* [Offscreen Images](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)
+ ([PDF](https://drive.google.com/open?id=1YKxXW1Ha97bJ43wvIwM7Sao4Fp-N5vqo))
+* [Optimize Images](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)
+ ([PDF](https://drive.google.com/open?id=1z4OB-SmdmPl6arC8HyoYS9VAomXa6-f_))
+* [Properly Size Images](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)
+ ([PDF](https://drive.google.com/open?id=11a-ewk9Hl4BDFURNKc7Wb16OP4k92LiQ))
+* [Speed Index](https://developers.google.com/web/tools/lighthouse/audits/speed-index)
+ ([PDF](https://drive.google.com/open?id=1nswwe4dMXiSI00-X_2kuD_0ROugM_LOB))
+* [Preload Key Requests](https://developers.google.com/web/tools/lighthouse/audits/preload)
+ ([PDF](https://drive.google.com/open?id=1eyJ9eLF6iIKcIZKp1EIA6vUsemO7YqoT))
+* [Serve Images In Next-Gen Formats](https://developers.google.com/web/tools/lighthouse/audits/webp)
+ ([PDF](https://drive.google.com/open?id=1HxsX5ojNdwTUPekxwCJtNAUBtYSzSqYk))
+* [Time To Interactive](https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive)
+ ([PDF](https://drive.google.com/open?id=1Lfb20mnQejp1qeUQOk30kj5nViTox4PM))
+* [Optimize Images](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)
+ ([PDF](https://drive.google.com/open?id=1z4OB-SmdmPl6arC8HyoYS9VAomXa6-f_))
+* [User Timing Marks And Measures](https://developers.google.com/web/tools/lighthouse/audits/user-timing)
+ ([PDF](https://drive.google.com/open?id=1bnVK77K6pYqU3CyTpPicIPUd9cUt5nLi))
+* [Excessive DOM Size](https://developers.google.com/web/tools/lighthouse/audits/dom-size)
+ ([PDF](https://drive.google.com/open?id=1SmRrCvqYMQuQ2laMtL_i5o0U529SkmjZ))
+* [Cache Policy](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)
+ ([PDF](https://drive.google.com/open?id=1HdIYAUNp3exDwIou7oElSNu0Op29SnFg))
+* [Address Bar Matches Brand Colors](https://developers.google.com/web/tools/lighthouse/audits/address-bar)
+ ([PDF](https://drive.google.com/open?id=1bA7epztkvPtIfumNqol0cmMHzzckIqgb))
+* [Contains Content When JavaScript Is Not Available](https://developers.google.com/web/tools/lighthouse/audits/no-js)
+ ([PDF](https://drive.google.com/open?id=1GxfrO1ViYBs0ORxSkZtQDy1ZnrswjQvJ))
+* [Has A Viewport Meta Tag](https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag)
+ ([PDF](https://drive.google.com/open?id=1ol4aaigBVshtE7i5XB8kL8jlyQjnkvbj))
+* [Page Load Is Fast Enough On Mobile](https://developers.google.com/web/tools/lighthouse/audits/fast-3g)
+ ([PDF](https://drive.google.com/open?id=1eKlwlJS1n4_U8mlrmaKYmjqIBBtR4XW-))
+* [Redirects HTTP Traffic To HTTPS](https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https)
+ ([PDF](https://drive.google.com/open?id=10obQhwUQVpshmZwtZLssiEJ8nDBTxrpZ))
+* [Uses HTTPS](https://developers.google.com/web/tools/lighthouse/audits/https)
+ ([PDF](https://drive.google.com/open?id=1pQH9vn_XsBWLtg89K-buUL2HN7k2xlf7))
+* [Avoids Application Cache](https://developers.google.com/web/tools/lighthouse/audits/appcache)
+ ([PDF](https://drive.google.com/open?id=1XJt5XddjB8Q4zJ14jWRQvWry4z6uSWtq))
+* [Avoids console.time()](https://developers.google.com/web/tools/lighthouse/audits/console-time)
+ ([PDF](https://drive.google.com/open?id=1LryW5L8jfCBLevz7ZSSp924wZ5ouZ4xA))
+* [Avoids Date.now()](https://developers.google.com/web/tools/lighthouse/audits/date-now)
+ ([PDF](https://drive.google.com/open?id=1QctGS3WiRfLZZPYdjXdlQcHGade71Evx))
+* [Avoids document.write()](https://developers.google.com/web/tools/lighthouse/audits/document-write)
+ ([PDF](https://drive.google.com/open?id=1loHaew_SxkdRjWJ4hQx7-VnQ3I9KIRVw))
+* [Avoids Mutation Events](https://developers.google.com/web/tools/lighthouse/audits/mutation-events)
+ ([PDF](https://drive.google.com/open?id=1KDRXGW_NT6gC34v073t8zxJQPwOQyaiq))
+* [Avoids Old CSS Flexbox](https://developers.google.com/web/tools/lighthouse/audits/old-flexbox)
+ ([PDF](https://drive.google.com/open?id=1oDShYgv7pKVRv3w30HsOetID_emxZQh1))
+* [Avoids Requesting Geolocation Permissions On Page Load](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load)
+ ([PDF](https://drive.google.com/open?id=1q7_FL3cbsTilQj3A-zbYLm8MO-NclwYl))
+* [Avoids Requesting Notification Permissions On Page Load](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load)
+ ([PDF](https://drive.google.com/open?id=1FnZH72wey-JhehbpaLOos8Pl32ByBtKD))
+* [Displays Images With Incorrect Aspect Ratios](https://developers.google.com/web/tools/lighthouse/audits/aspect-ratio)
+ ([PDF](https://drive.google.com/open?id=1E-jnJwaYVFZFkf14HWMXPEvF2U0t7ATC))
+* [Includes Libraries With Known Vulnerabilities](https://developers.google.com/web/tools/lighthouse/audits/vulnerabilities)
+ ([PDF](https://drive.google.com/open?id=1zQfh739_L6jN2s-_uEvfU62r9WgNAteo))
+* [Links To Cross-Origin Destinations Are Unsafe](https://developers.google.com/web/tools/lighthouse/audits/noopener)
+ ([PDF](https://drive.google.com/open?id=1A9VPPnFvzJHQqNccqEPMvpXPACTHp7Pf))
+* [Prevents Users From Pasting Into Password Fields](https://developers.google.com/web/tools/lighthouse/audits/password-pasting)
+ ([PDF](https://drive.google.com/open?id=1xBW4Z6a8M9ws1XMfDrzxFmTlLEbSGxXU))
+* [Some Insecure Resources Can Be Upgraded To HTTPS](https://developers.google.com/web/tools/lighthouse/audits/mixed-content)
+ ([PDF](https://drive.google.com/open?id=1Aiit1SKRjB1pStwSx03MzdyLoe0wmzg3))
+* [Uses HTTP/2](https://developers.google.com/web/tools/lighthouse/audits/http2)
+ ([PDF](https://drive.google.com/open?id=1KX_c2GHDS7UcxInnMzCBxNrvYmG5Xr1j))
+* [Uses Passive Event Listeners](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners)
+ ([PDF](https://drive.google.com/open?id=1Gr8BCJapuFe2Gw3G6NwSmiajlm_tGmf9))
+* [Document Does Not Have A Meta Description](https://developers.google.com/web/tools/lighthouse/audits/description)
+ ([PDF](https://drive.google.com/open?id=1xQcL7l7ymyaWhpJCXIkmPKURJF9XMdA-))
+* [Document Doesn't Have A Title Element](https://developers.google.com/web/tools/lighthouse/audits/title)
+ ([PDF](https://drive.google.com/open?id=19ZXkJkpeIQpelj9d_YtBMZWWFH3p8oW3))
+* [Document Doesn't Have A Valid hreflang](https://developers.google.com/web/tools/lighthouse/audits/hreflang)
+ ([PDF](https://drive.google.com/open?id=12eHUutuIg3tOyrFa9rOCZWI7eqpGj6Oi))
+* [Document Doesn't Have A Valid rel=canonical](https://developers.google.com/web/tools/lighthouse/audits/canonical)
+ ([PDF](https://drive.google.com/open?id=1QoscYDqu_pCja_9nCCCIDQl_9TkMG5GX))
+* [Document Doesn't Use Legible Font Sizes](https://developers.google.com/web/tools/lighthouse/audits/font-sizes)
+ ([PDF](https://drive.google.com/open?id=1qBEjG9etqyJxOq13tE7vpbtLcMdi-PWR))
+* [Document Uses Plugins](https://developers.google.com/web/tools/lighthouse/audits/plugins)
+ ([PDF](https://drive.google.com/open?id=1AYVKf7mwSMv7D8UgR1UGa96L5fEVsRmj))
+* [Links Do Not Have Descriptive Text](https://developers.google.com/web/tools/lighthouse/audits/descriptive-link-text)
+ ([PDF](https://drive.google.com/open?id=1Dg7obsH7WmDzszZGwoj8xadomzMQXjrr))
+* [Page Is Blocked From Indexing](https://developers.google.com/web/tools/lighthouse/audits/indexing)
+ ([PDF](https://drive.google.com/open?id=1rUu8uAN_UggBgbBCUWmfeqrsjAonnaqo))
+* [robots.txt Is Not Valid](https://developers.google.com/web/tools/lighthouse/audits/robots)
+ ([PDF](https://drive.google.com/open?id=1Oq9BDd_GlnXszfRJRJanDQS_fRU6-onj))
+* [Tap Targets Are Not Sized Appropriately](https://developers.google.com/web/tools/lighthouse/audits/tap-targets)
+ ([PDF](https://drive.google.com/open?id=1edJzohW6pB4wI3D4WOm7Gwfq4AxBaNNp))
+
+
Quantified Code (2014)
+
+Quantified Code was a Berlin-based startup. Their main product was an automated code analysis tool for
+Python codebases. I wrote over 100 guides for their companion site, [The Little Book Of
+Python Anti-Patterns](https://docs.quantifiedcode.com/python-anti-patterns/). The purpose of the
+companion site was to share their knowledge of Python best practices while also driving
+traffic to their automated product. E.g. their sales pitch was "rather than trying to remember all
+of these best practices, we have an automated tool that can do it for you." Subject matter experts at
+Quantified Code gave me a list of topics to write about. If I recall correctly, each topic only had a
+one-line description. I researched and drafted each guide myself. The subject matter
+experts reviewed my guides.
+
+
+
+Note that the list below is not complete. It looks like some of the guides were deleted over time.
+See [my commit history](https://github.com/quantifiedcode/python-anti-patterns/search?q=committer%3Akaycebasques&type=Commits)
+for the full list of contributions.
+
+* [Method has no argument](https://docs.quantifiedcode.com/python-anti-patterns/correctness/method_has_no_argument.html)
+ ([PDF](https://drive.google.com/open?id=1Nfg-Eqsu1O7YYG_3i6uxVipW9JCua9qD))
+* [Explicit return in \_\_init\_\_](https://docs.quantifiedcode.com/python-anti-patterns/correctness/explicit_return_in_init.html)
+ ([PDF](https://drive.google.com/open?id=1UWA1yNuuX7YBurf9o3DtnTD-5vL2Jv25))
+* [Method could be a function](https://docs.quantifiedcode.com/python-anti-patterns/correctness/method_could_be_a_function.html)
+ ([PDF](https://drive.google.com/open?id=1UIz2gMHNeA6wkpdSDKFqGAYZLx3N9dIN))
+* [\_\_exit\_\_ must accept 3 arguments](https://docs.quantifiedcode.com/python-anti-patterns/correctness/exit_must_accept_three_arguments.html)
+ ([PDF](https://drive.google.com/open?id=1JgWBhH4Lblc9AehEQbp-3c9EdwPH9vOW))
+* [Use of exec](https://docs.quantifiedcode.com/python-anti-patterns/security/use_of_exec.html)
+ ([PDF](https://drive.google.com/open?id=1_0iRvuMTPMNxsT6RPo6un7DuZsq5HdL6))
+* [Using the global statement](https://docs.quantifiedcode.com/python-anti-patterns/maintainability/using_the_global_statement.html)
+ ([PDF](https://drive.google.com/open?id=1dZ-t5As43zFmZkBvohYkuDPfJMqfoOL9)
+* [Indentation contains mixed spaces and tabs](https://docs.quantifiedcode.com/python-anti-patterns/correctness/indentation_contains_mixed_spaces_and_tabs.html)
+ ([PDF](https://drive.google.com/open?id=1taBBpGCFxgxH3EscyVJvsYhpZxJweTZN))
+* [Comparison to none](https://docs.quantifiedcode.com/python-anti-patterns/readability/comparison_to_none.html)
+ ([PDF](https://drive.google.com/open?id=1HDdEq7JjaqauS19Awy94hKvvckP8AyWc))
+* [Comparison to true](https://docs.quantifiedcode.com/python-anti-patterns/readability/comparison_to_true.html)
+ ([PDF](https://drive.google.com/open?id=1MmYXDk4g71zD2nVy2AM3UfTCo4RaGWRj))
+* [Test for object identity should be is not](https://docs.quantifiedcode.com/python-anti-patterns/readability/test_for_object_identity_should_be_is_not.html)
+ ([PDF](https://drive.google.com/open?id=1XrIAheqnIxndqf9FYHMrw-iMIgaQJjhU))
+* [Do not compare types, use isinstance](https://docs.quantifiedcode.com/python-anti-patterns/readability/do_not_compare_types_use_isinstance.html)
+ ([PDF](https://drive.google.com/open?id=1daZqZEDJzU6bUNhzikU0pppw__Y4pO18))
+* [Indentation contains tabs](https://docs.quantifiedcode.com/python-anti-patterns/correctness/indentation_contains_tabs.html)
+ ([PDF](https://drive.google.com/open?id=1v8YVwik6ogd2Ra3uTZiUNW7wVlVBcnAm))
+* [Assigning lambda to a variable](https://docs.quantifiedcode.com/python-anti-patterns/correctness/assigning_a_lambda_to_a_variable.html)
+ ([PDF](https://drive.google.com/open?id=1Jyzf5XkdM0F9G9UfwdOKvjViAD-ROKSE))
+* [Using wildcard imports](https://docs.quantifiedcode.com/python-anti-patterns/maintainability/from_module_import_all_used.html)
+ ([PDF](https://drive.google.com/open?id=1pJKbIQqdwqD2AosQMlkSHH-usDTE0_Q-))
+* [Future import is not the first statement](https://docs.quantifiedcode.com/python-anti-patterns/correctness/future_import_is_not_the_first_statement.html)
+ ([PDF](https://drive.google.com/open?id=1sjkEcNvrwVcmuw5yeV10dlEto4l0P9XY))
+* [Bad except clauses order](https://docs.quantifiedcode.com/python-anti-patterns/correctness/bad_except_clauses_order.html)
+ ([PDF](https://drive.google.com/open?id=1DA3hraB1AH2oUG7hdQO3vB2Nl2VaQOz-))
+* [Bad first argument given to super](https://docs.quantifiedcode.com/python-anti-patterns/correctness/bad_first_argument_given_to_super.html)
+ ([PDF](https://drive.google.com/open?id=1wz2KTq9gikvbexUOu3vOhhqIbF6QbOU5))
+* [Missing argument to super](https://docs.quantifiedcode.com/python-anti-patterns/correctness/missing_argument_to_super.html)
+ ([PDF](https://drive.google.com/open?id=1gavKC1kCxw6TTlKtW8G8038QIqWHSso2))
+* [Access to a protected member](https://docs.quantifiedcode.com/python-anti-patterns/correctness/accessing_a_protected_member_from_outside_the_class.html)
+ ([PDF](https://drive.google.com/open?id=19ALIM0z8B516i8jiAGh6OSXyuXAbrD3V))
+* [else clause on loop without a break statement](https://docs.quantifiedcode.com/python-anti-patterns/correctness/else_clause_on_loop_without_a_break_statement.html)
+ ([PDF](https://drive.google.com/open?id=1UwkQzvh52MG7bBCj7cVBsopHcJrV5PHB))
+* [Using an unpythonic loop](https://docs.quantifiedcode.com/python-anti-patterns/readability/using_an_unpythonic_loop.html)
+ ([PDF](https://drive.google.com/open?id=1MTaFe1rO6Pn9_0g8rpUSBHFwOllhlvTk))
+* [Returning more than one variable type from function call](https://docs.quantifiedcode.com/python-anti-patterns/maintainability/returning_more_than_one_variable_type_from_function_call.html)
+ ([PDF](https://drive.google.com/open?id=1OHE2Tded-xjfbB1eicHeEuyME2fF81o-))
+* [Not using items to iterate over a dictionary](https://docs.quantifiedcode.com/python-anti-patterns/readability/not_using_items_to_iterate_over_a_dictionary.html)
+ ([PDF](https://drive.google.com/open?id=1TJOgVoOSVn8PJJ-Im5SeWCw0simP41Ru))
+* [Not using zip to iterate over a pair of lists](https://docs.quantifiedcode.com/python-anti-patterns/readability/not_using_zip_to_iterate_over_a_pair_of_lists.html)
+ ([PDF](https://drive.google.com/open?id=16NaJYdr2WxBhYUdt7hwsCiy0FUcqo_mk))
+* [Using key in list to check if key is contained in list](https://docs.quantifiedcode.com/python-anti-patterns/performance/using_key_in_list_to_check_if_key_is_contained_in_a_list.html)
+ ([PDF](https://drive.google.com/open?id=16tU1iVn8ZLxMAZf8bCU83Pl98UXcfbiw))
+* [Not using else in a loop](https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_else_in_a_loop.html)
+ ([PDF](https://drive.google.com/open?id=1xrvagdaxhBLQk-LJq5aaY0IopqlXR-lE))
+* [Not using setdefault to initialize a dictionary](https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_setdefault_to_initialize_a_dictionary.html)
+ ([PDF](https://drive.google.com/open?id=1ZYlOuXR3rNdGi-bWvT0YVdl1sS9hjFKx))
+* [Not using get to return a default value from a dictionary](https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_get_to_return_a_default_value_from_a_dictionary.html)
+ ([PDF](https://drive.google.com/open?id=1dx0UaNxbH6OZJE_E2roYzM4EIEptdN51))
+* [Using map or filter where list comprehension is possible](https://docs.quantifiedcode.com/python-anti-patterns/readability/using_map_or_filter_where_list_comprehension_is_possible.html)
+ ([PDF](https://drive.google.com/open?id=1Wv0aO2MTEUalfZ6g6u3n_izfZryZ7tGP))
+* [Not using defaultdict](https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_defaultdict.html)
+ ([PDF](https://drive.google.com/open?id=11n0EbpQiQMaxTEJmPl3tg7xUQPUq250L))
+* [Not using named tuples when returning more than one value](https://docs.quantifiedcode.com/python-anti-patterns/readability/not_using_named_tuples_when_returning_more_than_one_value.html)
+ ([PDF](https://drive.google.com/open?id=1M2Aw0rdznXAWu8SfMqvnGkfNSWk7yuDi))
+* [Not using explicit unpacking](https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_explicit_unpacking.html)
+ ([PDF](https://drive.google.com/open?id=1wWvQZ3hxFzHUYRKIIgoQ055TLPChCQlY))
+* [Not using unpacking for updating multiple values at once](https://docs.quantifiedcode.com/python-anti-patterns/readability/not_using_unpacking_for_updating_multiple_values_at_once.html)
+ ([PDF](https://drive.google.com/open?id=1rI4oTcYq_9-AiWqiFnN4MgnVmMqoWGXL))
+* [Not using with to open files](https://docs.quantifiedcode.com/python-anti-patterns/maintainability/not_using_with_to_open_files.html)
+ ([PDF](https://drive.google.com/open?id=1lYiSxyWPwezEJ84axpxmofGsAdRq-td0))
+* [Asking for permission instead of forgiveness when working with files](https://docs.quantifiedcode.com/python-anti-patterns/readability/asking_for_permission_instead_of_forgiveness_when_working_with_files.html)
+ ([PDF](https://drive.google.com/open?id=1nG6-5-TKcmKVkzxQlMz5NudscYuQMVZl))
+* [Not using a dict comprehension](https://docs.quantifiedcode.com/python-anti-patterns/readability/not_using_a_dict_comprehension.html)
+ ([PDF](https://drive.google.com/open?id=1ZpI4MdTzUwhR0jgFqS8k5nyC1SLbC-5f))
+* [Putting type information in a variable](https://docs.quantifiedcode.com/python-anti-patterns/readability/putting_type_information_in_a_variable_name.html)
+ ([PDF](https://drive.google.com/open?id=14LfFsqxG6DMD6xK9prXIFECpA_IT9eER))
+* [Implementing Java-style setters and getters](https://docs.quantifiedcode.com/python-anti-patterns/correctness/implementing_java-style_getters_and_setters.html)
+ ([PDF](https://drive.google.com/open?id=1wNzSZN-TgaWrwwEsE17fyNJDBIhyOnGW))
+
+
Arrayent (2012 to 2015)
+
+Arrayent was an internet of things startup. I was the sole technical writer in the company.
+This was my first full-time technical writing job. I wrote developer documentation for an embedded API
+as well as a REST API, in addition to end-user documentation for a couple of web applications.
+I even hacked together a custom XSLT stylesheet to convert our Doxygen-generated reference
+documentation to more reasonable HTML. I also migrated the company's documentation from Microsoft
+Word to a website. I used Sphinx to generate the site and stored the source code on BitBucket. I deployed
+the site to Heroku. I don't think I set up an automated deployment system because running the command to deploy to
+Heroku was trivial. In addition to managing all of our customer-facing documentation I also
+managed our SDKs, which we sent out to prospective customers.
+
+Embedded Developer Docs:
+
+* [WICED DevKit Tutorial](http://developer.arrayent.com/dev-kits/cypress-devkit/)
+ ([PDF](https://drive.google.com/open?id=12S_2ujHFbu7D-3OOXyIaTES1RwIuIHYI))
+* [Marvell DevKit Tutorial](http://developer.arrayent.com/dev-kits/marvell-devkit/)
+ ([PDF](https://drive.google.com/open?id=1Fwa7Uh3TGsn_nedGxMLNo_3OzN0pdkn8))
+* [FAQ](http://developer.arrayent.com/platform-2/platform-faq/)
+ ([PDF](https://drive.google.com/open?id=1ypxX21m6wbSxkFzNSW34BLqPcwV7R4jE))
+* [Firmware Developers Guide](http://developer.arrayent.com/embedded-guides/developers-guide/)
+ ([PDF](https://drive.google.com/open?id=1a8xvqNLRLGOxfyWBnRLx7W1y3noTshRL))
+* [Embedded API Reference](http://developer.arrayent.com/developer-apis/aca-api/)
+ ([PDF](https://drive.google.com/open?id=1NHbWxOwI_RGL95WuD0rMs5foVHRzm5C-))
+* [ACA Datasheet](http://developer.arrayent.com/embedded-guides/embedded-datasheet/)
+ ([PDF](https://drive.google.com/open?id=1nSdJIvHWPoKnGd2gtTcPVf0uzg0NE9BZ))
+* [Data Types Reference](http://developer.arrayent.com/developer-guides/data-types-reference/)
+ ([PDF](https://drive.google.com/open?id=14MgK0dS1Of99ocOlkvGNN3EPgiWzbqtl))
+* [Device Types Guide](http://developer.arrayent.com/embedded-guides/device-types-guide/)
+ ([PDF](https://drive.google.com/open?id=1mUE8mh7mPKNa2Q9AaUfYxT_M7oN-ME9E))
+* [Troubleshooting Guide](http://developer.arrayent.com/embedded-guides/troubleshooting-guide/)
+ ([PDF](https://drive.google.com/open?id=1zI_BvDWSPxkJU0nGGcobbgMyUO8QWkRR))
+
+Web Developer Docs:
+
+* [Regular Alerts Guide](http://developer.arrayent.com/developer-guides/alert-guides/regular-alerts-guide/)
+ ([PDF](https://drive.google.com/open?id=1uP5kY_naM_d3o12oeC9MnRsyF8FFO3TD))
+* [Push Notification Alerts Guide](http://developer.arrayent.com/developer-guides/alert-guides/push-notification-alerts-guide/)
+ ([PDF](https://drive.google.com/open?id=1jI1Qeiy0-38qFtS6PR7yGkdCanEPpF9Q))
+* [SMS Alerts Guide](http://developer.arrayent.com/developer-guides/alert-guides/sms-alerts-guide/)
+ ([PDF](https://drive.google.com/open?id=1rwD3tV3yZqHRTXdHiMTNfSF2v_EeIIT2))
+* [Regular Expressions Alerts Guide](http://developer.arrayent.com/developer-guides/alert-guides/regular-expressions-alerts-guide/)
+ ([PDF](https://drive.google.com/open?id=13cL573veqzRqDlpgA3abdbU41vLnWyZ6))
+* [Scheduled Alerts Guide](http://developer.arrayent.com/developer-guides/alert-guides/scheduled-alerts-guide/)
+ ([PDF](https://drive.google.com/open?id=1LtpBbpH3Tm7kMJabZ9C-gG71jyg49lwU))
+* [Web Service API Guide](http://developer.arrayent.com/developer-guides/developers-guide-web-services/)
+ ([PDF](https://drive.google.com/open?id=1yZWuARTRtPqgEZY0YngXdZvmqfNyrZE0))
+* [System API Reference](http://developer.arrayent.com/developer-apis/acc-apis/acc-system-operations/)
+ ([PDF](https://drive.google.com/open?id=1Xiue26dRHTZajIewivaxXU7owOSV0F1C))
+* [End User API Reference](http://developer.arrayent.com/developer-apis/acc-apis/acc-customer-operations/)
+ ([PDF](https://drive.google.com/open?id=1SmcaeDaWGsxzAVfXdsCR7YY95-cgdr-R))
+* [Anonymous API Reference](http://developer.arrayent.com/developer-apis/acc-apis/anonymous-operations/)
+ ([PDF](https://drive.google.com/open?id=1yhZupH_NbyhaCFc_p80sNwmHc57udQSm))
+* [API Codes Reference](http://developer.arrayent.com/developer-apis/acc-apis/arrayent-connect-api-codes-and-messages/)
+ ([PDF](https://drive.google.com/open?id=1DG4NhOA6-yRN40cFT2nHPeifUQ7gTHND))
+
+Web App User Docs:
+
+* [Configurator Guide](http://developer.arrayent.com/developer-guides/web-applications/configurator-app/)
+ ([PDF](https://drive.google.com/open?id=1FfNmiAsZVs0ke5Euyt-wQcz3PAXehMfX))
+* [Customer Support App Guide](http://developer.arrayent.com/developer-guides/web-applications/customer-support-tool-app/)
+ ([PDF](https://drive.google.com/open?id=14mq_9THKM1CSPE8EPzAGuDm9tjW8Ojtw))
+* [Utility App Guide](http://developer.arrayent.com/developer-guides/web-applications/utility-app/)
+ ([PDF](https://drive.google.com/open?id=1-4yr0aQyQiQwhOAotYlUezJ5nef8sjNb))