## 1. Project Overview & Quickstart (seanmonstar/LICENSE-MIT)

# LICENSE-MIT

Open-source repository seanmonstar/LICENSE-MIT

### Repository Details
- **Repository:** [seanmonstar/LICENSE-MIT](https://github.com/seanmonstar/LICENSE-MIT)
- **Primary Language:** Code

*Note: High-volume repository documentation is actively indexed and synchronized by YakaAI.*

## 2. Official Technical Reference & Guides (seanmonstar/seanmonstar.github.io)

## File: README.md

# seanmonstar.github.io

---

## File: 404.md

---
layout: default
permalink: /404.html
---

# 404

Content Not Found :(

---

## File: _config.yml

# Site settings
title: seanmonstar
email: comments@seanmonstar.com
  My name is Sean McArthur, and here I blabber on about Rust,
  networking, open source, and a better web.
baseurl: "" # the subpath of your site, e.g. /blog/
url: "https://seanmonstar.com" # the base hostname & protocol for your site
rss: "/rss"
twitter_username: seanmonstar
github_username:  seanmonstar
permalink: /blog/:title/
paginate: 5

# Build settings
markdown: kramdown
highlighter: pygments

collections:
  micro:
    output: true
    permalink: /micro/:year:month:day-:title/

---

## File: now.md

---
layout: page
title: What I'm doing now
permalink: /now/
---
Updated September 24, 2026. In spirit of [/now](https://nownownow.com/about).

- Growing sustainable [personnel](/blog/hyper-user-survey-2025-results/#:~:text=sustainable%20personnel%20of%20hyper) for hyper
  - Creating an [RFC system](https://seanmonstar.com/micro/20260902-hips/) for all the outstanding proposals
  - Writing a [collaborator guide](https://hyper.rs/contrib/collaborators/)
  - Identifying new collaborators
- Driving code and [technical](/blog/hyper-user-survey-2025-results/#:~:text=the%20technical%20things) designs in hyper for 2026
  - Optimizing `h2`
  - Some sort of `impl BufProvider`
  - Designing a metrics API
  - Unstable HTTP/3 coming soon?
  - Extended testing environment?
- Coming up with a [balanced](/blog/2025-in-review/#:~:text=balance%20keeping%20up%20with%20LLM) LLM usage policy
- Contemplating HLists (specialization?) (such as [warp](/blog/warp), but much more)
- Wishing the `std::error::Error` trait [could be good](https://github.com/seanmonstar/errors)
- Finding [retainers](/retainer) and [sponsors](/sponsor) for my open source work 💲

---

## File: retainer.md

---
layout: page
title: Retainer
permalink: /retainer/
excerpt: A retainer funds your critical Rust dependencies, and gains direct access to the maintainer.
---
A retainer with me helps your team build better software.

## I unblock engineers, teams, and products.

With 2 decades of programming and open source experience, I have been working with Rust since before 1.0. My journey with open source includes deploying cloud services at Mozilla[^fxa], building out the Rust networking ecosystem at Buoyant, and advising internally AWS as part of their Rust Platform team.[^aws]

Always unblocking people.

## By maintaining


I'm the creator, maintainer, or core contributor to open source libraries you **critically** depend on:

- [hyper][], the Rust HTTP implementation, and its dependencies
- [reqwest][], the batteries-included HTTP client
- [tower][], async services and middleware
- [Tokio][], the async runtime for Rust
- [bytes][], optimized bytes manipulation
- [Axum][], the recommended HTTP server framework
- [warp][], the functional server framework inspiring the others
- [tonic][], gRPC for Rust


## By advising

I want to help you make your team build better software. Through mentoring, code audits, design doc reviews as well as any other high-touch, direct access relationship you are looking for. Think of it like having a principal engineer on your team, at a fraction of the cost.

## Get a retainer

A retainer ensures the critical libraries you depend on are funded, and gains you direct access to me for advise.

To get one, contact me at [sean@seanmonstar.com](mailto:sean@seanmonstar.com).


[^fxa]: Some of them are even still in the cloud. Do you have a Firefox Account?
[^aws]: The role I filled at AWS is the same I now provide to everyone: maintaining the software teams need, meeting with them to help solve their problems.

[hyper]: https://hyper.rs
[reqwest]: https://crates.io/crates/reqwest
[tower]: https://crates.io/crates/tower
[Tokio]: https://tokio.rs
[bytes]: https://crates.io/crates/bytes
[tonic]: https://crates.io/crates/tonic
[Axum]: https://crates.io/crates/axum
[warp]: https://crates.io/crates/warp

---

## File: sponsor.md

---
layout: page
title: Sponsor
permalink: /sponsor/
excerpt: I’m an independent OSS maintainer, so sponsors, support, and advising allow me to provide features, bug fixes, security reports, triage, and mentoring.
---
I’m an [independent maintainer](/blog/independent-open-source-maintainer), so sponsors enable me to continue to provide features, bug fixes, **security** reports, triage, mentoring, and answering of questions.

If your business depends on the [open source software that I maintain](https://github.com/seanmonstar), consider sponsoring my work. A simple mental exercise is to consider how difficult or expensive it would be if I had to stop maintaining them, and you had to replace them or write your own. Then use that to determine how much to sponsor my work. Consider it a business risk mitigation.

Here are a few ways to do so:

- [GitHub Sponsors](https://github.com/sponsors/seanmonstar)
- [Patreon](https://patreon.com/seanmonstar)

## Retainers

A [retainer][] with me could provide your company with even more value, such as:

- Private office hours
- Private reviews
- Expert advice
- **Security support**

Ask me about a [retainer][].

[retainer]: /retainer

---

## File: talks.md

---
layout: page
title: Talks
permalink: /talks/
---
- [2025 Rust for Lunch: Lessons after 10 years of Rust](https://www.youtube.com/watch?v=1PpdNu0Weas)
- [2022 curl-up: hyper in curl update](/blog/curl-up-2022-hyper-in-curl/)
- [2021 hyper in curl](https://www.youtube.com/watch?v=okGUxW_i9yk)
- [2021 re:Invent: Next Gen networking infrastructure with Rust and Tokio](https://youtu.be/MZyleK8elPk)
- [2018 Buoyant Webinar: A deep dive into Linkerd2's Rust-based data plane](https://www.youtube.com/watch?v=ig-I1641Gdk&t=1689s)
- [2015 Rust 1.0: hyper](https://www.youtube.com/watch?v=BvIx90ic6YA&t=950s)

## Podcasts

- [2025 Netstack.fm](/blog/podcast-netstackfm): story of Rust's networking with hyper
- [2024 Rustacean Station](/blog/podcast-rustacean-station-2): hyper 1.0, independent open source maintainership, client middleware, HTTP/3
- [2021 Rustacean Station](https://rustacean-station.org/episode/045-sean-arthur/): history of hyper, async, hyper in curl, HTTP/3

## Invite

I'm happy to speak at events, or to join a podcast. Send me the details
at [sean@seanmonstar.com](mailto:sean@seanmonstar.com).

---

## File: _micro/2026-06-23-owning-my-microblog-with-posse.md

---
layout: post
title: Owning my microblog with POSSE
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3moxoziz7bt2a
mastodon_url: https://masto.ai/@seanmonstar/116800081222670012
---
[POSSE](https://indieweb.org/POSSE) is the practice of publishing on your own site first, and pushing that out to other services. To get the content where people are, while linking back to the original owned post.

I now have a `/micro` blog on my own website, and automation (a GH action) to break up new posts and send them to Mastodon and Bluesky as threads. It even has it's own [rss feed](https://seanmonstar.com/micro/rss).

This new setup lets me nudge people more towards my own property. As various other properties come and go, my online identity and content lasts longer.

And it solves one of my [longer-standing concerns](https://masto.ai/@seanmonstar/109319880660929327) about microblogging: it feels like they can be more important content now, because they're _mine_.

---

## File: _micro/2026-07-13-errors-not-partialeq.md

---
layout: post
title: Rust Errors generally shouldn't be PartialEq
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mqkczwc5pi2e
mastodon_url: https://masto.ai/@seanmonstar/116914079479624311
---
Errors might have internal details that don't make sense to compare. Like positional data, or a source chain. Even if you don't have those details yet, committing to a public API of `PartialEq` can restrict you from internal refactoring.

The common reason to want this is for testing purposes. People want to assert an error case matches what they expect. But that doesn't need equality. `matches!` , `kind()`, or `is_*()` patterns fit better.

A public, exhaustive, flat `enum` could choose differently. But those look more like a `kind()`. If you have private error details, I don't think they make sense for comparing.

Some interesting discussion a [few years ago](https://www.reddit.com/r/rust/comments/n12uf9/is_there_a_good_reason_not_to_impl_eqpartialeq/).

---

## File: _micro/2026-07-21-accessors-reveal-internal-repr.md

---
layout: post
title: Accessors can reveal internal representation
tags:
- rust
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mr636abih22m
mastodon_url: https://masto.ai/@seanmonstar/116958561963661866
---
As a library maintainer, it's common to receive requests from users to add a "simple accessor". The data is _right there_. But that accessor can end up revealing internal representation details that you can no longer change.

This is one reason why it could be a better practice to return an `impl Iterator` instead of `&[T]`. The latter freezes you in place to always storing the data in consecutive memory. (Such as `String::as_bytes()`.)

View types might help too, like `Ref<'_>`. Returning a reference requires the data already exist in that shape in `self`. You can't change its shape in the accessor and return a reference to _that_.

---

## File: _micro/2026-07-29-i-want-your-own-words.md

---
layout: post
title: I want your own words
tags:
- llms
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mrrzeh7ojl2m
mastodon_url: https://masto.ai/@seanmonstar/117003470909498364
---
If you choose to communicate with me, all I ask is that you use your own words. Bug reports and issues. Pull request descriptions and especially review comments. This isn't new, but I wanted a link of my own.

LLMs write way _way_ too much. I don't know if you understood it enough for me to ask questions back. They don't use reasoning, so is it real? If you didn't care enough to write it, do I care to read it?

---

I'm torn when I receive LLMed reports. Initially, I really don't want to read all that. But at the same time, my mind nags me; something's broken and I should fix it for everyone. If it makes it easier for someone to report a bug, that's a pro, I guess.

At the same time, that's not an excuse for expecting me to like LLM-generated English. [Reading LLM words makes us worse writers](https://seanmonstar.com/micro/20260917-reading-llms-worsens-writing/). So, be kind and respectful.

---

## File: _micro/2026-08-12-trait-fluent-durations.md

---
layout: post
title: A trait for fluent Durations
tags:
- rust
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3msvew6rwcw2d
mastodon_url: https://masto.ai/@seanmonstar/117083096961219861
---
I dislike the pattern in some languages to create durations by multiplying constants. It feels like a concession when it cannot be expressed more nicely. There's a [tracking issue](https://triagebot.infra.rust-lang.org/gh-comments/rust-lang/rust/issues/57391) to add such constants in libstd.

How about a trait instead? (I suggested it in the tracking issue a long time ago, but it's lost in the noise). Rust traits are awesome. They can be implemented on any other type, even primitives, without them needing to cooperate.

A trait could allow us to write `5.seconds()`, or `200.milliseconds()`, etc. I think this is much better. I would rather this exist instead. Maybe `std::time::TimeUnits`, or pick a better name, doesn't matter which, just that it's easy to import.

---

## File: _micro/2026-08-25-llms-not-that-rock.md

---
layout: post
title: Using LLMs to find not-that-rock
tags:
- writing
- llms
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mtvyvrp2ov2b
mastodon_url: https://masto.ai/@seanmonstar/117156561013544243
---
Imagine someone tells you to get them a rock. You go find one, bring it back, and they reply 'no, not that rock'. They didn't know exactly what they wanted, but they knew yours wasn't it.

When writing, I always start by dumping a detailed outline with points and subpoints. And then, ugh, I feel a wall. How do I turn this into prose? I ask an LLM to try, I look at the ablated text, and I hate it. No, definitely not that rock. More like this.

---

## File: _micro/2026-09-02-hips.md

---
layout: post
title: 'HIPs: hyper Improvement Proposals'
tags:
- hyper
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mukbmcv2t52z
mastodon_url: https://masto.ai/@seanmonstar/117202209530003621
---
A short intro for now: since hyper stabilized 1.0, it powers more, and needs more. Large improvements lacked a clear path for proposal, scrutiny, and decision. So, [hyper Improvement Proposals](https://hyper.rs/contrib/hips/0001-hyper-improvement-proposals/), or HIPs.

They're a lot like RFCs. With some tweaks from lessons learned. Making maintenance more repeatable, less in one mind. The writing is the thinking. It documents the why. A sustainable personnel of hyper.

---

## File: _micro/2026-09-17-reading-llms-worsens-writing.md

---
layout: post
title: Reading LLM text makes us worse writers
tags:
- llms
- writing
bsky_url: https://bsky.app/profile/did:plc:ax5sh6hthwrelunhn2bfmrsb/post/3mvq2t66c3q2t
mastodon_url: https://masto.ai/@seanmonstar/117287300418166985
---
The top advice given to anyone wanting to get better at writing, besides just writing, is to _read_ more. Especially good writing. Because we imitate that which we experience more of.

So then, perhaps obviously but it took way too long for me to realize, [reading LLM output influences how we write](https://nolanlawson.com/2026/08/31/on-not-becoming-a-cyborg/). And since writing is thinking, it seeps in, ablating the voice in my head. I'm, as one says, horrified.

I value LLMs for their ability to understand hyper-specific search queries. But I want to consider how much of the generated text I read; it's better to read the human source. Or [other non-forced exposure](https://seanmonstar.com/micro/20260825-llms-not-that-rock/).

---

## File: _posts/2023-11-15-hyper-v1.md

---
layout: post
title: 'hyper v1'
date: '2023-11-15T12:44-04:00'
tags:
- rust
- hyper
- open-source
- http
---
I'm excited to announce [v1.0][] of [hyper][], a protective and efficient HTTP library written in the Rust programming language. hyper provides asynchronous HTTP/1 and HTTP/2 server and client APIs, allowing you to bring your own IO and runtime.

It's been exciting and humbling to watch users build awesome things. [Cloudflare](https://blog.cloudflare.com/introducing-oxy/) uses hyper within Oxy, its next generation proxy framework to handle traffic at considerable scale. After [Discord](https://discord.com/blog/why-discord-is-switching-from-go-to-rust)'s 5x improvement to @mention response times a few years ago, they have moved most of their [critical systems](https://discord.com/blog/how-discord-stores-trillions-of-messages) to depend on Rust and hyper. curl has a currently [experimental HTTP backend](https://github.com/curl/curl/blob/master/docs/HYPER.md) built on hyper with the goal of [making the Internet safer](https://aws.amazon.com/blogs/opensource/how-using-hyper-in-curl-can-help-make-the-internet-safer/).

Marc Brooker, a Distinguished Engineer at [AWS](https://arxiv.org/pdf/2305.13162.pdf), commented:

> When building our new container-loading data plane for AWS Lambda, we expected to need a custom binary protocol. In production, we’ve found the overhead of `hyper` to be SO low that we are excited for it to continue powering our services.

Johan Andersson, CTO at [Embark](https://embark.dev), said:

> We have been using and relying on `hyper` for the last 5 years for our gRPC and REST services, tools, libraries, and embedded in our next game built in Rust. It has been rock solid across all of our usages, and it really is a foundational library for the Rust ecosystem. Congrats on 1.0!



The best way to get started is to check out the [guide][].

## Stability here we come

Over the past 9 years, hyper has grown from a web developer's side project into a solid library powering huge network applications. It's time to grow up. After bringing `async`/`await` support in v0.14, we focused on providing a set of basic APIs that would keep hyper safe, fast, and flexible. This meant removing some of the more opinionated "higher level" pieces. Those belong elsewhere, like [hyper-util][], reqwest, Axum.

This release signals some [stability][]. Major versions, like 1.0, are stable for at least 3 years.[^oops] We also keep a [MSRV][] that is at least 6 months old.[^msrv] We'll add _new_ features, and we still have a couple places to experiment: in the `hyper-util` crate, and `hyper_unstable` compiler flags.

Starting in [v0.14.25](https://seanmonstar.com/blog/this-month-in-hyper-march-2023/), we added a `backports` feature which brings the new core APIs to you immediately. Combine that with the `deprecated` feature, and you'll be guided to making your existing code ready for the upgrade to 1.0. Be sure to check out the [upgrade guide](https://hyper.rs/guides/1/upgrading)!

## Next

The most immediate next steps are to update the other core parts of the ecosystem that depend on hyper: [reqwest][], [Axum][], [Tonic][]. But after that, there's plenty more to do. You're welcome to come [join us][contrib]!

### HTTP/3

I would like this to be _my_ next focus. We've been building up the [`h3`][] crate, and [reqwest has unstable support](https://docs.rs/reqwest/latest/reqwest/#unstable-features) now. I'd like to stabilize the feature in reqwest, and explore how we can make it available in hyper directly. Then we can have easy HTTP/3 servers, too!

The trickiest question is making it available without being tied to a TLS/QUIC library. Then, users could choose to use quinn, or s2n-quic, or msquic, or any other.

### Stabilize in curl

The biggest parts of making hyper work in curl are done. Someone with experience in Rust and C could make a huge dent in Internet safety [helping to get it over the finish line](https://seanmonstar.com/blog/help-stabilize-hyper-in-curl/).

### Middleware

There's some excellent middleware available already in [tower][] and [tower-http][]. But several of the important ones are just a little (or a lottle) too difficult to add to a stack. I'd also love for there to be some recommended stacks for servers and clients, that bundle together the right middleware that most people would need. To that end, I've mentioned before breaking open [reqwest][] such that all of its features are middleware you can customize.

### Tracing and Metrics

It's possible to currently get a decent set of logs using `tower_http::trace`. It'd be better if you could get more fine-grained traces and metrics. Probably with some stabilized integration with `tracing` directly in hyper. Maybe some sort of `hyper-metrics`, similar to [`tokio-metrics`][].


### `io_uring`

Part of the reason we made hyper have its own [IO traits](https://github.com/hyperium/hyper/issues/3110) was to be able to adapt them for completion-based IO. I believe having decent support and benchmarks could be had pretty soon, by a motivated individual.

## Thanks

A huge thank you to all our amazing contributors. You’ve made this project the success it is, and helped move hyper along the journey to 1.0. I'd like to follow up with a separate post specifically thanking you all.

Thanks to the companies who have sponsored the creation of hyper: [AWS](https://aws.amazon.com/), [Buoyant](https://buoyant.io), [Mozilla](https://mozilla.org), [Rust Foundation](https://foundation.rust-lang.org/news/announcing-the-rust-foundation-s-2023-fellows/), [Fly.io](https://fly.io), [Embark](https://embark.dev/) and [others](https://github.com/sponsors/seanmonstar#sponsors).

Your company could also become a [sponsor or get support][sponsor]!


[^oops]: Besides some correctness mistake that _must_ be fixed ASAP.
[^msrv]: We realize that some users just _cannot_ upgrade that fast, and we care about them.

[v1.0]: https://github.com/hyperium/hyper/releases/tag/v1.0.0
[hyper]: https://hyper.rs
[guide]: https://hyper.rs/guides/1
[stability]: https://hyper.rs/contrib/vision/#stability-promise
[MSRV]: https://hyper.rs/contrib/msrv/
[contrib]: https://hyper.rs/contrib/
[hyper-util]: https://github.com/hyperium/hyper-util
[`h3`]: https://github.com/hyperium/h3
[Axum]: https://crates.io/crates/axum
[Tonic]: https://crates.io/crates/tonic
[tower]: https://crates.io/crates/tower
[tower-http]: https://crates.io/crates/tower-http
[reqwest]: https://crates.io/crates/reqwest
[tracing]: https://crates.io/crates/tracing
[`tokio-metrics`]: https://tokio.rs/blog/2022-02-announcing-tokio-metrics
[sponsor]: https://seanmonstar.com/sponsor

---

## File: _posts/2024-01-16-2023-in-review.md

---
layout: post
title: '2023 in review'
date: '2024-01-16T08:29:00'
tags:
- yearly
- rust
- hyper
- open-source
- http
---
A year of change, and of stability. Let me briefly reminisce and highlight what happened in 2023.

## Independent

I became an [independent maintainer](https://seanmonstar.com/blog/independent-open-source-maintainer/) in June 2023.  This was a somewhat scary decision, but it did exactly what I hoped it would: my work-life balance feels fantastic. I'm also glad to be able to do similar to what I did at AWS—meeting with and advising teams with serious deployments—but with a wider variety of use cases. (Send me an [email][sponsor] if that interests you.)

## hyper

First, some stats about [hyper][] over the past year. There were 90 unique authors this year, which is 40% growth from 2022! We had two more people sign up to be [triagers](https://hyper.rs/contrib/governance#triager).

### v1 🚀

We released [hyper v1][] in November. What a ride. It brought changes, moving the less stable side out into `hyper-util`. But it also signaled a core that won't be changing any time soon. Stability.

The ecosystem caught up quickly. There were releases for `tower-http`, `headers`, and  [Axum](https://tokio.rs/blog/2023-11-27-announcing-axum-0-7-0) ready to go just a couple weeks after.  It enabled some other cool things, like the [general availability of the AWS SDK for Rust](https://aws.amazon.com/about-aws/whats-new/2023/11/aws-sdk-rust/).

We closed out the year with v1.1, bringing back core pieces needed to make graceful shutdown in servers easier again.

### Security

I reviewed at least 10 security reports, perhaps a couple more I didn't keep track of. This includes the wider [HTTP/2 rapid reset attack](https://seanmonstar.com/blog/hyper-http2-rapid-reset-unaffected/) that hyper wasn't affected by. The amount of time I spend on security reports keeps on increasing. That makes sense, we announced stability of v1, which surely made more people take a look. It also is a sign of more production deployments, with companies wanting to audit their dependencies.

## HTTP/3

Another priority this year was to make progress on hyper's HTTP/3 support, currently under development in the [h3 crate][h3]. We released some initial 0.0.1 releases (and a few more subsequent ones), specifically to make it easier for people to use. **[reqwest][] gained unstable HTTP/3 support**, using `h3`, and some brave users have enabled it, found it working well, and are now asking if we can make it stable. A couple of other fine folks worked to make the `h3-webtransport` crate, building on top of `h3`.

## Future Focus

Doing a bit forward looking, what's the plan for 2024?  Well, of course it could change at any moment, but these seem to be the things people most ask me for, and most need.

### HTTP/3 in hyper

I hope to make significant progress towards getting HTTP/3 support directly in hyper. I'll work on a proper proposal, but here's some unordered steps in that direction. Stabilizing the feature in reqwest. Set up an auto-updating `h3` server for interop testing. Dig away at the [compliance report](https://hyper.rs/h3/ci/compliance/report.html), both by labeling more of the parts already working, and adding any missing parts. Propose how to expose it in hyper, which will be tricky so as to not tie hyper to any specific TLS library. And then get it actually added, likely as a `hyper_unstable_h3` feature to start.

### Level up Client middleware

There's a lot of great middleware now. But it can still feel like it requires an expert to use it properly. I've been hinting at for a while that I'd like to do for clients what [Axum][] has done for servers. I hope to do that with [reqwest][].

reqwest does a lot of useful things, but if someone wants to customizing it beyond the options that reqwest exposes, they have to reimplement a lot (or live with a fork). I want to make most of reqwest's features `tower` middleware. reqwest will still have a standard "recommended" client. But it should be easier to build up your own custom stack.

And while we're at it, I hope to make some of the most important and yet most difficult middleware much easier to sprinkle in: retries, limits, and load balancing.

### On-going maintenance

I also must carve out explicit time for maintenance work. There's bugs that need fixing. Reviewing and triage takes a lot of my energy. I want to improve the docs and guides.  The amount of security reports received is growing, and those take time to investigate and respond or patch and disclose, depending on their validity and severity. This also includes time with my [sponsors][sponsor], which helps identify maintenance work priorities.

[Want to join us?](https://hyper.rs/contrib/contributing/)

[hyper v1]: https://seanmonstar.com/blog/hyper-v1/
[hyper]: https://hyper.rs
[h3]: https://github.com/hyperium/h3
[Axum]: https://crates.io/crates/axum
[reqwest]: https://crates.io/crates/reqwest
[sponsor]: https://seanmonstar.com/sponsor

---

## File: _posts/2024-03-20-reqwest-v012.md

---
layout: post
title: 'reqwest v0.12'
date: '2024-03-20T08:13:00'
tags:
- rust
- reqwest
- hyper
- http
---
Today marks the [v0.12][] release of [`reqwest`][reqwest], a higher-level, batteries-included HTTP client for the Rust language.

## What's new

The headline feature of reqwest v0.12 is the upgrade to [hyper][] v1. reqwest does a lot of custom work to add features to hyper internally, but doesn't need to expose too much of it publicly. This was what took the majority of the work to upgrade. Still, as outlined in the [the hyper v1 announcement](/blog/hyper-v1), the parts that _are_ public have stabilized. The most obvious improvement to most users of reqwest will be the stable integration with `http` v1 types. This should remove the last blocker for a lot of people to finish upgrading to hyper v1.

With the breaking change, we made a few more improvements. Several optional features have been added which previously were required, such as `http2` and `charset`. This allows disabling them and making the compilation time and size lower if not needed. We also converted all the implicit optional dependency features to `dep:` syntax.

We had to disable the HTTP/3 feature, but it was experimental anyways. It's a goal to bring it back as soon as possible. We might also be able to add some other QUIC backends, such as s2n-quic.

See the [release][v0.12] for more details.

## Coming next

As mentioned a few times before on this blog, my focus next is to make a bunch of the powerful features in reqwest available as middleware. reqwest will **remain easy to use**. But it will be _possible_ for people configure their own client stacks, without needed to fork or copy code. It will also mean even if you use the reqwest default easy stack, you can more easily integrate it with other tower middleware, such as retries or load balancing.

## Thank you!

reqwest usage keeps on growing, and it's both humbling and exciting to watch! For example, [rustup](https://rust-lang.github.io/rustup/) uses reqwest as its default download backend, helping all Rust developers to keep their compiler up to date. [Oxide](https://oxide.computer) uses reqwest in their [Progenitor](https://github.com/oxidecomputer/progenitor) library that powers their OpenAPI clients.

Thank you for all your contributions, both in reporting issues, and in helping fix them. <3

## Sponsor and Support

If your company uses reqwest, consider becoming a [sponsor][]. Additionally, for private advice, reviews, security help, and access to the maintainer, get in touch for [support][sponsor].

[reqwest]: https://crates.io/crates/reqwest
[v0.12]: https://github.com/seanmonstar/reqwest/releases/tag/v0.12.0
[hyper]: https://hyper.rs
[sponsor]: https://seanmonstar.com/sponsor

---

## File: _posts/2024-03-29-podcast-rustacean-station-2.md

---
layout: post
title: 'Podcast: Rustacean Station, hyper 1.0, and independent maintainership'
date: '2024-03-29T10:09:00'
tags:
- rust
- hyper
- podcast
- open-source
---

I was recently a [guest on the Rustacean Station podcast][podcast]. It was nice to catch up after a couple years since [my last appearance](https://seanmonstar.com/blog/podcast-hyper-on-the-rustacean-station/) on the show. We spoke about hyper, how and why it became v1.0, becoming an independent maintainer, future work, and more.

I thought I'd grab a few fun and interesting quotes, with their timestamps:

## Sponsoring is not the Mafia (11:48)

> The lowest engagement is [sponsorship][sponsor] where it's like, what am I getting from your sponsorship? If you turn it around and think about, well, a lot of times open source is like this common good that everyone kind of benefits from and I don't want to pay for it because someone else is going to pay for it, right? It's kind of like this Russian roulette of like, well, if no one pays for it, then eventually that thing is going to go away.
>
> So sometimes when I talk to the companies, I just ask them, hey, how much are you using this stuff? You're using it a lot. Cool. How annoying or how much work would it be to have to maintain it yourself if I were to just disappear? Oh, then we'd have to put a whole engineer on that or something like that. Okay. So if you think of it as a business risk mitigation to sponsor, then I can keep doing it. And then it becomes like, okay, well, we would pay a full-time engineer to do this all year. We can pay a way smaller amount to just have the sanity check that this is not going away.
>
> And so what do they get? They get a business risk mitigation.

> _You'll have to excuse me, but I've been watching a lot of Sopranos. And so when you said, how bad would it be if this thing happened to go away? It sounded a little bit like a tactic they might use to secure the contract._

> (laughs) Yeah, it's not like an insurance racket.

## Access to the maintainer / advising (12:50)

> There's [more things that I can offer][sponsor] and I do offer. Another one is people want to be able to ask, hey, we're using your stuff and we want to know are we using it correctly or, hey, we've been trying to use it and we have this problem and we don't understand why. Could you take a look?
>
> If it's a private project, people aren't going to post their source code into a public issue. I'm not going to have the time to go and take a look unless it's like, hey, let's get a retainer and I can now sign an NDA. I'm not going to steal their code, all that legal stuff.
>
> It's like getting an [advisor][sponsor], a reviewer, and then I can then take that knowledge and go back and be like, okay, so I now have knowledge that like company so-and-so is using this in a way that I didn't expect. How can I make it better for them? So like, both sides benefit, but it's only possible if I set up contracts and everyone's legally happy.

## Breaking people, not kneecaps (30:55)

> If something would be a breaking change, then we label it with a breaking change. And it's not something we can do right now. We can close it or postpone it or something. And then, you know, maybe three years from now, go and take a look at all the issues that are labeled that and say like, yeah, you know what, this would be worth breaking for. But at the same time, I'd love to not have to break people, even though, you know, the promise is only for three years. I'd love to not have to.

> _Did you just say break people? We did go back to the mafia reference, right? But no relation, right?_

> Exactly. Yeah. No breaking kneecaps.

## Client middleware (32:12)

> The other major thing is improving middleware. There's all this stuff in [tower][], and it's great. Like there's [Axum][]. You can use it to make really powerful servers. But the point of this middleware was actually that you could use it both ways. You could use it for servers, but you could also use it for clients. And that doesn't work as well.
>
> The most popular thing to use for clients is [reqwest][]. And it doesn't fit in to tower middleware. It has a bunch of extra stuff like redirects and some other things that it does. Various kinds of timeouts, which would be great middleware, but it's currently all just wrapped up in reqwest.
>
> And then also, if you even just look at the middleware in the first place, it's like opaque. You have to understand how to do service discovery to then use load balancing. You have to understand how to build a retry policy before you can fit in retries and understand what is a retry budget.
>
> It's complicated. And it'd be nice if people could just get, hey, this is better for 95% of use cases. And if you really want to go and tweak your retry policy, sure you can. There's the escape hatch over there.
>
>  But that's my other thing to work on. Make reqwest and like Tower's client middleware merge together a whole lot nicer so you can have [much better stacked clients][reqwest-next].

## Retry storms and budgets (33:50)

> Since there wasn't a really easy plug-in, then people implement retries themselves. And that includes making themselves vulnerable to retry storms and just not doing it in a safe way. And the thing is that we have this middleware and things that would protect you from that, but they're just complicated enough that people are like, ah, I can just retry in a loop.
>
> But then you smash the server once things start falling apart. And it'd be so much better if you just add in a retry layer. It's going to do things wisely. And maybe you say, you know what, on this URL, never retry it, but otherwise do the default thing.
>
> It'd be so much nicer if you didn't have to understand how bad retries can go.
>
> If you just do a simple counter, then you might have counters at various layers. And maybe your counters aren't shared. And now even though you're trying to be nice to the server, you're still retrying on thousands of times, whereas a shared [budget][] or something would notice after a few retries, hey, the server's overloaded. Let's stop pounding it. Because as long as we keep trying, it's never going to get back up. That's one of the problems with retry storms.
>
> The [linkerd blog](https://linkerd.io/2019/02/22/how-we-designed-retries-in-linkerd-2-2/#using-retry-budgets) had a good post on how you can fix that using Tower middleware. But I'd prefer it if people didn't have to read that to use it.

## And plenty of other topics

Go [have a listen][podcast], I hope you find it informative!

[podcast]: https://rustacean-station.org/episode/sean-mcarthur/
[sponsor]: https://seanmonstar.com/sponsor
[tower]: https://crates.io/crates/tower
[Axum]: https://crates.io/crates/axum
[reqwest]: https://crates.io/crates/reqwest
[budget]: https://docs.rs/tower/latest/tower/retry/budget/struct.Budget.html
[reqwest-next]: https://seanmonstar.com/blog/reqwest-v012

---

## File: _posts/2024-04-03-hyper-http2-continuation-flood.md

---
layout: post
title: 'hyper HTTP/2 Continuation Flood'
date: '2024-04-03T14:11:00'
tags:
- rust
- hyper
- http
- security
---

Patches are available for [`h2`][h2], v0.4.4 and v0.3.26, to harden against a newly disclosed HTTP/2 attack vector, mostly for servers. If you need help, reach out for [support][sponsor].

If you're curious about more, read on.

## What is the attack?

In HTTP/2, there are a bunch of frame types. Some of those frames are related to sending headers (or fields). Since there is a maximum frame size, in order to send more headers than fit, a peer can send `CONTINUATION` frames that indicate more headers for the message.

That mechanism is the source of a new attack, trying to send an infinite number of `CONTINUATION` frames to starve or kill a server. This was a coordinated release, with various implementations involved. [VU#421664][VU] has details about the others.

## hyper's `h2` is somewhat affected

The HTTP/2 specification doesn't state a default value for `SETTING_MAX_HEADER_LIST_SIZE`. You should set that to something reasonable for your use case. But even if you don't, `h2` picks an emergency default, which is fairly high so to as to not reject requests for users who need big requests.

Once a stream of headers and continuation frames reach the limit, either configured or the large default, memory growth will cap there. `h2` will keep reading and decoding, but discarding any new headers. Really, it's trying to keep the HPACK table in sync, and will send back a stream error once finished of "too big".

The problem is that `h2` won't stop reading as long each CONTINUATION frame says there are more coming. So the memory stays the same, but it will use CPU to read and discard. And since the headers are never "complete", the application doesn't get to know about the processing of frames.

However, if deployed on Tokio (or some other runtime with a similar feature), the [task budget][] will prevent it from locking out other tasks. Other requests _can_ be served, and responded to. But it will make it slower.

A degradation of service.[^cve]

## What we did

Besides testing and determining the above, we also worked on a fix.[^who]

We realized that while a lower `SETTING_MAX_HEADER_LIST` does help, it's not the only thing that needs to be checked. The reason for that is because a `CONTINUATION` frame could be sent with the smallest header value, and thus take longer to reach that maximum. That will still consume resources processing frames.

We figured that a maximum needed to be set on the allowed `CONTINUATION` frames. But a naïve hard-coded number has its own problems.

The maximum frame size isn't usually changed, which means you're stuck with 16kb frames. And if you _do_ want to allow message headers bigger than that, then you need to allow `CONTINUATION` frames. Since both frame size and header list size are configurable, a hard-coded limit wouldn't work.

We settled on calculating how many `CONTINUATION` frames would be needed for a legitimate message to send up to the max header list size. We also add a little bit of padding to that number, to account for frames that may not be perfectly packed.

The patch has been tried out on some production servers, and found no false positives.

## What you can do

- If you don't use HTTP/2 on a server, then don't worry.
    - If you do, but are not exposed to untrusted L7 traffic, also don't worry.
- If you don't set the `SETTING_MAX_HEADER_LIST_SIZE`, you should consider doing that.
- You should run `cargo update -p h2` in your application to pull in the latest versions with fixes (v0.4.4 and v0.3.26).

If you need help, reach out for [support][sponsor]. Or send [thanks][sponsor], so that months long security work like this can be done in the future.

[^cve]: For this reason, we didn't create a CVE. I'm sure some well tell me I'm wrong. I'm already skeptical of CVEs for denial-of-service; it's a big deal for some people, and not at all for others. I'm also very wary of alert fatigue. A _degradation_ of service, where things are just slower, does not feel like a "wake-up-your-team" moment. (We did submit a RustSec advisory to nudge people to upgrade.)

[^who]: [Noah Kennedy][] and I have worked on this on and off for a few months, while waiting for the VINCE deadline. Thanks Noah!

[h2]: https://crates.io/crates/h2
[sponsor]: https://seanmonstar.com/sponsor
[task budget]: https://tokio.rs/blog/2020-04-preemption
[Noah Kennedy]: https://hyper.rs/blog/2024/02/28/welcome-noah-kennedy/
[VU]: https://www.kb.cert.org/vuls/id/421644

---

## File: _posts/2024-11-19-hyper-in-curl-needs-a-champion.md

---
layout: post
title: 'hyper in curl Needs a Champion'
date: '2024-11-19T09:48:00'
tags:
- rust
- hyper
- curl
- memory-safety
---

**tl;dr** - hyper in curl is nearly complete, but it needs a champion. Without a partner actively engaged that wants to enable and ship, it's now on the path for being deprecated and removed.

It needs a champion, a backing vendor or distro. Will that be you?

**UPDATE 2024-12-21**: [curl has dropped hyper][bye].

## Why would you put a hyper in a curl?

Why would you? Memory safety.

[Company](https://www.zdnet.com/article/microsoft-70-percent-of-all-security-bugs-are-memory-safety-issues/) after [company](https://www.chromium.org/Home/chromium-security/memory-safety), [product](https://security.googleblog.com/2019/05/queue-hardening-enhancements.html) after [product](https://hacks.mozilla.org/2019/02/rewriting-a-browser-component-in-rust/),  [report](https://langui.sh/2019/07/23/apple-memory-safety/) after [report](https://googleprojectzero.blogspot.com/p/0day.html). Memory _un_-safety. Causes. Serious. Issues.

[curl][] is _everywhere_. Billions of installations. It's likely all humans accessing the internet use curl.

A self-analysis of curl finds that [half of curl's vulnerabilities are C mistakes](https://daniel.haxx.se/blog/2021/03/09/half-of-curls-vulnerabilities-are-c-mistakes/). Memory safety.

As I said when [when we told the world about it](https://aws.amazon.com/blogs/opensource/how-using-hyper-in-curl-can-help-make-the-internet-safer/):

> Considering how much curl is used, this was an opportunity to make the _internet_ safer.

[hyper][] is the most mature HTTP library written in Rust. By making hyper a possible HTTP backend for curl, the code used for the most ubiquituous protocol could be made safer. Certainly true for HTTP/1, even more so with the much bigger (code-wise) HTTP/2 and HTTP/3.

So, why do this? Oh, right. Ahem. **Memory safety**.


## Most of the work is done

Let me back up a little.

In 2020, we started [exploring the idea](https://www.memorysafety.org/blog/memory-safe-curl/). I designed and built a [C API for hyper](https://docs.rs/hyper/latest/hyper/ffi/). Daniel refactored curl to allow for HTTP backends, and [integrated hyper](https://daniel.haxx.se/blog/2021/05/28/taking-hyper-curl-further/).

We got it nearly complete. Adventurous tinkerers were able to build and use it on their personal machines. Over 95% of curl's large test suite was passing.

I gave [a talk for curl up 2022](https://seanmonstar.com/blog/curl-up-2022-hyper-in-curl/) about the progress.[^since]

We're ready to finish, technically.

## Over the finish line

[Funding for an engineer](https://www.memorysafety.org/blog/memory-safe-curl/) to complete the work is available.

But the upkeep of the feature isn't free, in both the curl and hyper repositories. Because of that, and without a commited organization wanting to ship it, it's [planned to be removed](https://github.com/curl/curl/blob/7b12c36ca972d9e9a14088cdd88232385e619d44/docs/DEPRECATE.md#Hyper) at the start of 2025.

So, what exactly could change that? What is needed?

## Champion required

A champion, if you want it.[^want]

**A backing vendor or distro** that wants to enable and actively use the backend. A launch partner. Many people know what it's like to work on a large new feature, ask people to try it out, and everyone is too busy, assuming someone _else_ will. A launch partner actively tests it and provides feedback. 

There's [more incentive](https://thenewstack.io/feds-critical-software-must-drop-c-c-by-2026-or-face-risk/) to partner than ever, as we see companies [successfully make code safer](https://security.googleblog.com/2024/10/safer-with-google-advancing-memory.html). And this project is so close, adopting now can have a large impact compared to the remaining effort.

[Reach out to me][contact] if you want this to happen. Sooner rather than later. Let's make the _internet_ safer!

**UPDATE 2024-12-21**: [curl has dropped hyper][bye].

[^since]: Recently, a few more things have been improved on hyper's side. For instance, @nnethercote and @jsha [significantly improved](https://github.com/hyperium/hyper/pull/3296) [the C docs](https://github.com/hyperium/hyper/pull/3424), and  @hjr3 [added HTTP/1.1 trailers support](https://github.com/hyperium/hyper/pull/3637) that curl needed.

[^want]: People _always_ end up doing exactly what they want. There's a loud rewrite-it-in-Rust sub-community. Here's an opportunity. Actions show what people actually want.

[hyper]: https://hyper.rs
[curl]: https://curl.se
[contact]: https://seanmonstar.com/about#contact
[bye]: https://daniel.haxx.se/blog/2024/12/21/dropping-hyper/

---

## File: _posts/2024-12-10-hyper-roadmap-2025.md

---
layout: post
title: 'hyper Roadmap 2025'
date: '2024-12-10T11:48:00'
tags:
- rust
- hyper
- open-source
- http
---
After a year since [hyper 1.0][v1], we're updating the ROADMAP. [hyper][] is an HTTP library written in Rust, used by many in production.

The purpose of the [ROADMAP][] is to highlight what is highest priority in order to continue orienting hyper towards its VISION.

It's based on interviewing our users to see make sure what the most important things are. Writing it down is a way of letting users know what's coming next.

## Open source is guiding

Open source is not a company, and so people can work on and contribute whatever they want.

But we _can_ guide contributions, by outlining what is most important for the project. Thus, a secondary purpose of the roadmap is to be a guide for those interested in contributing, but not sure what to do specifically.

## Focus Areas

The roadmap breaks down [four focus areas][ROADMAP]:

1. **Documentation**: Invest in docs, guides, and examples to ensure users can learn how to use hyper.
2. **hyper-util**: Provide new helpers for use with hyper, and stabilize and graduate some into hyper itself.
3. **HTTP/3**: Harden the `h3` crate ([reqwest](https://docs.rs/reqwest/latest/reqwest/#unstable-features) uses this already!), and use it to power `conn::http3` in hyper.
4. **Observability**: Improve visibility into hyper’s operations through stable support for events, tracing, and metrics.

## A living document

The ROADMAP is a living document. As we make progress, or as priorities change, the document can too. Proposals for additions and edits are always welcome.

## Contribute

If you've wanted to [get started contributing][CONTRIBUTING] to a Rust open source project, help us build hyper! Pick one of the focus areas that interest you, and reach out in an issue or Discord. We'd be thrilled to mentor you.

[hyper]: https://hyper.rs
[v1]: https://seanmonstar.com/blog/hyper-v1/
[ROADMAP]: https://hyper.rs/contrib/roadmap/
[CONTRIBUTING]: https://github.com/hyperium/hyper/blob/master/CONTRIBUTING.md

---

## File: _posts/2025-01-15-2024-in-review.md

---
layout: post
title: '2024 in review'
date: '2025-01-15T12:05:00'
tags:
- yearly
- rust
- hyper
- open-source
- reqwest
- curl
---
I want to go through some highlights of the year. Thanks for coming along for the ride![^1]

## A year of being independent

This was my first entire year of my being an [independent open source maintainer](https://seanmonstar.com/blog/independent-open-source-maintainer/). I'm very happy with how it turned out!

I highly appreciate all who [sponsor][sponsors] some amount each month, thank you all! It adds up. <3

I've found setting up [advisor retainers][sponsors] to be very effective: I get to help engineers with private code, the higher context helps prioritize features or fixes that are needed, and the maintenance work that people don't always want to think about is funded. 

I'm hopeful about this next year, and I'll need your help to continue.

## hyper

One of the things I'm most excited about is that in the beginning of the year, we added 3 new collaborators to hyper: [@Noah-Kennedy](https://hyper.rs/blog/2024/02/28/welcome-noah-kennedy/), [@dswij](https://hyper.rs/blog/2024/03/04/welcome-dswij/), and [@tottoto](https://hyper.rs/blog/2024/03/08/welcome-tottoto/).

More collaborators improve the health of the project, reduces review load, increase diversity of thought, etc. Some ask how they can be become one, so I spent some time writing [what a collaborator is](https://hyper.rs/contrib/governance#collaborator) in hyper's contrib docs.

There were 12 releases of [hyper][], not to mention explorations in `hyper-util`, and maintenance in dependencies like `http`, `h2`, `h3`, and `httparse`.

A few of the new features we got this year include support for sending and receiving HTTP/1.1 Trailers, improved connection selection with `try_send_request`, and a server connection helper with `GracefulShutdown`.

Wrapping up the year, I [updated the roadmap](https://seanmonstar.com/blog/hyper-roadmap-2025/), highlighting our focus after stabilizing v1. One area that's already started to see improvements are the [hyper docs and guides](https://hyper.rs/guides).

## reqwest

A lot of cool work was done in [reqwest][].

[v0.12 was the big one](https://seanmonstar.com/blog/reqwest-v012/), upgrading to hyper v1.0, back in March. But it didn't end there, reqwest kept getting better and better throughout the year.

An improved timeout option was added, `read_timeout`, which better matches how many want to detect a broken connection, instead of an entire request deadline.

HTTP/3 support returned, unstable but better, with IPv6 and content-length fixes.

Integration with rustls gained support for the new aws-lc backend, and reqwest gained several cargo feature options to combine it with the various sources of certificate roots.

To go along with that, reqwest also gained support for certificate revocation lists. I'm glad to hear that building rustls with aws-lc is getting easier, I hope to make that the default in reqwest this year.

Near the end of the year, reqwest gained support to inject connector layers, which allow users to customize connection establishment much more than hard coded options.

That last one is actually a taste of what is coming to reqwest. I've often mentioned a desire for making reqwest work even more as a stack of middleware, and I have much more of a plan now. Details in another blog post soon!

## Security

Maintaining these libraries means keeping them secure. Over the past year, I dealt with various security reports, which are always quite **expensive**. They require dropping what I am doing, digging in with research, and testing to fully understand the report quickly. Some were determined not an issue, others were bugs that we fixed but not worth yelling about.

One of the more consuming reports was [HTTP/2 Continuation Flood](https://seanmonstar.com/blog/hyper-http2-continuation-flood/). It wasn't limited to hyper, instead affecting many implementations. hyper was somewhat affected, and we coordinated and got updates out on the coordinated disclosure date. Thanks to the [sponsors][] I was able to do this work.

## Podcast

I got to [join](https://seanmonstar.com/talks) Allen Wyma on the [Rustacean Station](https://seanmonstar.com/blog/podcast-rustacean-station-2/) again, and we talked about hyper reaching v1, access to advising from a maintainer, middleware, retry storms, and more.

## bye curl

Back in 2020, we added support for hyper to be an HTTP backed in curl. It languished at "nearly complete", and in November I put out a [call for a champion](https://seanmonstar.com/blog/hyper-in-curl-needs-a-champion/) to keep it alive.

It seems we as an industry didn't _really_ want it, so it has now been [removed as an option in curl](https://daniel.haxx.se/blog/2024/12/21/dropping-hyper/).

But that's ok. Both projects were improved by the process. I appreciated being able to work with Daniel; he is an excellent maintainer that truly cares about quality.

My focus is more on the audience that wants to write software _in Rust_. More and more services and tools are popping up everyday that must be fast and secure as they talk to other computers. Teams pick Rust and hyper and its ecosystem to deliver their experiences. I'll continue to empower them.

## Questions to ponder in 2025

I wanted to share a few questions that I'm pondering as I head into 2025. It feels better than pretending to know more definite plans.

- How can I encourage more collaborators? It's normal for some to change focus, so we always need more.
- What would a generic configuration builder look like? I imagine a zero-cost, injectable HList of properties to configure possibly unknown stacks of things. But how?
- Can `std::error` ever be good? `E: Error`, `Box<dyn Error>`, and `anyhow` have too many sharp edges exposed.

[^1]: See some previous yearly reviews: [2023](https://seanmonstar.com/blog/2023-in-review), [2022](https://seanmonstar.com/blog/hyper-ish-2022-in-review), [2021](https://seanmonstar.com/blog/hyper-ish-2021-in-review).

[sponsors]: https://seanmonstar.com/sponsor
[hyper]: https://hyper.rs
[reqwest]: https://github.com/seanmonstar/reqwest

---

## File: _posts/2025-03-04-modular-reqwest.md

---
layout: post
title: 'A More Modular reqwest'
date: '2025-03-04T13:05:00'
tags:
- rust
- reqwest
- tower
- http
- open-source
- programming
---
reqwest came out [8 years ago](https://seanmonstar.com/blog/introducing-reqwest/). It was meant to be a higher-level HTTP client, with batteries and opinions included. And it continues to fulfill that role very well.

To do so, reqwest combined or implemented a lot of features that weren't easily accessible elsewhere in Rust. Things like redirect handling, connection proxies, and compression.

People love it. It's the most popular HTTP client used in Rust code. As of today, it gets downloaded 10 million times per month from crates.io (which doesn't include any internal mirrors). It helps engineers all around the world.

People also wish they could better customize it. They want to add in custom logic somewhere. This makes sense. And the ecosystem has gotten [even better at reuse][tower-http]. It's time for reqwest to help be more reusable.

First, what is the goal?

## Easy and modular

Top priority is that reqwest remain **easy** to use. It should be the best default for most people. If you don't know what customizations you want, you shouldn't have to care.

It should also be _possible_ to customize. To tinker. To grab just a single piece. To re-order the pieces. To add in completely new pieces.

## Some concrete work

So, how do we get there? Well, here's a start.

The connection pool can be changed from a single Pool type into a series of `Service`s that allow better composition, such as a racing cache pool, singleton pool for HTTP/2, an `Either` pool to combine them. This allows people to use less complicated pools than one that includes connection racing. It makes way for using tower's load balancing services directly within reqwest, even.

The HTTP Proxy internals can be refactored to be another `Service` which fits into the series of "connector" services reqwest uses. These include loading proxy data from environment variables, and providing HTTP/HTTPS/SOCKS proxies and tunneling. Other applications that only use reqwest for proxying can depend on only those utilities.

reqwest supports some basic redirect policies, and allows for custom ones. Eventually, `tower-http` added middleware to do that too. We can now use redirects from tower-http. It'd be better to update reqwest to depend on that middleware internally, allowing reqwest's test suite to find any pieces lacking in the port.

We can add _easy_ request retries. reqwest doesn't really have retries, other than a very specific case: special HTTP/2 error cases. And conceptually, retries aren't that different from redirects. Retrying requests is pretty common thing to ask for, and it's pretty easy to do them wrong. There's middleware in `tower::retry`, but it's not easy. We could make it as easy as calling `.retries(reqwest::retry::idempotent())` on a client builder. Or a few other common policies.

We can use decompression from `tower-http`. reqwest has automatic response body decompression. Eventually, it was added as middleware in `tower-http`. Instead of having the feature essentially duplicated, we can just depend on the modular version, and the test suite will keep the quality up. Doing it this way improves the middleware for everyone. For instance, when one user swapped from reqwest's decompression to using tower-http, performance got worse. Eventually, a reused allocation was backported, bringing it back in line.

## Better default TLS

Initially, reqwest made use of `native-tls` for HTTPS support. Eventually, we added optional support for `rustls`. But we've kept `native-tls` as the default. The reason was because it worked for more users, and more sites. However, I think it's time to change the defaults.

At this point, reqwest's defaults actually target the worst common denominator. It not longer feels right to make people opt-in to the better choice. As I said at the beginning, reqwest bundles opinions too.

Our opinion is that reqwest should have the _best_ defaults for the most people. Those that need something different can opt-in to that.[^defaults]

So, reqwest will be changing it's `default-tls` feature to rely on `rustls`. Likely with `aws-lc-rs` as the crypto backend. Optional support for `native-tls` will remain, for now.

The `default-tls` feature theoretically was designed to allow for such a change, since nothing should be exposed with it that isn't supported by `rustls`. But they do have different build requirements, so it won't be 100% smooth.

But it will be better for most people.

## Getting to work

That's the work. Keeping reqwest easy. Allowing more customization. Even letting people use fewer parts of it. While having strong opinions. Making it better for most people.

**Want to be part of it?** Help contribute code or documentation. Here's [the issue plan](https://github.com/users/seanmonstar/projects/3).

You can also [sponsor][] the work. Roadmaps and priorities like these come about from conversations with companies that keep retainers.

All of it helps! To making HTTP requests better!

[^defaults]: This could also be applied to other features too. I think there's an argument to be made for switching the default DNS resolver to use hickory-dns instead `getaddrinfo`.

[tower-http]: https://tokio.rs/blog/2021-05-announcing-tower-http
[sponsor]: https://seanmonstar.com/sponsor

---

## File: _posts/2025-04-22-body-poll-progress.md

---
layout: post
title: 'Body::poll_progress'
date: '2025-04-22T10:01:00'
tags:
- rust
- http
- hyper
- open-source
- programming
---
This describes a proposal for a cancelation problem with hyper's request and response bodies. [hyper][] is an HTTP library for the Rust language.

## Background: what is the `Body` trait?

The `Body` trait used by [hyper][] is meant to represent a potentially streaming (asynchronous) body of a request or response. It sorta looks like `Stream` or `AsyncIterator`.

The biggest reason for a different trait was because we needed a stable trait for [hyper v1][], and `Stream`/`AsyncIterator` were not going to be (and still aren't) stable. With it being a separate trait, though, we also added some HTTP-body-specific methods to it.

Its similarity to `Stream`/`AsyncIterator` means we run into a problem with forwarding into a sink. But that we own the trait also lends to a decent solution, which this post outlines.

First though, piping woes.

## Problem: backpressured cancelation
 
Piping stream-like things into sink-like destinations feels natural, and looks quite simple. Elegant even. They can be piped together, and backpressure occurs naturally. However, they lack a mechanism to completely propagate cancelation. More specifically, cancelation while backpressure is currently applied.

Consider an example:

```rust
while let Some(frame) = body.frame().await? {
    // what if body (^) cancels while we wait here?
    dst.send(frame).await?;
}
```

This simple loop is piping a `Body` into some sort of sink. The way most streams and channels work, this mostly propagates backpressure. As long as the `dst` is not able to send a frame, we don't poll for another one, and whatever is the source of the body will back up.

However, it has a flaw. Those familiar with writing proxies may notice it immediately. The destination might not have space, and so we'll wait for it to get more. But the body could give up during that time. Since the task is only waiting on when the `dst` is ready, it could wait a significant amount of time and never notice that the body (source) has canceled.

### Why not just timeouts?

One initial question was "why not just timeouts". Like, why not just add `body_write_timeout()` or something to hyper's connection builders. Fair. That would work in some cases, for sure.

The thing is, sometimes timeouts are inappropriate.

For example, a transparent proxy may not want to force timeouts where they didn't exist before. They're willing to wait nearly forever. They just want to cancel the forwarding if the sender gives up.

Additionally, a chain of potential timeouts means that cancelation propagation can be delayed longer and longer, as each hop in the chain has to wait its own timeout.

### More generally, yet not

This issue can also exist for `Stream`/`AsyncIterator`. A [`poll_progress` idea was outlined by withoutboats](https://without.boats/blog/poll-progress/), though it was solving a different problem.

I do think there's some crossover that may affect each other. But it's also worth considering separately.

I'm not talking about a concept that some `for await` syntax could magically care for. I don't want that. Like at all. In the above example, it'd be impossible for a compiler to determine which action I want to take. Maybe the source ended cleanly. I don't want that to cancel sending the last item.

Also, and this is a biggie: `Body` will need to solve this problem quicker.

## Solution: `Body::poll_progress()`

We [propose][pr] to add a method to the `Body` trait:

```rust
pub trait Body {
    // existing methods ...
    
    fn poll_progress(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Result<(), Self::Error> {
        Ok(())
    }
}
```

The purpose of the method is allow for it to make any "progress" that might result in cancelation, while not producing another frame. The details:

- It's a `poll_*` function, so it allows a body to poll something else async, like a timeout, or perhaps some shutdown channel.
- Returning `Ready(Ok(()))` immediately is fine, it simply means there's _nothing_ that the body would do before another frame could be made available.
- However, returning an `Err` would indicate that the body is canceled, and a piping task can interpret that to shutdown the forwarding operation.

We could provide some utilities to aid use of this function, such as `http_body_util::BodyExt::progress()`.

Consider an example, something that could be even be used in `hyper` internals, but could also occur elsewhere:

```rust
loop {
    // produce a frame
    let frame = select! {
        Some(frame) = body.frame() => frame,
        dst.hup() => {
            // unexpected EOF
            return;
        }
    };

    // send it
    select! {
        dst.write(frame) => {
            // continue
        },
        Err(e) = body.progress() => {
            dst.abort();
            return;
        }
    }
}
```

### Alternatives: not `poll_closed`

An alternative we considered was making this method be a `poll_closed`. It had the welcome effect of meaning we could await `body.closed()`, and that is fairly self-documenting. However, it ran into several problems.

Being an addition to an existing trait, it needs a default implementation. But a default for `poll_closed` would likely end up being confusing. If it returns closed by default, then existing `impl Body`s will suddenly start aborting early. If it returns not-closed, then any naive task that might await `body.closed()` would hang forever.

The return value also felt confusing however we put it. Does `closed` return a `Result`? Both `Ok` and `Err` would still mean the body had closed.

## Request for Comments

I wrote this up because it felt like a big enough change to a fundamental mechanism in the ecosystem that it'd could benefit from more eyes and comments. It kinda-sorta looks like `AsyncIterator::poll_progress`, but it's also not. Still, are there things we should prepare for? Would wg-async have thoughts? Others who are using hyper deeply?

Could it be simpler? Is it flexible enough?[^redesign]

Comments on the [pull request are most welcome][pr]![^thanks]

[^thanks]: Thanks to Steven Fackler and Oliver Gould for helping iterate on this design.

[^redesign]: Calls for completely changing hyper's design to not need such a function aren't helpful. hyper is stable at v1.

[hyper]: https://hyper.rs
[hyper v1]: https://seanmonstar.com/blog/hyper-v1/
[pr]: https://github.com/hyperium/http-body/pull/90

---

## File: _posts/2025-07-15-reqwest-retries.md

---
layout: post
title: 'reqwest retries'
date: '2025-07-15T10:39:00'
tags:
- rust
- http
- reqwest
- tower
- open-source
- programming
---
One part of working on a more [modular `reqwest`][modular] was adding support for retries.

Intermittent failures are a fact of life, and a simple retry could have made things so much better. It's a somewhat frequent feature request for `reqwest`. It's also a very common pattern to implement manually, and far too easy to do incorrectly. Since `reqwest`'s internals are shifting more and more to a stack of services, it felt like an ideal time to explore this.

While skeleton pieces do exist in `tower::retry`, they require Expert Mode. Doing things right is tricky. We can do better.

## Policy composition

A retry policy is several things at once. But each of those things often is only one of a few choices. So what if we made it easier to compose your choices? That is, we can provide the common choices, and a builder to combine them.

### Budgets by default

Retry counts alone are insufficient, but absurdly common. Please don't do this. We can educate and document and warn and wave our hands, but we can only plead so much.

Budgets will be default on. Sure, there's an escape hatch if you absolutely must. But this way we can help you fall into the pit of success.

And to help users better understand what the budget results in, configuration looks like `.max_extra_load(0.3)`, instead of implementation parameters of the windowed bucket.

### Scoped retries

Budgets are basically a must. But budgets also don't make sense across different targets. Just because requests to `frobnica.te` start failing doesn't mean retries should also be disabled to `storali.ze`. This dichotomy perturbed me quite a bit, actually, and so I put off trying to solve the whole thing for a few months. But after letting my mind rest, looking at the exact same problem revealed an obvious solution: scopes.[^scopes]

I believe the most likely use of scopes is based on hostname. So that's the easiest constructor to start a builder: `retry::for_host(host)`. But it's actually a sealed trait, to allow continued exploration. Maybe a closure is needed by some people? We'll find out!

### Cloning requests

In many languages, this isn't even a consideration. You can just share a pointer, and _wave hands_ mostly reuse it.

In Rust, with ownership, we need to keep a clone of the request for a potential retry.

At the `hyper` level, we don't know enough about the request body to automatically clone it. At `reqwest`'s level, we _do_ know enough: we can absolutely clone when it's a simple non-streaming body. (Even possibly more, discussed below.)


### Classifiers

You might have a very custom combination of routes and responses. Or an API where every idempotent request has standard status codes. Or you might need a deeper understanding of specific connection or protocol errors.

So to start, there's a simpler `classify_fn` option, where you provide a closure to determine whether to retry or not.

```rust
.classify_fn(|req_rep| {
    match (req_rep.method(), req_rep.status()) {
        (&GET, Some(SERVICE_UNAVAILABLE)) => req_rep.retryable(),
        // or check req_rep.error()?
        _ => req_rep.success(),
    }
})
```

Another possible avenue to explore is the composition of classifiers. For example, what if you combined something like `protocol_nacks.or(idempotent.and(service_unavailable))`? Is this a good idea? Would people want this? If you want to _use_ something like that, file an issue or PR.

### Probable enhancements

Besides the above, there's a few other things we could add to `reqwest::retry`:

- **Backoffs:** They're pretty easy to add, though the benefit they bring is only really noticeable in specific situations. This is why they aren't included yet or would not even be enabled by default.
- **Replayable Body:** Retrying needs to clone the request, and a streaming body is not freely able to be cloned and restarted. But it's desirable by users, so we could make it an easy configurable option, such as `.max_replay_body_bytes()`. We could likely learn a bit from [how Linkerd implemented it](https://linkerd.io/2021/10/26/how-linkerd-retries-http-requests-with-bodies/).
- **Per-Request Retries:** More and more, users ask for configuration for a specific request that differs from the `Client`. We've been working on [general per-request config system](https://github.com/seanmonstar/reqwest/issues/2641).

## Exploring and upstreaming

We're exploring these ideas in reqwest, with the goal of upstreaming the more generic ideas to `tower` or `tower-http`.

Maybe that's a builder:

```rust
tower::retry::builder()
    .clone_reqs(|req| Some(req.clone()))
    .matcher(|req, res| res.status() == RETRY_AFTER)
    .max_extra_load(0.3)
    .build();
```

Or maybe something closer to middleware, a trait to compose pieces, with `and()` or `.or()`:

```rust
tower_http::retry::clone_replayable(8192)
    .and(idempotent)
    .and(server_error)
    .or(protocol_nack)
    .and(budget(0.3))
```

Maybe a combination! Who knows?

## Check it out

There's a [pull request][pr] implementing some of these ideas, and your feedback and usage will help us to keep refining it.

The two-pronged goal is to allow you to easily get retries in reqwest, and to also be able to get that easier configuration in _any_ tower stack.

[Give a whirl!][pr]

[^scopes]: Scoping budgets wouldn't be something to care about if the client were already built for a specific endpoint. That's a common way to build a stack of tower layers. But reqwest is open-ended, you can send requests to anywhere with an address. So, scopes felt required.

[modular]: https://seanmonstar.com/blog/modular-reqwest/
[pr]: https://github.com/seanmonstar/reqwest/pull/2763

---

## File: _posts/2025-08-06-warp-v04.md

---
layout: post
title: 'warp v0.4'
date: '2025-08-06T11:05:00'
tags:
- rust
- http
- warp
- open-source
- programming
---
Yesterday, warp [v0.4][] was released. [warp][] is a Rust web server framework, with a focus on functional programming and type system routing.

Upgrading is likely pretty simple, the main API stayed very similar. The biggest deal is that it should be easier for you to stay up-to-date on dependencies. You could stop there. But if you want to know what else happened, off we go!

## Filters remain the focus

The biggest _raison d'être_ of warp is its `Filter` system. It was why I made a [different web framework originally][warp-v0.1], and it remains _the reason_ to consider warp even now.

Should _you_ use warp? That depends. If you just want a _standard_, super fast, featureful Rust server framework, one that looks like ways you've coded servers before, you probably want [Axum][]. But, if you like functional programming, and (ab)using the type system, I think warp is pretty cool.

Consider an example:

```rust
let update = warp::path!("todos" / u32)
    .and(warp::header("accept"))
    .and(warp::body::json())
    .map(|id, todo: Todo| {
       // ... 
    });
```

Every filter extracts something from the request (even if that's just `()`). They can all be `.and()`ed together in any order, it will result in natural, typed arguments you can `map`.

You can build up layers of filters by just putting another `.and()` on anything. You can make a group of filters with `.or()`.

Once you have combined all into a master filter, you can convert them into a [tower][] `Service`, which you can then add any other middleware from other libraries, and serve with an HTTP implementation, such as [hyper][].

## Upgraded to hyper v1

The underlying HTTP dependencies, those which are public, have been upgraded to [hyper v1][].

This should improve interoperability if used with other libraries such as [reqwest][] or [tower-http][]. Their latest versions depend on v1 of `hyper` and `http`. So adding in more middleware, or using a higher-level HTTP client should mean less dependencies compiled, and no conversion required between types.

It also means warp users will be able to stay on maintained versions of hyper and its dependencies.[^v014]

## Crate features on a diet

In previous versions, a few heavy features were enabled by default. Now, the default features are much slimmer.

Keeping with filters being the focus, the default features only include the `Filter` system, and a way to convert them into an `impl Service`. You can take that service and use it with your own build of hyper, with HTTP/1 or 2 or whatever enabled, and warp won't care.

If you want the simple server runner, just enable the `server` feature, and then `warp::serve(filters)` is back, along with all the hyper implementation to run it.

Likewise, the `warp::test` helpers have been put behind a `test` feature. You can enable it in your `dev-dependencies` for testing, and while keeping that code out when building for release.

The `tls` feature was dropped completely. It existed previously as a simple way to add TLS to your server, but it's not strictly required in a server framework, and it adds a bit of maintenance churn to stay up-to-date and safe. Anyone wanting TLS with their warp server can make an accept loop using the TLS implementation of their choice, and use warp's filters as a `Service`.

Finally, the `multipart` and `websocket` features were removed from `default`, but are still available to enable. This was a planned change once they became features in the first place, since they enable a lot of code that you might not need.

## Iterating on the Server builder

The `Server` API was, uh, iterated on.

Before, it had a whole bunch of `bind_*`, `run_*`, and `serve_*` methods that slowly grew as people wanted more options to configure the server. Now, most all of them are gone.

Part of the reason is because it's not the focus of warp. The `Filter` system is. I figured the `Server` is meant to be a simple way to get your filters serving requests. If you wanted more customization, make your own.

But there's another reason, too.

I've been noticing [more][retry-ts] and [more places][pool-ts] where I wish the API of some crate was at the same time simpler, and also more powerful, putting options into the type system. The warp `Server` was an excellent place to iterate on this.

It is now an unnameable builder making use of expandable type state.

It encodes as generics into the `Server<F, A, R, Etc...>` various parts of how the server works. The filter, the acceptor, the runner loop. Depending on what methods you call, new ones get unlocked. For instance, `bind()` will make the acceptor a `TcpListener`, but once one is set, it doesn't make sense to be able to call it again.

The type is rendered in the docs, but otherwise not publicly exported, so you can't _name_ it. There's a benefit to this, as the API designer and maintainer. I can add more options, needing more generics, without it being a breaking change. As long as add a default that keeps it all compiling, there are now instances of `Server<F, A, R>` that need to be updated to `Server<F, A, R, E>`.

And the reality is that the name of the type is not generally interesting to you as a user. You just need a fluid way to add options, and once it's all combined away, you just `await` a future.

I'm hopeful this pattern carries over well to other builders as well.

[^v014]: I've backported important bug fixes to hyper v0.14 (and dependencies like h2), but I think that's about done. It's been almost 2 years, time to focus on v1. (If you need help, reach out to me!)

[hyper v1]: https://seanmonstar.com/blog/hyper-v1
[reqwest]: https://crates.io/crates/reqwest
[tower-http]: https://crates.io/crates/tower-http
[warp]: https://crates.io/crates/warp
[v0.4]: https://github.com/seanmonstar/warp/releases/tag/v0.4.0
[Axum]: https://crates.io/crates/axum
[tower]: https://crates.io/crates/tower
[hyper]: https://hyper.rs
[retry-ts]: https://github.com/seanmonstar/reqwest/pull/2763
[pool-ts]: https://github.com/hyperium/hyper/issues/3849
[warp-v0.1]: https://seanmonstar.com/blog/warp/

---

## File: _posts/2025-08-13-hyper-http2-didnt-madeyoureset.md

---
layout: post
title: "hyper HTTP/2 (Didn't) MadeYouReset"
date: '2025-08-13T08:25:00'
tags:
- rust
- hyper
- http
- security
---
A new HTTP/2 attack vector was disclosed today called MadeYouReset. [hyper][]'s `h2` is negligably affected, weathering the attack well. But, we have provided patches just in case. We published patches weeks ago, so if you've been keeping up-to-date, you're fine! If not, you're most likely fine, but you can upgrade now. No CVE or security advisory is included with this.

This sort of work is supported **exclusively** through [retainers][retainer], get in contact to support.

Follow along for the background information, if you're curious!

## What is the attack

The attack is quite similar to the previous [Rapid Reset][] attack from a couple years ago. That is, it starts new requests up to the limit imposed by the server. And then instead of _sending_ explicit `RST_FRAMES`, it sends malformed frames that force the _server_ to reset the stream.

So far, the described behavior is normal HTTP/2 flow. The problem occurs in some implementations that don't respond well to quick cancelation.

As the attack describes, in some implementations it allows for more stream concurrency than might have been configured. See more in [VU#767506][VINCE].

## What hyper does

A couple years ago, we added a defense mechanism to `h2` that keeps count of how many times a frame from the remote causes a local reset, and once a configurable limit is reached, the connection is abruptly closed. This mechanism caught nearly all variants of the attack.

We had forgotten one code path dealing with `WINDOW_UPDATE` frames. But what happens when new streams are created and then a bad window frame is received?

In `h2`, the reset is sent to user code. Check the request body will notice the error. Additionally, `hyper`'s server code using `h2` is essentially waiting simultaneously on the user's service to reply, and for any reset to be received. Once the reset is received, the service future is canceled.[^react]

So, not much. When a simple hello world server example was tested against the attack, the only thing that happened was increased CPU usage. Which makes sense, it's receiving and canceling more streams.

**Stream concurrency is enforced**, since all futures are canceled immediately, and a signal is sent to anything listening for longer.

All of this before any additional patch. 

## What we did

We received a report[^ghsa] about the attack from security researchers[^researchers] on May 23, 2025. The attack includes many variants, so we set out trying to determine if hyper was vulnerable. We knew that hyper already added a defense mechanism for this exact sort of abuse. Only one of the variants did not get cut off, but saw increased CPU usage, so we dug in. It turns out the original feature forgot to check the limit when WINDOW_UPDATE frames were bad.

We determined that while the variants was not caught, it also did not break any guarantees. The increase in CPU usage was obvious, since it was necessarily handling more requests in general. Also important to our determination: the attack is _observable_ by user code, so any user code can react however they wish.

The researchers did a great job of explaining the concept behind the attack, providing a proof-of-concept script that we could test with, and conversed respectfully and thoughtfully as we went through the investigation.

Because the code of the aforementioned mechanism was already public, and the damage quite benign, we decided to release a patch weeks before the general embargo. It was just a refactor, converting it from logic-based to utilizing the type system more, so no other cases are "forgotten". That patch was released on June 30, 2025.

For similar reasons, we also determined there was no need for a CVE or security advisory.

The researchers came back a little afterwards showing that in some cases, servers using `h2` under this attack could be forced to crash. They even brough a new reproducible proof-of-concept. After analyzing it, we determined that the problem was not that of hyper/h2, but that of user code which might have unbounded queues and does not react to cancelation.

We decided to stick with our original determination.

## What you can do

After reading all that, what more can you do? Again, you're likely fine! But here's some good ideas, regardless:

- If you've been staying up-to-date, you're already done!
- If you have a server running hyper, it would be wise to make sure your server handlers really can cancel easily.
- You can run `cargo update -p h2` to upgrade to the latest versions (at least `0.4.11` and `0.3.27`).
- If you're running hyper v0.14 (so h2 v0.3.x), it's time to upgrade to v1. After nearly 2 years, patches likely won't be backported anymore.

There's one more thing you can consider: set up a [retainer][] to make sure security reports get taken care of. This was a considerable amount of important work. This was several months of higher-stress but important work which doesn't look like shipping a new feature.[^psirt]

Besides funding that important work, I'm also happy to provide pre-disclosure and hands-on guidance to those with a retainer.

[^react]: This difference from Rapid Reset is also important. In Rapid Reset, the resets were not observable by user code, so they could not react to the wasting of resources. With MadeYouReset, however, users can if they need to.
[^ghsa]: I just realized today that I cannot publish the GHSA as an informational, since it does not include a severity or CVE. GitHub, please?
[^researchers]: The original reporters were [Gal Bar Nahum][Gal], Anat Bremler-Barr, and Yaniv Harel of Tel Aviv University. I primarily interacted with Gal, which was a 5/5 experience, would repeat.
[^psirt]: On top of what has been outlined here, there's a lot of coordination work involved, dealing with [VINCE][] and other vendors.

[hyper]: https://hyper.rs
[Rapid Reset]: https://seanmonstar.com/blog/hyper-http2-rapid-reset-unaffected/
[retainer]: https://seanmonstar.com/sponsor
[VINCE]: https://www.kb.cert.org/vuls/id/767506
[Gal]: https://galbarnahum.com/made-you-reset

---

## File: _posts/2025-09-02-podcast-netstackfm.md

---
layout: post
title: "Podcast: Netstack.fm, story of Rust's networking with hyper"
date: '2025-09-02T09:24:00'
tags:
- rust
- hyper
- podcast
- open-source
---
Last week I was a [guest on the Netstack podcast][podcast]. We talked abit about how I got into Rust, how async Rust developed, and the story behind [hyper][] and its surrounding ecoystem.

We started (and ended) with my goal of better software:

> _On your about page, you say that “Rust is the least bad option.” Can you elaborate a bit on that?_
>
> Yeah, I love Rust. I think Rust solves a ton of problems, but I also don't want to be stuck when something better comes along, which it inevitably will. Then yeah, I'll move to that.
> To me, all these tools are the means to an end, which is to make better software.

The rest of the conversation was really fun to talk about:

- _7:54_: beginning of hyper, async Rust
- _13:20_: hyper as something bigger
- _15:36_: splitting off hyper-util
- _17:35_: the `http` and `headers` crates
- _22:51_: motivation behind [warp][]
- _29:00_: [reqwest][] as the opinionated layer
- _30:17_: open source [independence][]
- _31:31_: HTTP/3 in hyper and reqwest
- _39:40_: hyper in 5 years, contributors, ownership

[podcast]: https://netstack.fm/episodes/hyper-with-sean-mcarthur-ep-2-remastered
[hyper]: https://hyper.rs
[warp]: /blog/warp-v04
[reqwest]: /blog/modular-reqwest
[independence]: /blog/independent-open-source-maintainer

---

## File: _posts/2025-11-18-hyper-user-survey-2025.md

---
layout: post
title: "hyper User Survey 2025"
date: '2025-11-18T10:20:00'
tags:
- rust
- hyper
- survey
- open-source
---
I'm excited to announce the inaugural hyper user survey! (_Update: it ended._)

Part of being user-driven is [knowing what our users want][gov], what they're trying to do, and then we can figure out how best to help.

This survey should only take about 5 minutes, no questions are required, and responses are anonymous. The survey will be open for a month, until December 17th, and then we'll analyze the results and share with you all what we find.

Thanks for taking the time to help make [hyper][] better!

~~Take the hyper user survey for 2025.~~

[gov]: https://hyper.rs/contrib/governance/#making-decisions
[hyper]: https://hyper.rs

---

## File: _posts/2025-12-03-hyper-util-composable-pools.md

---
layout: post
title: "hyper-util Composable Pools"
excerpt: "Announcing connection pool layers allowing advanced composition in Rust."
date: '2025-12-03T08:48:00'
tags:
- rust
- hyper
- tower
- open-source
- programming
- bestof
---
I'm so excited to announce [hyper][]'s new composable pool layers![^excited]

As part of [making reqwest more modular](https://seanmonstar.com/blog/modular-reqwest/), we've designed a new connection pool, and made the pieces available in `hyper_util::client::pool`. But this is more than just a "hey, we have a Pool, it moved over there." We've literally pulled apart the pool, in a way I haven't found elsewhere.

Building a purpose‑specific pool is now straightforward. Add the features you want, even custom ones, and skip the bloat, no forks required.

Read on to see what exactly we solved, how, and what comes next. If you just want to use them, [here's the docs][docs]. Everyone else, let's dive in.

## We started with the users

We started with the users, looking back over past issues filed, common questions in chat, and private conversations explaining what they needed to do. Boiled down, that got us to these requirements:

- A full-featured pool, like the one in [`legacy`][], must be possible.
- Microservices shouldn't have to handle multiple protocols or hostnames.
- Some clients need custom keys for the pool.
- Others need to limit new connections made at a time.
- Or cap the total number of connections.
- Customize connection expiration based on idle time, max lifetime, or even [poisoning][].
- And importantly, allow custom logic not already thought of.
    
From past experience combining middleware, I had a strong feeling the pool requirements could be broken up into `tower` layers. But what would that even _look_ like? Would it be horrible to use?

To answer that, we took the requirements and considered the developer experience of using layers. It had to feel nice. Not just to write, but also to come back to and read.

I then sketched out several of these layers to make sure they could actually work. Once most of it was working, the [proposal][] was ready.


## The initial 4 working pools

No plan survives contact with the enemy. We originally proposed five pool types, but launch with just the following four: singleton, cache, negotiate, map.

The `singleton` pool wraps a connector[^mksvc] that should only produce a single active connection. It bundles all concurrent calls so only one connection is made. All calls to the singleton will return a clone of the inner service once established. This fits the HTTP/2 case well.

The `cache` pool maintains a list of cached services produced by a connector. Calling the cache returns either an existing service, or makes a new one. When dropped, the cached service is returned to the cache if possible. Importantly for performance, the cache supports connection racing, just like the legacy pool.

The `negotiate` pool allows for a service that can decide between two service types based on an intermediate return value. Unlike typical routing, it makes decisions based on the response (the connection) rather than the request. The main use case is supporting ALPN upgrades to HTTP/2, with a fallback to HTTP/1. And its design allows combining two different pooling strategies.

The `map` pool isn't a typical service like the other pools, but rather is a stand-alone type that maps requests to keys and connectors. As a kind of router, it cannot determine which inner service to check for backpressure until the request is made. The map implementation allows customization of extracting a key, and how to construct a connector for that key.

## Ineffably unstable

I knew this work would land in `hyper-util` first, because it's not stable yet. Being so freshly designed, changes are expected after some more real-world usage. Still, I wanted to shield earlier adopters from breaking changes. At the same time, valuing performance and flexibility, I wanted to push as much as reasonably possible into the type system.

When initially tinkering during the summer, I had one of _those_ thoughts. The kind that clangs like a giant lock snapping open: what about type-state builders and unnameable types? I took a side quest, and tackled the [warp v0.4 upgrade](https://seanmonstar.com/blog/warp-v04/), to test out this API design. That post explains it a bit more.

The various threads were all coming together.

With each pool concept a `tower` service, once composed, a user shouldn't care what it is beyond being some `impl Service`. I tested this out in `reqwest`, and yea, I don't need to name the types. While I did need _a_ type, I was able to store a `dyn Service`, and inference handled the rest.

## Real world usage: in reqwest

Once those main pieces seemed ready, I needed a real example to test drive them. Tool-makers that don't use their tools make bad tools, after all.

I started by replacing the `legacy` pool inside `reqwest`. Part of the larger diff in reqwest is handling all of reqwest's different pool configuration options.

But, putting the default case together is pretty self-explanatory:

```rust
// Note: some noise has been trimmed
let http1 = (
    pool::cache(exec),
    util::http1_request_target(),
    util::http1_set_host(),
    util::meta(MyMetaIdleAt::new),
    conn::http1(),
);

let http2 = (
    pool::singleton(),
    conn::http2(),
);

let pool_layers = tower::layer::layer_fn(move |svc| {
    pool::negotiate::builder()
        .fallback(http1.clone())
        .upgrade(http2.clone())
        .inspect(|conn| conn.is_negotiated_h2())
        .connect(svc)
        .build()
});

let pool_map = pool::map::builder::<http::Uri>()
    .keys(|dst| scheme_and_auth(dst))
    .values(move |_dst| {
        pool_layers.layer(connector.clone())
    })
    .build();
```

And it works! Making the full-featured pool was one of the requirements: check. But, the next part was even more important.

As I mentioned before, I punted one of the proposed types: `expire`. Expiration is a necessary concept to a pool. But try as I might to fit the various generic shapes, it just wasn't happening. Thankfully, this work had a hard deadline. And deadlines keep you user-driven: let them have _something_ now, it can always be better later.

To prove the general design allowed expiration, I implemented a specific version of it directly in reqwest.

```rust
tokio::spawn(async move {
    loop {
        tokio::time::sleep(idle_dur).await;
        let now = Instant::now();
        let Some(pool) = pool_map.upgrade() else { return };
        
        pool.lock().unwrap().retain(|_key, svc| {
            svc.fallback_mut().retain(|svc| {
                if svc.inner().inner().inner().is_closed() {
                    return false;
                }

                if let Some(idle_at) = svc.meta().idle_at {
                    return now > idle_at + idle_dur;
                }
                true
            });
            svc.upgrade_mut().retain(|svc| {
                !svc.is_closed()
            });
            !svc.fallback_mut().is_empty() || !svc.upgrade_mut().is_empty()
        });
    }
});
```
 
The ease of adding it helped solidify to me that this was definitely the right design. I was able to slot in a `meta` layer tracking idle time, and then use that to `retain` services. I placed that layer in right next to some of the other HTTP/1-specific layers. Easy!

## Being modular opens up customization

With the ability to build a stack for your pool, consider an example of how we can start to solve other requirements listed earlier.

```rust
let svc = ServiceBuilder::new()
    // cached connections are unaware of the limit
    .layer(pool::cache())
    // in-flight handshakes are limited
    .concurrency_limit(5)    
    .layer(conn::http1())
    .service(connect::tcp());
```

It also allows adding in layers we don't currently have, such as per-host connection semaphores, or a few layers up over all hosts. Adding new functionality isn't blocked on us, and no one has to "pay" for features they don't need.

I can't wait to see what else is done with the design!

## Pools ready

The `hyper_util::client::pool` module is now available in [v0.1.19][release]. Go check the [docs][], and try to build cool things. Please file issues if parts are missing, we'll keep iterating.

I've been working on this feature set for long time. It's something I started thinking about years ago, and after months of work this year, it feels awesome to finally be able to release it.

Thanks to my [sponsors][], retainers, and grants for making this all possible!


[^excited]: I mean, who isn't excited to announce anything? /s
[^mksvc]: All "connectors" are actually `MakeService`s, which are jsut a `Service` that produces a `Service`. It doesn't _have_ to create a connection, but it reads better when talking about pools.

[hyper]: https://hyper.rs
[proposal]: https://github.com/hyperium/hyper/issues/3948
[`legacy`]: https://docs.rs/hyper-util/0.1.x/hyper_util/client/legacy/struct.Client.html
[poisoning]: https://docs.rs/hyper-util/0.1.x/hyper_util/client/legacy/connect/struct.Connected.html#method.poison
[release]: https://github.com/hyperium/hyper-util/releases/tag/v0.1.19
[docs]: https://docs.rs/hyper-util/0.1.x/hyper_util/client/pool/
[sponsors]: https://seanmonstar.com/sponsor

---

## File: _posts/2025-12-30-reqwest-v013-rustls-default.md

---
layout: post
title: "reqwest v0.13 - rustls by default"
excerpt: "reqwest v0.13 brings rustls by default, feature cleanup, but otherwise easy to upgrade."
date: '2025-12-30T10:48:00'
tags:
- rust
- reqwest
- open-source
- programming
---
To end out the year, here comes a new major release of [reqwest][], the opinionated higher-level HTTP client for Rust.

We don't really need major breaking versions to keep providing value. Improvements keep coming all the time. But we did need one to make one particular big adjustment, and we've taken the opportunity to clean up other things too. At the same time, we strove make it disrupt as little as possible, especially if you stick to the defaults.

reqwest [v0.13.0][] is out now! Read on for why.

## rustls is now the default TLS backend

The biggest deal is that reqwest now sets its default TLS feature to use [rustls][], instead of native-tls.

Granted, native-tls has its place. It provides a unified library that uses the "native" TLS implementation on each target. SecureTransport on macOS, schannel on Windows, and OpenSSL on Linux (as the most likely already installed). It was the right choice several years, while rustls was young. But rustls is now [safer][] and [faster][] than most choices.[^windows-i686-gnu] Seems like an obvious [improvement][]. But would people want the better choice?

A recent hyper user survey found that 93% of respondants already use rustls. 30% said they also use native-tls at times, so we will continue to provide that option. And while a survey is already biased, it's also most certainly true that the vast majority of users just allow the default options, and it works for them. That will continue to be true for most everyone.

So, if you use the default options, things just got better for you.

## Certificate verification features are consolidated

Previously, reqwest had many crate features to enable various ways to load sources of root certificates. Too many. It's a bit of a mess.

We consolidate the options into just a few simple choices:

- Defaults to using the native platform verifier.
- If the target supports it, `tls_certs_merge()` can add additional certificates. If it doesn't, a builder error is returned.
- If you really need a specific certificate, use `tls_certs_only()`, which will always work, and doesn't include native verification.

These basic options should allow for any use case, while reducing complexity within reqwest. For instance, if an application really needs to use the webpki-roots, they can be configured with `tls_certs_only(your_roots)`.

## Soft-deprecation to improve option naming

While in there, most `ClientBuilder` methods were given better names. The previous methods have been soft-deprecated. That means that you can keep using the old names, without warnings, but they are documented as deprecated, and they will eventually be removed in a later breaking change.

But in most cases, the improved name is mostly to help with understanding. It doesn't help to trigger a bunch of additional warnings when you upgrade. Perhaps we'll add a `deprecations` crate feature for those who want to clean up.

The upside is that all the methods now start with `tls_`. They are grouped together in the docs, but it will also help exploration with autocomplete.

## Other crate feature adjustments

As this is a breaking change version, we did include one making the `RequestBuilder::query()` and `form()` methods optional features, disabled by default. With these as optional, it is now possible to build reqwest without serde.

We also made `native-tls` imply ALPN automatically. This will mean most people who don't think about it will now get HTTP/2 upgrades. The reason it was opt-in previously is because older native libraries might not have the symbols required. They are quite old at this point. If you still need the previous behavior, there is now `native-tls-no-alpn`.

## Thanks!

Thanks to all who contribute, use, [sponsor][], fix, complain, and help reqwest be what it is! Here's [v0.13.0][].


[^windows-i686-gnu]: This does drop `i686-pc-windows-gnu` support for the default features. The reality is that a _lot_ of things don't work for that target. Even Rust itself has it as a Tier 2 target. We do still support it with native-tls, though.

[reqwest]: https://crates.io/crates/reqwest
[rustls]: https://rustls.dev/
[safer]: https://docs.rs/rustls/latest/rustls/manual/_01_impl_vulnerabilities/index.html
[faster]: https://rustls.dev/perf/
[improvement]: https://github.com/seanmonstar/reqwest/issues/2025#issuecomment-2913873836
[sponsor]: https://seanmonstar.com/sponsor
[v0.13.0]: https://github.com/seanmonstar/reqwest/releases/tag/v0.13.0

---

## File: _posts/2026-01-27-2025-in-review.md

---
layout: post
title: '2025 in review'
date: '2026-01-27T11:32:00'
tags:
- yearly
- rust
- open-source
- hyper
- reqwest
---
Come along with me as I review the past year. Heh, I often start these kinds of posts right at the start of the year, but it takes a few weeks longer than I ever expect to think them through.[^past]

## Two years of being independent

After a second year of operating as an [independent open source maintainer][independent], it's starting to feel more normal.

In terms of personal execution, it felt pretty fantastic, actually. Thanks to high-touch conversations from my [retainers][], I knew what was needed; there was an underlying trend. And I was able to spec out a grant that made a project out of that trend. All while managing to do the necessary maintenance work that the ecosystem requires. Granted, it did occasionally feel like a conflict of priorities, but that's life.

Honestly, though, I wasn't so sure when trying to plan this all out initially.

## Maintaining hyper

Perhaps the biggest deal for [hyper](https://hyper.rs) this year was launching our first user survey. I've thought of doing it a few times over the years, but finally remembered in Q4 to launch it. Thanks to all who answered! I've looked through the results, and I think this will be extremely useful. Some stats real quick: 96% of respondents have upgraded to hyper v1.x, most commonly combine it with Tokio (99%) and rustls (92%).[^survey] A proper analysis coming soon!

[katelyn martin](https://hyper.rs/blog/2025/04/21/welcome-katelyn-martin/) joined us as a collaborator, and has continued to be a multiplier with kind reviews and maintenance glue. And general maintenance doesn't stop, including growing security reports (more below).[^maintenance]

Besides all that, I took on a larger project for the year. You see, after updating the roadmap at the end of the previous year, I started to focus on one of the four defined areas: improved `hyper-util`. This lined up with what many have been asking for.

I did that by modularizing parts out of reqwest.

## Modularizing reqwest

Most of my year was spent on [modularizing reqwest][modular]. Or, from another angle, giving back the building blocks that reqwest has accumulated over the years. A lot of functionality that people rely on in reqwest started life as internal glue, and this was the year I finally pulled many of those pieces out into places where the rest of the ecosystem could use them too. Between reqwest and hyper‑util, that work ended up producing quite a few releases: 14 for reqwest itself, and 8 for hyper‑util.

Ages ago, I added a bunch of features that you expect any client to have directly into reqwest. Later, as `tower-http` grew, it copied some of those same features. Meanwhile, reqwest was used in weirder and weirder places, so we hardened those features, and tossed in some tests to check for the weird. But `tower-http` never saw any of that.

This year, we completely tossed the redirect and decompression code from reqwest, depended on the `tower-http` pieces, and then allowed the test suite to find the difference. The `tower-http` layers got those fixes backported, and now everyone benefits.

We also created _new_ things, but still modular.

Easier [retries][] were added to reqwest, making use of the lower-level pieces in tower. I'm still interested in ways to improve the feature, so more people can use retries more safely.

reqwest has grown extensive support for connection proxies. But an increasingly common pattern was people using reqwest _only_ for the proxy support; they didn't need any other feature. So I extracted proxy [matchers][] and proxy [connectors][] (tunnel, socks) into hyper-util.

The largest piece was designing and implementing composable [pools][] for hyper-util. In many ways, this was my **highlight of the year**. It's a problem I've been thinking about since ... 2018? I'd done a lot of research throughout the years, and never found anything quite like it. Now, it's not quite "done", but it's a base that allows a lot of new layers and compositions to be explored.

To end the year, we released v0.13 with [rustls as default][reqwest-rustls]. It's a big improvement for _most_ people. But. I am not currently happy with how difficult it is to build the defaults on some other targets (Windows, Cranelift, cross-compiling). I want that fixed. Maybe that's improvements to upstream aws-lc-rs; it looks like it's already been improved to not need cmake. Or maybe we use a different default crypto provider on some targets.

## The value of deadlines

The work on composable pools was hard. The reason it had taken me years to finally try was that I wasn't sure about some of the design. After staring hard at it during the summer, I did solve some of the questions. But there was [one problem](https://seanmonstar.com/blog/hyper-util-composable-pools/#real-world-usage-in-reqwest) towards the end that consumed another month or so of staring. And this time, I couldn't stop staring.

With a hard deadline set, however, there was no possibility of waiting longer. Instead, I had to settle with shipping what I had, and accepting that it can always be better.

And that's also the beauty of deadlines: they keep you user-driven. As long as I'm staring hard at a problem, holding back shipping, users have _nothing_. But software doesn't need to be shipped all at once. It's a lesson I've learned before, and yet it pops up to, uh, _delight_ me over and over.

I feel like I go through waves: I hate setting a deadline, and many times feel disappointed at not shipping all the glory that was in my head. But I always appreciate that at least they got _something_.

## Security takes time

We take security seriously, and the amount of reports we receive is slowly increasing. This past year, we had a 8 in total, including our first AI slop report (yay!). 

The biggest one resulted in a large coordinated disclosure event. But [hyper was just fine](https://seanmonstar.com/blog/hyper-http2-didnt-madeyoureset/).

That didn't stop it from being stressful trying to handle reports while simultaneously sticking to feature deadlines.

It is a reminder, though, that this is often urgent and important work that must be handled, but that traditional pay-for-features doesn't support. Sponsorships and retainers make this sort of maintenance much more sustainable.

## Talks

On the 10th anniversary of Rust 1.0, I gave a talk for the [Rust for Lunch][lunch-rs] meetup. It was sort of 'lessons using Rust for 10 years', but also 'why you should consider Rust'.

And I did a podcast episode on [Netstack.FM][netstack], discussing the history of Rust's networking ecosystem.

## Pondering

Last year, I liked just sharing some questions I'm thinking about. It wasn't a promise to work on them actively, but I look at them from time to time to see if there's something that I can tackle soon.

Here's just a few things I'm thinking about at the start of 2026:

- How do I balance keeping up with LLM advances while keeping my mind and skills sharp?
- How far can one reasonably go with typestate builders, considering ergonomics and correctness?

I wonder.

[^past]: See some previous yearly reviews: [2024](https://seanmonstar.com/blog/2024-in-review), [2023](https://seanmonstar.com/blog/2023-in-review), [2022](https://seanmonstar.com/blog/hyper-ish-2022-in-review), [2021](https://seanmonstar.com/blog/hyper-ish-2021-in-review).
[^survey]: Though a significant amount also use other runtimes and TLS libraries. As mentioned, more coming soon.
[^maintenance]: There were three feature releases of `hyper` and two of `http`, bringing support for things like `on_informational` and constants for `EARLY_HINTS`. There was also five bug fix releases of `h2`, hardening the HTTP/2 story for Rust.

[independent]: https://seanmonstar.com/blog/independent-open-source-maintainer/
[retainers]: https://seanmonstar.com/sponsor
[modular]: https://seanmonstar.com/blog/modular-reqwest/
[retries]: https://seanmonstar.com/blog/reqwest-retries/
[matchers]: https://docs.rs/hyper-util/latest/hyper_util/client/proxy/matcher/index.html
[connectors]: https://docs.rs/hyper-util/latest/hyper_util/client/legacy/connect/proxy/index.html
[warp-v04]: https://seanmonstar.com/blog/warp-v04/
[pools]: https://seanmonstar.com/blog/hyper-util-composable-pools/
[reqwest-rustls]: https://seanmonstar.com/blog/reqwest-v013-rustls-default/
[netstack]: https://seanmonstar.com/blog/podcast-netstackfm/
[lunch-rs]: https://www.youtube.com/watch?v=1PpdNu0Weas

---

## File: _posts/2026-05-26-hyper-user-survey-2025-results.md

---
layout: post
title: "hyper User Survey 2025 Results"
excerpt: "Analyzing the results from the hyper User Survey 2025."
date: '2026-05-26T09:02:00'
tags:
- rust
- hyper
- survey
- open-source
---
[hyper][] is the widely-used HTTP library for Rust. We ran the first [user survey for hyper in November 2025][survey-2025]. Here's the results and some analysis.[^burnout]

## Why did we do a survey?

We ran a survey to make sure we focus on the right things. It's part of being user-driven, working backwards.

The amount of work required to get _some_ data has an outsized return on your investment. When you know nothing, just a little bit of work means you now know _something_. And knowing what users need is a requirement to making an actually useful tool.

I keep [high-touch, high-context relationships][retainers] with some users that greatly informs me on what is needed. And reported issues also provide a way to see what is wrong. But a survey provides a new lens for identifying what is needed.

Sure, surveys have their own biases to deal with, such as self-selection. And voting in a survey costs very little, so each individual answer has less weight. But it helps quantify things we supposedly know from just a few users. Does this problem only show up in weird circumstances, or do most people run into it? Are there things that many people want, but generally don't get a chance to tell me?

## The results

We had a total of 206 unique respondents. I've broken up the results by theme and question below.

### Current usage

Many of the questions were about current usage patterns. To get more context on answers, to see what works, and also to see what people _don't_ mention using.

**Versions**: Nearly every single respondent is using hyper v1.x, but about 13% also continue to use the end-of-life v0.14.x.

**Roles**: Over 80% said they use hyper in a server, and the same amount in a client. 30% said they use both modes together as a proxy.

**Runtimes**: Unsurprisingly, 99% use hyper with the Tokio runtime. But 10% said they _also_ at times use a different runtime. Most commonly that's with `smol`, but io-uring runtimes made up a couple percent points.[^byor]

**TLS**: hyper provides the HTTP, and asks users to bring the S. 93% said they use rustls. 30% make use of native-tls, 15% openssl specifically, and it trails off from there.

**On top of hyper**: regarding the rest of the local ecosystem, 86% use reqwest, and 79% use Axum. About half selected Tower. For future surveys, it'd be very helpful to know if people use Tower without Axum or reqwest, or perhaps mentioned it because they just know its a dependency of Axum. A few wrote-in Tonic, which in hindsight, duh of course.

**Number of engineers**: half of respondents said they (and possibly a colleague) are the only ones at their company using hyper. Another 22% said 4-10, 12% said 11-50, and 17% said 50 or more. It's likely some places focus on higher levels, but many other companies have a lot of engineers working with hyper!

**Years of usage**: Nearly half of respondents have been using hyper for 1-3 years. 12% for less than a year, 30% for 4-6 years. And 11% said they've been using hyper for forever. Me too, me too...

**Industries**: 111 responses, which I grouped and sorted from most common to least. Software, cloud infrastructure, security. Finance, healthcare. Robotics, automotive, space, EV charging. Embedded. Media, streaming, events. Databases. Education. Government. Telecom, radio, chat. Geospatial. AI. Browsers. Games. Rust compiler.

It's just so humbling to think this code is helping in so many different places.

### Future work

Another set of questions were related to work we _could_ do in the future. This helps inform prioritization, and things we may not have thought of.

**Feature requests**: One of the questions came preloaded with common feature requests, and asked the respondents to rank them. Here's the accumulated ranking:

1. Metrics/Tracing/Events API
2. HTTP/2 Performance
3. Better Middleware
4. Add HTTP/3 Support
5. Documentation and guides
6. io-uring support

**Write-in features**: the follow-up question was a blank text box to write in any feature requests not in the above list. I grouped the common answers and sorted: legacy-client successor, original header casing/ordering, buffer control, improved errors.

One write-in suggestion wasn't really about a new feature, but keeps popping back up in my mind: how to get releases that are more stable.[^stable-releases]

**The hard parts**: We also asked what was hard about hyper. Grouped and sorted answers: integrating TLS, upgrading to v1, middleware complexity, advanced body streaming, combining all pieces for production.

**Topic ideas**: we asked for suggestions for topics for future blog posts and talks. This certainly doesn't need to be only from me, so if you see something interesting, fill the need! But after grouping the topics, they are: hyper internals, best practices, testimonials and success stories, security, tower usage, retries.

### Contributing

We also asked about some general contribution questions, to look at the contributor health of the project.

The standout here was: **what would help you to contribute more?**

The top response, a little over half of all respondents, said an improved contributing guide. Just a few percent under that want an updated roadmap. 20% said more responsive triage and reviews. And 15% said they could use increased mentoring.

## The insights

Looking it all over, this was awesome. I definitely to take some specific things with me. Well, sure, there's goodies all throughout the above results. But, at a high level, here's some thoughts, especially after combining it with other conversations I've had.[^not-everthing]

Of the technical things, I suspect I'll be spelunking in `h2` first, eking out performance refactors. It can use some love. Metrics is requested all the time, and it looks like I can collaborate on a design and review, but I believe there's a couple other contributors interested in the implementation. I do keep thinking about ways to configure a buffer pool or something. I think the extended testing idea has some potential.[^stable-releases] And I'd _love_ to see HTTP/3 finally land in hyper proper this year, at least as an unstable feature. I want the other things too, but... time, y'know? Though, as mentioned in the next paragraph, it'd be a win to onboard _others_ to work on and _own_ those things.

Improving contribution health, sustainable personnel of hyper, is high on my list this year. I've started working on a collaborator guide. I'm considering some new collaborators that have already been doing good work. I want to try GitHub's rotating auto-assign reviewers, to improve review times and spread review load. And I welcome help linking up our existing [ROADMAP][] into some more concrete and mentored issues.

## Outro

There it is. The hyper user survey 2025 results. Thank you to everyone who responded!

Does any of this interest you? Want to run with one of the ideas? [Join us][contribute]!

[^burnout]: This took a bit longer to write up than I meant. I have to admit, I felt some strong burnout at the beginning of the year. Sometimes being a maintainer is lonely. New year contract negotiations don't help. But I'm feeling better now.
[^byor]: Did you know you can [bring your own runtime](https://hyper.rs/guides/1/init/runtime/)? Also, this is one reason I don't believe the FUD about a single runtime. Also also, `hyper::rt` works fine, I don't see any need for the types to be in libstd. That wouldn't unblock anything.
[^stable-releases]: I can write this up more later, but initially, I've learned the slow way about feature windows. On top of those, I'd love to talk to customers who would be interested in having their test suites try hyper `master` before a release. [Talk to me][retainers].
[^not-everything]: I want to be clear: this isn't everything I plan to this year. This isn't a roadmap update. I think at a high level, the roadmap is still accurate. There's also plenty of security work to do. This is just meant to analyze the results and where they intersect with other priorities.

[survey-2025]: https://seanmonstar.com/blog/hyper-user-survey-2025/
[hyper]: https://hyper.rs
[retainers]: https://seanmonstar.com/retainer
[ROADMAP]: https://hyper.rs/contrib/roadmap/
[contribute]: https://hyper.rs/contrib/contributing/

---

## File: _posts/2026-08-17-owning-microblog-email.md

---
layout: post
title: "Tending my little plot of the Internet"
date: '2026-08-17T12:14:00'
tags:
- seanmonstar.com
---
As many parts of the Internet continue to get worse, I figured it was time to improve my own little plot.

I mean, I'm always tinkering, making small tweaks regularly. Did you know I keep [/now](https://seanmonstar.com/now) up-to-date? But anyways, a couple changes here felt big enough to write about. 

## My microblog is mine

I've been outputting random microposts since... _checks archive_ 2009, apparently. They were "status updates" back then. With Twitter dying, I started doing that sort of thing on Mastodon, and then on BlueSky. Wherever the people want to be, I suppose.

At first they were just silly jokes. But eventually, besides announcements, they became ways to express raw (bad) ideas and get feedback. But something about that always bugged me: they were on someone else's property, and linking to them (let alone finding them again) felt bad.

So, [I own my microblog now][posse]. They have their own place on this domain. They get a dedicated [RSS feed](https://seanmonstar.com/micro/rss). And they are included in the [main feed](https://seanmonstar.com/rss) (currently prefixed as "Micro" so you know). They get syndicated to those other networks automatically as threads.

What makes them micro? I don't constrain myself to just 250 characters or anything. They're so far about 3 paragraphs. That's about the size, I aim for, I guess. It let's me publish thoughts without blocker energy telling me I need to polish it into an essay. It also allows me to output 1 or 2 a week. Or none.

And I can link to them and build on them. Mine!

## Subscribe via email

I have improved the [subscribe via email][buttondown] option of this site.

For a long time, "subscribe via email" was easy and nice, provided by Feedburner. When that service was shutdown, I looked for an alternative. Something that was both free and automatically just worked from an RSS feed.

I'm sorry about that. I picked something horrible, a service I don't want to provide any further attention. They inject gross click-baity ads inside the emails. I subscribe to myself, and after being repulsed at the last email, I had to fix it.

I couldn't find any other service that automatically works from RSS for free. I could pay for a service, but I don't need to send _that_ much email. And I'm doing this as a convenience, to let users read how they want, not as a business. It's not a _newsletter_.[^substack]

So I imported that list to Buttondown. I can copy-paste the markdown of blog posts manually. That's fine, I don't write so often to need it to be automated.

But since it is manual, I can do more. I can also include a list of "recent microblog posts", now that I own them.

Anyways, back to continual tinkerage.[^more]

[^substack]: And there's no way I could subject my readers to Substack or Medium or something. Those sites do not treat readers well. I automatically refuse to read any article on such a site. I assume that if you don't care about my reading experience, I don't care enough about your idea. Not sorry.

[^more]: Other things I want to improve: a combined blog and micro archive. A tags page. A better chronological story for About. A set of "values" pages.

[posse]: https://seanmonstar.com/micro/20260623-owning-my-microblog-with-posse/
[buttondown]: https://buttondown.com/seanmonstar

---

## File: _posts/hidden/2008-06-27-php-designer-2008.md

---
hidden: true
layout: post
title: PHP Designer 2008
date: '2008-06-27T18:39:00-04:00'
tumblr_url: https://seanmonstar.com/post/706986654/php-designer-2008
---
I recently heard about [PHP Designer](http://www.mpsoftware.dk/phpdesigner.php) from [Boagworld.com](http://boagworld.com). They gave a [nice review](http://boagworld.com/podcast/119/) in one of their podcasts that I’ve started listening to. They made it seem all fancy and cool, and I just had to find out if it was really all that **fancy and cool**.

### Pros

I must say, _it feels very nice using it_. I personally code in [Eclipse](http://www.eclipse.org/pdt/), and while very nice, it can be very slow to load, slow to close, slow to tab, slow to… **be slow**. PHP Designer is real smooth, it opens quickly, there’s no “Workspace closing…” crap when closing it. It’s library of functions for PHP, XHTML, CSS, and JavaScript is wonderful. And I’m pleased with its color coding too. As a [web developer](http://../contact), since my whole life is spent looking at code, I want to make it less painful on my eyes. Thankfully, it lets me customize just the way I want, whereas Eclipse was a little more restrictive.

### Cons

Sometimes, though, the _auto completion gives me blurps_ when I type exactly what I want and it thinks: “Hey here’s some extra things that function can do” but my mind is already moving on. Requires hitting ESC, unless there’s a way to _make it smarter_.

Something Eclipse has going for it, is that _it’s free_. **PHP Designer isn’t**. Free is a good thing. But I also understand paying for the _awesomeness_ that is PHP Designer.

One other feature I miss from Eclipse (and I haven’t found else where yet, if you, please save me), is the docking of windows however the heck I want. I can split the screen in half, and then split one half into halves, and such, so I can have a tab of my views, and a tab of my controllers. Or perhaps a tab of my HTML, one of my CSS, and one of my JavaScript down at the bottom just chilling. Sure, you can make them not fill the whole screen, like working in Photoshop, but there’s _something to be said about having things dock nicely in the screen_. The lines are all perfect.

**So far (day 2 of my evaluation), things are seeming pretty cool. I’ll just have to see if _beats down Eclipse enough_ to shell out 60 euros… which is like 100 bucks-ish.**

### Update

I never bothered buying a key for PHP Designer. I found the auto-complete to be somewhat stupid at times.

Though, I never tried the compiler, which would let me test my PHP and Javascript before opening my browser.

Regardless, I went with [UltraEdit](https://secure.avangate.com/order/product.php?PRODS=1435838&QTY=1&AFFILIATE=7841)&nbsp;and [Komodo](http://www.activestate.com/komodo_edit/).

---

## File: _posts/hidden/2008-10-16-our-most-critical-bug.md

---
hidden: true
layout: post
title: our most critical bug
date: '2008-10-16T19:06:00-04:00'
tumblr_url: https://seanmonstar.com/post/706974765/our-most-critical-bug
---
   

Our Most Critical Bug

---

## File: _posts/hidden/2008-11-19-parentnode-misbehavior-in-ie.md

---
hidden: true
layout: post
title: ParentNode Misbehavior in IE
date: '2008-11-19T15:51:00-05:00'
tumblr_url: https://seanmonstar.com/post/707125202/parentnode-misbehavior-in-ie
---
I wrote a simple script to pop-up a modal-like element when clicking on an “Add” button on the page. I wanted to insert the element into the DOM on first click, and on subsequent clicks, simply reset the form. A bug popped up in IE7 (surprise) that prevented me from checking if I had inserted the element already.

### What I tried to do

I performed the case check by simply checking the parentNode of the element, which obviously shouldn’t exist until it’s inserted into the DOM.

    if(!this.form.parentNode) $('Admin').insert(this.form); else this.form.reset();

As I expected, worked perfectly. _Until I popped open IE7_.

#### IE Ignores Specs

Apparently, IE7 assigns a parentNode to nodes upon creation, before it has been inserted into the DOM. Well that’s silly, because the specifications say nothing about setting the parentNode. In fact, they state the opposite:

> However, if a node has just been created and not yet added to the tree, or if it has been removed from the tree, this is `null` .

That’s fine. Doing some debugging, I find there is indeed a parentNode. And that parentNode has a nodeType of 9, or DOCUMENT\_NODE. So it makes a new, off-screen document to hold onto created Elements. Whatever.

#### Excusing IE

A simple modification to my if statement fixed everything, once I finally knew IE gives it a parentNode. The good part (_there’s good here?_ ), is that it assigns the new Element a parent that only the HTML node should have, a document. So here it is modified:

    if(!this.form.parentNode || this.form.parentNode.nodeType == 9) // 9 == DOCUMENT\_NODE, but IE is freaking retarded. I'm ganna kill Microsoft 100 times over. $('Admin').insert(this.form); else this.form.reset();

---

## File: _posts/hidden/2008-11-26-javascript-canvas-tutorial-make-breakout.md

---
hidden: true
layout: post
title: 'Javascript Canvas Tutorial: Make Breakout'
date: '2008-11-26T18:04:00-05:00'
tumblr_url: https://seanmonstar.com/post/707024833/javascript-canvas-tutorial-make-breakout
---
[Javascript Canvas Tutorial: Make Breakout](http://billmill.org/static/canvastutorial/index.html)  

The guys over at [Ajaxian](http://ajaxian.com/archives/canvas-step-by-step-tutorial) pointed out this neat little tutorial on using Javascript’s Canvas.

[](http://billmill.org/static/canvastutorial/index.html "Breakout Javascript Tutorial")

Bill Mill does a decent job of showing small portions of code at a time, explaining how he gets various forms of physics working in the canvas. Here’s a table of contents:

1. Introduction
2. Draw a Circle
3. Add Some Color
4. Action
5. Library
6. Bounce
7. Add a Paddle
8. The Keyboard
9. The Mouse
10. The Bricks
11. Finishing Touches

---

## File: _posts/hidden/2009-01-14-moobugger-gives-firebug-to-internet-explorer.md

---
hidden: true
layout: post
title: mooBugger Gives Firebug to Internet Explorer
date: '2009-01-14T18:54:00-05:00'
tumblr_url: https://seanmonstar.com/post/707129953/moobugger-gives-firebug-to-internet-explorer
---
[mooBugger Gives Firebug to Internet Explorer](http://www.clientcide.com/tools/browser-plugins/moobugger-the-mootools-javascript-console/)

---

## File: _posts/hidden/2009-01-19-it-s-all-your-fault.md

[Binary file]

---

## File: _posts/hidden/2009-02-12-job-title-web-magician.md

---
hidden: true
layout: post
title: no title
date: '2009-02-12T10:05:00-05:00'
tumblr_url: https://seanmonstar.com/post/706923862/job-title-web-magician
---
<object type="application/x-shockwave-flash" data="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1891074&amp;fullscreen=1" width="400" height="300">



</object>  

I vote that because of the amount of “magic” we achieve using Javascript and server-side programming, we should be called developers no more!

Instead, call me **Magician** from here out.

---

## File: _posts/hidden/2009-07-07-my-syntax-highlighting.md

---
hidden: true
layout: post
title: My Syntax Highlighting
date: '2009-07-07T11:00:00-04:00'
tumblr_url: https://seanmonstar.com/post/707172696/my-syntax-highlighting
---
One of the most obvious benefits to [code editors](http://www.ultraedit.com/) and [IDEs](http://mcarthurgfx.com/blog/article/php-designer-2008) is being able to customize all the pretty colors that we must stare at for hours on end. It’s our decoration. **It’s our wardrobe**. So let me show off my own code outfitting.

### Monstar Code

I’ve toyed around with various schemes, and have settled on my preferred colors. It might be influenced from the first time I used an editor in college ([Eclipse](http://www.eclipse.org/)), but it’s changed and grown some.

I recall some people at my former work quite liked the [inverted look](http://www.37signals.com/svn/posts/1773-how-to-mock-alternate-states-of-a-new-ui-template-using-helpers). You know, light colors on a black or dark grey background. I wanted to like it: it kinda seems cool. But ultimately it was a little too weird for me.

However, this is a shot of my color scheme in [Komodo](http://www.activestate.com/komodo/) (I try to duplicate the scheme in any editor I use).

<figure class="tmblr-full" data-orig-height="336" data-orig-width="500"></figure>

I’ll list the colors I use:

- **Keywords** - Blue. This would things like public, function, true, false, null, if, for, return, etc.
- **Variables** - Light blue.
- **Strings** - Green.
- **Operators** - Black. Arithmetic, assignment, parenthesis, the like.
- **Numbers** - Dark Brown.
- **Comments** - Grey. I prefer comments to be more hidden unless I specifically want to read them.
- **Identifiers** - Black. These are function calls, or accessing properties of objects.
- **Standard Library** - Red. Methods or constants defined in the standard library, I like them to stick out so I know when I’m using native functions (ex:print\_r, preg\_match, etc).

You’ll also see that I enjoy a slightly off-white background, to cut down on the extreme photon abuse of my eyes. Just feels less… painful.

### Other Editors

Komodo (seen above) doesn’t allow me to do my last list item, coloring standard library names. I certainly wish it did, and if you know how, please do tell. However, I also use UltraEdit as it opens faster and uses less memory, and it _does_allow me to set standard functions red. I believe Eclipse allowed me to do this (it’s been a while use I’ve used it), and my recent checking out of Aptana showed it was possible.

In fact, Aptana seemed to have the more power for customizing color schemes. Not only could you select colors for groups of syntax, like ‘keywords’, you could then drill into keywords and say specifically that for and while should be different colors.

### Besides Color

When given the option, I also enjoy when an editor allows me to modify the fonts of specific syntax. I like making comments italic, as it just seems to help make them… sleeker, more invisible, except when I need them. I don’t use it personally, but I could see benefit to maybe adding bold to identifiers, or keywords, to make sure you don’t miss out on any returns, for instance.

Of the many differences between coders, syntax highlighting is nearly a constant. However, coloring styles differ, as certain colors might have different psychological effects on the viewer.

---

## File: _posts/hidden/2009-11-12-my-mental-break-tool.md

---
hidden: true
layout: post
title: my mental break tool
date: '2009-11-12T12:26:00-05:00'
tumblr_url: https://seanmonstar.com/post/708836709/my-mental-break-tool
---
   

Sitting in front of a computer all day long can get boring. Sure, I love what I do. But after staring at text for a while, you have to break it up! And many developers have toys on their desk for just this reason. Mine’s a Rubik’s Cube.

I’ve had a [3x3x3 Rubik’s Cube](http://www.amazon.com/gp/product/B00081RYNC?tag=mcgf-20) sitting on my desk since I started professionally programming. Recently, I also snagged a 2x2x2 off eBay for barely $2, which gives me a faster solve (hence a shorter break), as well as a slightly different routine to my breaks. They serve as ways to make my wrists and fingers do something else besides sit on a keyboard. And they can be fun toys for the couple of visitors I’ve had.

I’m not much of a [speedcuber](http://en.wikipedia.org/wiki/Speedcubing), though I did try. I couldn’t get passed 50ish seconds for the 3x3x3 (fast solves are around [20 seconds](http://www.youtube.com/watch?v=Xrjkjz1l4qw&NR=1)). Now I _sluggishly_ solve it in a minute and half. This lets me solve it a couple times if I want, or simply solve it once real quick and then get back to coding.

---

## File: _posts/hidden/2009-11-17-no-one-is-going-to-steal-your-idea-in-fact-if.md

---
hidden: true
layout: post
title: No one is going to steal your idea. In fact, if your company is eventually
  successful, your original idea will only be one tiny contributing factor. And the
  guy you’re talking to can’t steal the 99,999 other reasons that will make your company
  a success (persistence, luck, people you hire, etc, etc, etc).
date: '2009-11-17T20:50:43-05:00'
tumblr_url: https://seanmonstar.com/post/247860647/no-one-is-going-to-steal-your-idea-in-fact-if
---
> No one is going to steal your idea. In fact, if your company is eventually successful, your original idea will only be one tiny contributing factor. And the guy you’re talking to can’t steal the 99,999 other reasons that will make your company a success (persistence, luck, people you hire, etc, etc, etc).

—[The FrieNDA](http://www.webx0.com/2006/08/frienda.html) (via [clientsfromhell](http://clientsfromhell.tumblr.com/))

---

## File: _posts/hidden/2009-11-17-why-must-lamp-setup-suck.md

---
hidden: true
layout: post
title: Why Must LAMP Setup Suck?
date: '2009-11-17T15:15:00-05:00'
tumblr_url: https://seanmonstar.com/post/708843270/why-must-lamp-setup-suck
---
LAMP is common lingo for web developers. It’s an incredibly popular software stack to run dynamic websites. Many hosting companies include the stack for you, already configured and ready to go. But before we get there? That wonderful point where we trust our code to the production server, and then watch something blow up beautifully in a fire-y mess of status codes, fatal errors, and SQLStates. We developers like to test thing before then.

So I’m left wondering, **why does setting up a testing environment suck so hard**? Downloading a virtual machine is easy enough, and then you must download your flavor \*nix. Boot it up, apt-get your flavor’s Apache, MySQL, and PHP. Getting Apache to work just the way you want, making sure you set up the right hosts, and run the correct modules.

While you’re at it, your apt-get listscould be wrong, or not contain all the files you want. And in the middle of one installation, you may find you hit your memory limit, that simply requires increasing to a supreme value.

There are competent, [1-button install programs](http://www.apachefriends.org/en/xampp-windows.html) that setup a [WAMP](http://en.wikipedia.org/wiki/WAMP) environment. No hassles. Of course, the only downside being that the environment differs slightly than your production environment.

I recognize anyone needing a Linux server mostly knows how to set one up. But at the same time, the people wanting Linux servers are programmers. Isn’t our job _obsession_ all about automating tasks that can be automated, and forever trying to make every task in that category? Certainly, it must be a common setup to have a Debian (or Ubuntu, or RedHat, etc) Virtual Machine using Apache, SQL, and PHP. Even desiring Python to be installed, with mod\_python or mod\_wsgi. Or how about coming with Ruby set up for you. These would all be excellent downloadable Virtual Machines that programmers would use regularly.

### Only One Solution So Far

I’ve seen one installer for a Linux virtual machine, though not in the flavor I regularly use: [SUSE Studio](http://susestudio.com/).

> Build an appliance - or your own custom Linux distro - with a few mouse clicks. Customize it to your heart’s content, and share it with the world.

The concept is brilliant. If you want a SUSE virtual machine, you just login, select the version, check some packages to include, such as Apache, MySQL, and the like. And then it builds it for you. Check back in a couple minutes, and you can download it to your machine. Or you can start it up right there in the web browser.

<figure class="tmblr-full" data-orig-height="500" data-orig-width="500"></figure>

If I were the technical director at a company, and we were going to be using a new development area for a new project, I could easily customize a box (with clicking, not with tedious command line memorization), and after it’s built, give it out to all the developers. That’d be huge! It certainly is a pain point to make sure all us developers have a virtual machine with the same settings.

### The Way Forward

SUSE Studio has the right idea, for all things that should be installed. Anything that requires a specific set of instructions that you’re requiring humans to do, every single time, should likely be programmed instead. Hopefully we’ll see other versions showing up, so the PHP developer wanting to check out Ruby, for example, can just download a virtual machine with it already set up, and get to the important stuff: **writing code and solve problems**.

---

## File: _posts/hidden/2009-12-04-269326132.md

---
hidden: true
layout: post
title: no title
date: '2009-12-04T14:32:26-05:00'
tumblr_url: https://seanmonstar.com/post/269326132
---

---

## File: _posts/hidden/2010-03-10-the-search-for-a-decent-windows-twitter-app.md

---
hidden: true
layout: post
title: The Search for a Decent Windows Twitter App
date: '2010-03-10T18:19:00-05:00'
tumblr_url: https://seanmonstar.com/post/709000980/the-search-for-a-decent-windows-twitter-app
---
I kinda like [Twitter](http://twitter.com/seanmonstar). It’s a fun place to leave [occasional comments](http://mcarthurgfx.com/blog/article/i-m-a-twitter-monstar). It’s also a great way to find links to interesting information I would normally miss from my feeds. But being a Windows user, I have yet to find **that** Twitter application that is a joy to use.

I’ve tried out a couple applications, and found each one lacking:

- [Tweetdeck](http://www.tweetdeck.com/) 
- [DestroyTwitter](https://destroytwitter.com/) 
- [Seesmic](http://seesmic.com/seesmic_desktop/windows/)

There might be a decent application out there that I haven’t found, but these are the most popular ones available to Windows. It almost feels like people only want to make cool stuff for Macs.

### Tweetdeck

Although it’s hugely popular by many, I can’t help but get annoyed at parts of Tweetdeck. To be fair, it’s the closest I have found that meets my needs, but that’s not good enough for me. It can easily handle auto-completing of replies, inserting photos and shortening links. It’s built with the idea of lists in mind, which I particularly like. I’ve currently got a list about MooTools and a list about games. Unfortunately, I have no option of telling the main list to ignore tweets from anyone in a separate list. I don’t want my main list filled with tweets about stuff I’ve already put into it’s own list. I just want a list of “everyone else”, but without having to create such a list and add every new person I follow to it.

<figure class="tmblr-full" data-orig-height="332" data-orig-width="500"></figure>

I also have gripes about it’s UI. Marking Tweets as “Read” requires _clicking individually on this tiny, 5px wide circle_. And then after doing that, I must click at the bottom of the list of a tiny icon to “Clear Read”. And I often accidentally click on “Clear All”, since they’re right next to each other, and they’re so small it takes to long to visually register what each icon is.

The notifications system is buggy. Sometimes it hides the summary behind a window, sometimes not. Clicking the notification will bring up Tweetdeck. But sometimes, the notification won’t dismiss itself. Ever. You can hide Tweetdeck again and have a frozen notification sitting in the corner of your screen. The only way to dismiss it is to click it again. The usual behavior is that it should dismiss regardless after a few seconds.

And it’s an AIR application. Now, granted, AIR is pretty cool. It lets front-end developers create apps for the desktop. But given a choice, why would I want to run something in a Flash player all the time? **It chews on my memory like a puppy that is teething**. It lacks plenty of things that I’m used to having in a Windows app. And it’s integration is buggy (see above about notifications). Next.

### DestroyTwitter

While it’s also an AIR app, which means I have similar complaints in that regard, it’s actually less buggy than Tweetdeck. Notifications don’t stick. I still miss my normal Windows feel though.

It has a much nicer way of handling Mark as Read: just check the option in settings to Mark as Read on rollover. And overall, the UI feels much nicer to use than Tweetdeck. You don’t have to hover over the avatar to find your common actions like replying or retweeting.

<figure class="tmblr-full" data-orig-height="458" data-orig-width="316"></figure>

However, it doesn’t support lists at all. None. Just a single stream of tweets. No thanks.

### Seesmic

A native Windows client, and it doesn’t have the Windows XP look either. It generally looks sweet, feels rather Windows-y. I like that it has useful context menus when I right click on things. It’s design is decent excellent. But **it’s severally lacking in features**. Severely.

<figure class="tmblr-full" data-orig-height="358" data-orig-width="500"></figure>

It can’t load images from common sources like yfrog, it just launches the browser. While it doesn’t have automatic URL shortening, it does have an Insert Link ability. But my attempts to use it show that it handles errors poorly:

    \ \<errorCode\>0\</errorCode\> \<errorMessage\>\</errorMessage\> \<results\> \<nodeKeyVal\> \<errorCode\>101\</errorCode\> \<errorMessage\>Unknown error\</errorMessage\> \<nodeKey\>\<![CDATA[http://google.com]]\>\</nodeKey\> \<statusCode\>ERROR\</statusCode\> \</nodeKeyVal\> \</results\> \<statusCode\>OK\</statusCode\> \

<small>Seesmic just dumped that straight into my message. And then it kindly warns me that I’m 282 characters over the limit.</small>

While it supports lists, it has the same issues as Tweetdeck in that regard. But, clearing the timelines can also be wonky. I’ve clear my MooTools list timeline, and then added a new person to the list, and it just went out and refilled the entire timeline. Er, thanks.

**And it’s bugtastic**. Maximizing the window hides away the normal minimize/close buttons. You have to just click in the area and hope you guessed correctly. Even with notifications turned on, I have yet to see a single notification. It regularly errors when trying to get more tweets, and leaves me without updates for long periods of time.

### web

Ultimately, at home, it’s just easier to use the web client. None of the clients I have found are good enough to do light browsing with. I do most of my reading at work, so when I bother to log on at home, I just want the latest part that I haven’t read yet. **None of the applications I’ve tried seemed to have syncing**. Loading one up at home would just dump the whole days worth of tweets into my timeline, and that’s useless to me.

Since the web application defaults to showing me the latest tweets, that’s usually all the ones I want to see anyways. Replying and retweeting are easy enough, although it would be great if it automatically shortened URLs for me.

### “That” Twitter App

The application I’m looking for is a native client to Windows, doesn’t look like it came from the year 2000 in terms of UI, and has many of the features you’d hope to have in a Twitter client: _URL shortening, image loading, notifications, and lists_. I’d love the option to remove all listed people from my main timeline, but whatever. **If it has those features, looks pretty (and is intuitive), and isn’t the buggiest piece of code in the world, I’d like to use it**. But it really seems like so many developers only like making things for Macs now. There’s got to be developers who still work on Windows… or maybe I should just break out the C#-fu.

---

## File: _posts/hidden/2010-06-01-now-to-convince-the-wife.md

---
hidden: true
layout: post
title: now to convince the wife
date: '2010-06-01T19:50:59-04:00'
tumblr_url: https://seanmonstar.com/post/654723816/now-to-convince-the-wife
---
   

Now to convince the wife…

---

## File: _posts/hidden/2010-06-11-creative-and-cheap-cord-holders.md

---
hidden: true
layout: post
title: creative and cheap cord holders
date: '2010-06-11T13:12:16-04:00'
tumblr_url: https://seanmonstar.com/post/687555182/creative-and-cheap-cord-holders
---
   

Creative and cheap cord holders.

---

## File: _posts/hidden/2010-06-15-samsung-galaxy-s-on-t-mobile.md

---
hidden: true
layout: post
title: Samsung Galaxy S on T-Mobile
date: '2010-06-15T20:07:00-04:00'
tumblr_url: https://seanmonstar.com/post/702602653/samsung-galaxy-s-on-t-mobile
---
[Samsung Galaxy S on T-Mobile](http://androidandme.com/2010/06/news/samsung-galaxy-s-tipped-for-july-21st-launch-on-t-mobile/)  



My contract is up super soon. I’m thinking of waiting the month to get this super slick looking phone. But I’m unsure.

This certainly looks like a good time for Android, with all the quality devices coming out. But it’s also a little scary, going out and buying a device only to find a better one released a couple weeks later.

Unfortunately, my carrier, T-Mobile, is certainly getting the shaft in terms of new, quality devices. I can only hope this Galaxy comes out in July for T-Mobile, and turns out to be as great as it’s hyped up to be.

---

## File: _posts/hidden/2010-06-18-setup-your-own-openid.md

---
hidden: true
layout: post
title: How to Set Up OpenID on Your Own Domain
date: '2010-06-18T18:41:00-04:00'
tumblr_url: https://seanmonstar.com/post/712865214/setup-your-own-openid
---
[How to Set Up OpenID on Your Own Domain](http://smarterware.org/6286/how-to-set-up-openid-on-your-own-domain)  

By simply adding a new `<link />` element, I can now enter “http://seanmonstar.com” as my OpenID.

---

## File: _posts/hidden/2010-06-22-cleaning-your-tumblr.md

---
hidden: true
layout: post
title: Cleaning Your Tumblr
date: '2010-06-22T13:53:55-04:00'
tumblr_url: https://seanmonstar.com/post/726009563/cleaning-your-tumblr
---
I originally setup my Tumblr unsure of what to use it for, so I just added a bunch of feeds to it, like my Twitter, my blog feed, my delicious links, and my github activity. But when I decided to actually use my Tumblr as a real blog, I decided I didn’t want all that junk in here.

For whatever reason, Tumblr doesn’t provide any sort of simple way to clean out a lot (_1000+_) of posts. The only way to delete posts it to scroll to the post in the dashboard, click the “delete” button, and wait for the `POST` to be submitted and the page reloaded, which forgets your current scroll position. I wasn’t going to do that 1000 times.

Thankfully, there’s a decent API that lets you easily receive all your posts. The posts have a field set if they had been imported through a feed. And with the dashboard using [Prototype](http://prototypejs.org), it was a matter of putting together 2 functions to read and delete posts, and then some minor babysitting to make sure to pause when Tumblr would throttle me.

    var keepGoing = true,
        tumblr = '',
        email = '',
        password = '',
        posts = 0;
    function findFeedItems(json) {
        json.posts.each(function(p) {
            if(p['feed-item']) {
                apiDelete(p['id'])
            }
        });
    
        if (keepGoing) {
            apiRead.delay(20);
        }
    }
    
    function apiRead() {
        console.log('reading...');
        var nonce = new Date();
        var s = document.createElement('script');
        s.src = "http://"+tumblr+".tumblr.com/api/read/json?num=50&callback=findFeedItems&start=" + posts + "&nonce=" + (+nonce);
    
        document.body.appendChild(s);
    }
    
    function apiDelete(id) {
        console.log('deleting: %s', id);
        new Ajax.Request('/api/delete', {
            method: 'post',
            parameters: 'email='+email+'&password='+password+'&post-id=' + id,
            onSuccess: function() {
                console.log("Successful deletion: %s", id);
            },
            onFailure: function(transport) {
                console.log('delete failed: ', transport.status);
            }
        });
    }

While on the [dashboard](http://www.tumblr.com/dashboard), copy and paste this into your console, with the proper variables filled in, of course.

Just called `apiRead()` to get it started. When you see a delete failure, you can pause your purge by setting `keepGoing` to false. Wait a few seconds, set it back to true, and call `apiRead()` again.

Once you’re no longer seeing successes or failures, but you know theres more posts, you can set the `posts` variable to 50, or 100, or higher. That will start the search farther down your posts.

**Again, this script will delete everything imported from a feed.** If you want to just delete _everything_, pull out the `if(p['feed-item'])` condition, and just pass all the posts to `apiDelete`.

---

## File: _posts/hidden/2010-06-22-lessjs-will-obsolete-css.md

---
hidden: true
layout: post
title: Less.js Will Obsolete CSS
date: '2010-06-22T15:30:00-04:00'
tumblr_url: https://seanmonstar.com/post/726287616/lessjs-will-obsolete-css
---
[Less.js Will Obsolete CSS](http://fadeyev.net/2010/06/19/lessjs-will-obsolete-css/)  

I’m starting to really like the idea of writing _less_ CSS. Especially with all the browser-prefixed properties. It’d be nice to just write one `border-radius` and have a processor expand it for me.

Less looks promising. Though I’m hesitant about having the processor execute on the client side. It does cache itself in `localStorage` if the browser supports it. But what about ones that don’t (all of IE)? IE doesn’t have a blazing fast JavaScript interpreter to begin with.

**Plus** : Every single visitor must spend CPU cycles processing the LessCSS. When the exact same output will be reached every time, I would rather just do it once server side and then serve up a static CSS file. Processed once, cached by _all_ browsers.

---

## File: _posts/hidden/2010-06-22-psueodcode-until-real-code-is-easier.md

---
hidden: true
layout: post
title: Keep writing and decomposing the psuedocode until it seems like a waste of
  time to write it instead of the actual code.
date: '2010-06-22T23:10:00-04:00'
tumblr_url: https://seanmonstar.com/post/727624549/psueodcode-until-real-code-is-easier
---
> Keep writing and decomposing the psuedocode until it seems like a waste of time to write it instead of the actual code.

—[Code Complete](http://www.amazon.com/gp/product/0735619670?tag=mcgf-20)

---

## File: _posts/hidden/2010-06-22-rambling-about-verizon.md

---
hidden: true
layout: post
title: Rambling about Verizon
date: '2010-06-22T16:48:48-04:00'
tumblr_url: https://seanmonstar.com/post/726518666/rambling-about-verizon
---
[Rambling about Verizon](http://www.marco.org/725288444)  

> Apple’s quickly losing ground to Android today for only one reason: the majority of mobile-phone owners in the U.S. (the majority of people in the U.S.) choose their network first and their phone second.

I absolutely agree. I would love to have an iPhone, but not at the expense of a crappy network. And since Android and iPhone are comparable (_at least to me_), that’s why I’ll be using an Android. It’s also why my wife got an Android. And my in-laws. They didn’t want to switch networks, so when they saw the Android in store, went with it (_and they enjoy it very much_).

> Every month without a Verizon iPhone costs Apple dearly in marketshare and mindshare. The longer they wait, the lower their chances to reclaim the difference.

---

## File: _posts/hidden/2010-06-23-apple-sues-htc-again-over-new-sense-ui-features.md

---
hidden: true
layout: post
title: Apple sues HTC again over new Sense UI features
date: '2010-06-23T14:56:00-04:00'
tumblr_url: https://seanmonstar.com/post/729412642/apple-sues-htc-again-over-new-sense-ui-features
---
[Apple sues HTC again over new Sense UI features](http://androidandme.com/2010/06/news/apple-sues-htc-again-over-new-sense-ui-features/)  

We remember Apple’s first lawsuit against HTC. HTC responded in kind by suing for Apple’s own infringements on HTC patents.

Apparently, Apple isn’t done with the patent game. Now, they must sue for an extremely vague patent:

> System for real-time adaptation to changes in display configuration

The way HTC infringed? By allowing users to see all of their homescreens zoomed out. Something non-existent on the iPhone.

If only these companies could be content with trying to win based on a quality product alone.

---

## File: _posts/hidden/2010-06-23-hardware-accelerated-canvas-in-ie9.md

---
hidden: true
layout: post
title: Hardware Accelerated Canvas on IE9
date: '2010-06-23T20:36:00-04:00'
tumblr_url: https://seanmonstar.com/post/729786325/hardware-accelerated-canvas-in-ie9
---
[Hardware Accelerated Canvas on IE9](http://blogs.msdn.com/b/ie/archive/2010/06/23/html5-native-third-ie9-platform-preview-available-for-developers.aspx)  

So IE is starting to look semi-competent. And yet, it’s still slower than Chrome. And Opera.

Plus, the world won’t upgrade. **This version is an operating system upgrade too late**. It would have been far better news if IE9 was installed by default in Windows 7.

---

## File: _posts/hidden/2010-06-24-android-market-payouts.md

---
hidden: true
layout: post
title: Android Market Payouts Total 2% of App Store’s $1B
date: '2010-06-24T13:22:01-04:00'
tumblr_url: https://seanmonstar.com/post/731840952/android-market-payouts
---
[Android Market Payouts Total 2% of App Store’s $1B](http://larvalabs.com/blog/android/android-market-payouts-total-2-of-app-stores-1b/)  

> Overall we estimate that $6,000,000 has been paid out to developers for games, and $15,000,000 has been paid out on apps. That is a total of $21,000,000, almost 50x lower than the amount paid out to devs on iPhone.

Certainly, in terms of developers wanting to make money from selling an app, it seems the iPhone pays better. However, I wonder how much money has been made indirectly, such as a web application providing an Android tie in. True, the same could be said of the iPhone.

I think part of it can be blamed on how the Android Market is interacted with. You currently can’t view the whole market on your desktop. You can only view it from your device. And honestly, many Android owners just [don’t use their phone as much](http://www.marco.org/614852182). So they don’t browse the Android Market looking for cool new games and applications to use.

The Apple culture also encourages pricier things. On the Mac, one of the complaints I’ve heard from non-geeks when considering moving to a Mac is that cost of software. Things you can find for Windows cost much less (_often, free versions exist_) than a similar program on the Mac. So same thing for the Android: people who are used to Windows are used to being able to find a cheap or free program to do simple tasks.

---

## File: _posts/hidden/2010-06-24-criminal-overengineering.md

---
hidden: true
layout: post
title: A few months later you can go back and look at how many of your comments eventually
  turn into more complicated, engineering code. I’ll bet you it’s not very many. That’s
  how much time and effort you’ve saved, right there.
date: '2010-06-24T14:17:59-04:00'
tumblr_url: https://seanmonstar.com/post/731937222/criminal-overengineering
---
> A few months later you can go back and look at how many of your comments eventually turn into more complicated, engineering code. I’ll bet you it’s not very many. That’s how much time and effort you’ve saved, right there.

—[Criminal Overengineering](http://coderoom.wordpress.com/2010/06/23/criminal-overengineering/) (via [cubicle17](http://cubicle17.com/post/729286447/we-have-to-stop-championing-each-ridiculous-feat))

---

## File: _posts/hidden/2010-06-28-understanding-javascript-prototypes.md

---
hidden: true
layout: post
title: Understanding JavaScript Prototypes
date: '2010-06-28T19:28:51-04:00'
tumblr_url: https://seanmonstar.com/post/747330133/understanding-javascript-prototypes
---
[Understanding JavaScript Prototypes](http://javascriptweblog.wordpress.com/2010/06/07/understanding-javascript-prototypes/)  

More than you might ever want to know about JavaScript prototypes.

---

## File: _posts/hidden/2010-06-29-github-organizations.md

---
hidden: true
layout: post
title: Github Organizations
date: '2010-06-29T20:02:00-04:00'
tumblr_url: https://seanmonstar.com/post/751511863/github-organizations
---
[Github Organizations](http://github.com/blog/674-introducing-organizations)  

This is super good news. Previously, an organization’s code was just another user. You’d need to login as that user to manage their stuff.

[Good news](http://twitter.com/kamicane/status/17385569319) for [MooTools](http://github.com/mootools) also, since all Open Source projects can convert into an organization for free.

---

## File: _posts/hidden/2010-06-29-introducing-hulu-plus.md

---
hidden: true
layout: post
title: Introducing Hulu Plus
date: '2010-06-29T16:43:00-04:00'
tumblr_url: https://seanmonstar.com/post/750906177/introducing-hulu-plus
---
[Introducing Hulu Plus](http://blog.hulu.com/2010/06/29/introducing-hulu-plus-more-wherever-more-whenever-than-ever/)  

> Hulu Plus is a new, revolutionary _ad-supported_ subscription product that is incremental and complementary to the existing Hulu service. _[Emphasis mine]_

Hulu is fantastic. Besides being able to watch an episode whenever I want, it was because they had bearable advertising. They’ve been slowly increasing the number of ads and length, though. And that’s a problem. TV ads currently are too disruptive. Hulu was like [Safari Reader](http://www.apple.com/safari/whats-new.html#reader) for the TV shows.

But if I’m going to pay a subscription fee, mostly to watch it through my Xbox, which already requires an Xbox Live subscription, **I better not get ads**. They’re only going to get worse and worse.

Update: John Healey from LATimes [agrees with me](http://latimesblogs.latimes.com/technology/2010/06/where.html).

---

## File: _posts/hidden/2010-07-01-mootools-dragghost.md

---
hidden: true
layout: post
title: MooTools Drag.Ghost
date: '2010-07-01T16:58:00-04:00'
tumblr_url: https://seanmonstar.com/post/758880222/mootools-dragghost
---
[MooTools Drag.Ghost](http://www.monkeyphysics.com/mootools/script/1/dragghost)  

If you’ve used `YAHOO.util.DDProxy`, this is a MooTools version. Basically, drag around a “ghosted” version of the element, so you can leave the original behind in case of a bad drop.

    new Drag.Ghost(element [, options]);

---

## File: _posts/hidden/2010-07-05-apple-regarding-iphone-4.md

---
hidden: true
layout: post
title: Letter from Apple Regarding iPhone 4
date: '2010-07-05T18:01:26-04:00'
tumblr_url: https://seanmonstar.com/post/774218819/apple-regarding-iphone-4
---
[Letter from Apple Regarding iPhone 4](http://latimesblogs.latimes.com/technology/2010/07/iphone-bars.html)  

[Apple](http://www.apple.com/pr/library/2010/07/02appleletter.html):

> Upon investigation, we were stunned to find that the formula we use to calculate how many bars of signal strength to display is totally wrong.

And that is why touching the black strip on your iPhone 4 makes it drop signal… _wait, what?!_ That doesn’t even address it. All they’ve done is said they’re been wrongly advertising excellent coverage.

[Translated](http://daringfireball.net/2010/07/translation_iphone_4) into Basic English for us:

> Yes, with no case on the phone, your signal strength can drop by about 20 or even 30 percent depending how you hold the phone. We’re going to change the bar algorithm so that you’ll only lose one bar if you’re holding it that way.

Their “fix” is to now properly let you know how bad your coverage is. It’s still just as broken to bridge the gap of your antennas. There is still a hardware design flaw. Good thing they point out that if you realize they’re pulling a “Look over here, it’s AT&T” trick, you can still return your iPhone 4.

---

## File: _posts/hidden/2010-07-05-callbacks-vs-events.md

---
hidden: true
layout: post
title: Callbacks vs Events
date: '2010-07-05T13:00:00-04:00'
tumblr_url: https://seanmonstar.com/post/773331630/callbacks-vs-events
---
[Callbacks vs Events](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/)  

Dean Edwards points out that using an array and looping through callbacks is _brittle_:

    $(document).ready(function() {
      console.log("Init: 1");
      DOES_NOT_EXIST++; // this will throw an error
    });
    
    $(document).ready(function() {
      console.log("Init: 2");
    });

> What do we see in the console?

    Init: 1
    
    Error: DOES_NOT_EXIST is not defined

> The problem is clear. Callback systems are brittle. If any of the callback functions throws an error then the subsequent callbacks are not executed. In reality, this means that a poorly written plugin can prevent other plugins from initialising.

---

## File: _posts/hidden/2010-07-05-under-the-bus.md

---
hidden: true
layout: post
title: under the bus
date: '2010-07-05T15:57:00-04:00'
tumblr_url: https://seanmonstar.com/post/773846520/under-the-bus
---
   

I take one day off, and my co-workers put a sign over my work station. Now I’m literally always **under the bus**.

---

## File: _posts/hidden/2010-07-08-above-average-programmers.md

---
hidden: true
layout: post
title: The Problem With 'Above Average Programmers'
date: '2010-07-08T17:09:36-04:00'
tumblr_url: https://seanmonstar.com/post/786579368/above-average-programmers
---
[The Problem With 'Above Average Programmers'](http://www.lessonsoffailure.com/developers/problem-above-average-programmers/)  

> How would you rate your programming skills? (Below Average, Average, or Above Average)

---

## File: _posts/hidden/2010-07-08-htc-explains-why-android-updates-are-slow.md

---
hidden: true
layout: post
title: HTC explains why Android updates are slow
date: '2010-07-08T14:13:33-04:00'
tumblr_url: https://seanmonstar.com/post/786009262/htc-explains-why-android-updates-are-slow
---
[HTC explains why Android updates are slow](http://androidandme.com/2010/07/news/htc-explains-why-android-updates-are-slow-custom-uis/)  

While I feel Android has caught up to the iPhone in many regards (and surpassed in others), this is an area where the iPhone is doing it right. The only phone to get updates as soon as Google has finished them is the Nexus One. Everyone else waits around while the manufacturers take time to slap on their silly custom UIs[^1].

One of the commentors had a good idea: [make the custom UIs as downloadable Home replacement apps.](http://androidandme.com/2010/07/news/htc-explains-why-android-updates-are-slow-custom-uis/#comment-44479)

The scary thing, which you _know_ is reality:

> And, it should be noted that it probably takes HTC so long for some phones since they release so many different variations. They would need multiple teams working on multiple phones – I’m sure they choose the “hottest” phones to work on first. Work on he ones that are still selling and can earn you money… then work on their older (?) phones. Problem is… when you make so many phones on so many networks – your chances of being left in the cold with updates is quite large. HTC, unfortunately, will have to place more and more phones on the backburner for updates – or hire a ridiculous number of programmers to work on phones that don’t sell as much anymore.



[^1]: I don’t see why they even bother. They’re hardware companies, providing custom software. I personally find stock Android to be perfectly fine and usable.

---

## File: _posts/hidden/2010-07-09-simple-javascript-function-to-include-css.md

---
hidden: true
layout: post
title: Simple JavaScript Function To Include CSS
date: '2010-07-09T11:00:00-04:00'
tumblr_url: https://seanmonstar.com/post/789712455/simple-javascript-function-to-include-css
---
[Simple JavaScript Function To Include CSS](http://mattsnider.com/javascript/simple-javascript-function-to-include-css/)  

A creative and light-weight way to dynamically add stylesheets with JavaScript, and receive a faux-load event. Useful when [making a single-page ajax site](http://seanmonstar.com/blog/making-an-ajax-single-page-site-with-mootools/).

---

## File: _posts/hidden/2010-07-12-javascript-needs-macros.md

---
hidden: true
layout: post
title: JavaScript needs macros?
date: '2010-07-12T12:04:43-04:00'
tumblr_url: https://seanmonstar.com/post/802451962/javascript-needs-macros
---
[JavaScript needs macros?](http://meta2.tumblr.com/post/787368639)  

> [JavaScript needs modules](http://blog.mozilla.com/dherman/2010/07/08/javascript-needs-modules/)? No. JavaScript needs a macro compiler companion to extend the language with new statements.

I’m less sold. Opinions in a programing language are a good thing. Look at Python.

---

## File: _posts/hidden/2010-07-12-javascript-needs-modules.md

---
hidden: true
layout: post
title: JavaScript needs modules
date: '2010-07-12T10:01:43-04:00'
tumblr_url: https://seanmonstar.com/post/802108175/javascript-needs-modules
---
[JavaScript needs modules](http://blog.mozilla.com/dherman/2010/07/08/javascript-needs-modules/)  

A brilliant PDF about how modules would really help the JavaScript language. The [CommonJS](http://www.commonjs.org/) module pattern is swell, but what if they were real language constructs?

---

## File: _posts/hidden/2010-07-16-subclass-an-array.md

---
hidden: true
layout: post
title: How ECMAScript 5 still does not allow to subclass an array
date: '2010-07-16T09:59:45-04:00'
tumblr_url: https://seanmonstar.com/post/819507208/subclass-an-array
---
[How ECMAScript 5 still does not allow to subclass an array](http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/)  

Extending an Array in JavaScript appears to be quite the hassle. I had always wondered why the jQuery object didn’t set Array as its prototype.

MooTools solves the issue with their `Elements` class, which basically copies all of `Array`’s methods onto it, so it behaves just like one.

---

## File: _posts/hidden/2010-07-19-3-doors-problem.md

---
hidden: true
layout: post
title: 3 Doors Problem
date: '2010-07-19T15:56:00-04:00'
tumblr_url: https://seanmonstar.com/post/833176982/3-doors-problem
---
[3 Doors Problem](http://mootools.net/shell/kyFBA/2/)  

A fun experiment I did a while back to test out Monty Hall’s [3 doors problem](http://en.wikipedia.org/wiki/Monty_Hall_problem). In short: yes, you get a 66% chance of winning if you **always** switch.

---

## File: _posts/hidden/2010-07-19-lazy-function-definition-pattern.md

---
hidden: true
layout: post
title: Lazy Function Definition Pattern
date: '2010-07-19T10:01:43-04:00'
tumblr_url: https://seanmonstar.com/post/832086490/lazy-function-definition-pattern
---
[Lazy Function Definition Pattern](http://peter.michaux.ca/articles/lazy-function-definition-pattern)  

Sometimes there’s setup involved with a function that we would prefer to only have to execute if the function is needed. It’s also preferable to not have to do an `if` statement every function call, since less logic is more efficient.

    var foo = function() {
        var t = new Date();
        foo = function() {
            return t; 
        }; 
        return foo();
    };

---

## File: _posts/hidden/2010-07-20-new-history-pushstate.md

---
hidden: true
layout: post
title: 'HTML5: Changing the browser-URL without refreshing page'
date: '2010-07-20T20:18:03-04:00'
tumblr_url: https://seanmonstar.com/post/838416615/new-history-pushstate
---
[HTML5: Changing the browser-URL without refreshing page](http://www.spoiledmilk.dk/blog/?p=1922)  

Instead of having to do some `location.hash` [trickery to change around the page with JavaScript](http://seanmonstar.com/blog/making-an-ajax-single-page-site-with-mootools/), there is a new API for the History object that will support this natively.

Basically, you’ll be changing the URL itself, without causing page refreshes.

---

## File: _posts/hidden/2010-07-22-google-chrome-versions.md

---
hidden: true
layout: post
title: A New Version Of Google Chrome Now Due Every Six Weeks
date: '2010-07-22T20:06:29-04:00'
tumblr_url: https://seanmonstar.com/post/847173875/google-chrome-versions
---
[A New Version Of Google Chrome Now Due Every Six Weeks](http://techcrunch.com/2010/07/22/google-chrome-versions/)  

I already love Chrome. I try to convince relatives and friends to use it. I managed to convince my [brother](http://tractorbeamtuesdays.tumblr.com) to move from Netscape to Chrome.

> With the new release schedule, even if something isn’t ready to go in one release, it will only be six weeks until it makes the next one.

And now, it’s going to get better, more often. How could you pick another browser in this current market?

---

## File: _posts/hidden/2010-07-23-bloatware-on-android.md

---
hidden: true
layout: post
title: Bloatware creeps into Android phones
date: '2010-07-23T15:51:35-04:00'
tumblr_url: https://seanmonstar.com/post/850738087/bloatware-on-android
---
[Bloatware creeps into Android phones](http://arstechnica.com/gadgets/news/2010/07/bloatware-creeps-into-android-phones.ars)  

It’s not so much a creeping, and more of **a smashing down the door** , in the case of my new Galaxy. When I hit the applications drawer, there are more crapware apps that came pre-installed than there are apps that I’ve downloaded so far.

This has to be one of maybe two complaints I have of the phone. But even then, this feels true:

> I suspect that a lot of operators think consumers won’t notice or get to a point where they would want to get rid of them.

It’s true. I really don’t notice that much. I rarely pop open the applications drawer. All the apps I use even once a week are on one of my wall pages. The apps aren’t running unless I start them up, so they aren’t using up my precious CPU cycles. And they don’t launch “reminder” notifications that I should check them out. They just take up space, both on my internal **16GB** memory, and in my applications drawer.

And even then, [rooting](http://samsungvibranthacks.com/samsung-vibrant-hacks/how-to-root-samsung-vibrant-galaxy-s/) the Samsung Galaxy S phones is a [breeze](http://www.youtube.com/watch?v=nsoXdhfnHmg).

---

## File: _posts/hidden/2010-07-26-why-smartphone-openness-is-a-lie.md

---
hidden: true
layout: post
title: Why smartphone openness is a lie
date: '2010-07-26T14:33:00-04:00'
tumblr_url: https://seanmonstar.com/post/862268435/why-smartphone-openness-is-a-lie
---
[Why smartphone openness is a lie](http://www.tipb.com/2010/07/23/iphone-android-smartphone-openness-lie/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+TheIphoneBlog+%28TiPb%3A+iPhone%2C+iPad%2C+iPod%29)  

I don’t hate on the iPhone. It’s a decent piece of hardware. I heavily debated with myself if it was the device I wanted for my personal use, but I ultimately decided on Android.

One reason is because Android phones are more open. So when I read crap like this:

> Bottom line, on a truly “open” Android device, you can’t even make a phone call

All I see is an Apple fanboy who must bash on Android because so many of us enjoy that Android is more open. I don’t care if everything is entirely open. What I care is that I don’t have an [overlord](http://apple.com) telling me what I can and cannot do with the device I own.

Any complaints I’ve seen are about the Droid X, and they’ve been cried as if it’s a problem in all of Android. I call **bah-log-na**.

---

## File: _posts/hidden/2010-07-28-google-chrome-pinned-tabs.md

---
hidden: true
layout: post
title: Google Chrome Pinned Tabs
date: '2010-07-28T10:00:00-04:00'
tumblr_url: https://seanmonstar.com/post/870812923/google-chrome-pinned-tabs
---
[Google Chrome Pinned Tabs](http://www.howtogeek.com/howto/7264/make-google-chrome-open-with-pinned-tabs/)  

This has been in Chrome for a while, but [I just noticed](http://twitter.com/seanmonstar/status/19693854510) it because of [Firefox’s App Tabs](http://lifehacker.com/5597893/firefox-4-beta-2-adds-app-tabs-for-keep+open-sites). You can right click a tab and “Pin” it. To make it open that way every time you start Chrome just requires modifying the Chrome application shortcut.



**Update** : Considering how fast Chrome updates, this is already old. Now all you have to do is pin a tab, and it will stay pinned. Modifying your shortcut no longer does this.

---

## File: _posts/hidden/2010-07-29-how-to-turn-your-android-phone-into-a.md

---
hidden: true
layout: post
title: How to Turn Your Android Phone into a Fully-Automated Superphone
date: '2010-07-29T14:34:05-04:00'
tumblr_url: https://seanmonstar.com/post/876086824/how-to-turn-your-android-phone-into-a
---
[How to Turn Your Android Phone into a Fully-Automated Superphone](http://lifehacker.com/5599116/how-to-turn-your-android-phone-into-a-fully+automated-superphone)  

Make your Android phone automatically do a bunch stuff for you. Like turn on GPS when you open Maps. Turn on Silent Mode when you’re at work. Start up your todo list for you in the morning. Automatically turn on WiFi when home, and turn off when you leave.

**It’s awesome.**

---

## File: _posts/hidden/2010-07-30-statistical-significance-in-ab-tests.md

---
hidden: true
layout: post
title: Statistical Significance & Other A/B Test Pitfalls
date: '2010-07-30T10:02:47-04:00'
tumblr_url: https://seanmonstar.com/post/879789956/statistical-significance-in-ab-tests
---
[Statistical Significance & Other A/B Test Pitfalls](http://www.cennydd.co.uk/2009/statistical-significance-other-ab-test-pitfalls/)  

> Last week I tossed a coin a hundred times. 49 heads. Then I changed into a red t-shirt and tossed the same coin another hundred times. 51 heads. From this, I conclude that wearing a red shirt gives a 4.1% increase in conversion in throwing heads.

Put that way, you’d scoff that obviously chance and randomness cause the variation. We should keep that in mind when the variation is small. Especially if the test sample is small.

---

## File: _posts/hidden/2010-08-03-4-more-android-tasker-uses.md

---
hidden: true
layout: post
title: 4 More Android Tasker Uses
date: '2010-08-03T18:22:02-04:00'
tumblr_url: https://seanmonstar.com/post/899901489/4-more-android-tasker-uses
---
[4 More Android Tasker Uses](http://lifehacker.com/5601133/push-your-automated-android-to-awesome-heights-with-these-tasker-setups)  

I already [shared this awesome Android app](http://seanmonstar.com/blog/how-to-turn-your-android-phone-into-a/-fully-automated) that makes your phone do stuff for you. Lifehacker shares 4 more decent uses for this excellent piece of software.

- [Read New SMS While You’re Driving](http://lifehacker.com/5601133/push-your-automated-android-to-awesome-heights-with-these-tasker-setups#readsms)
- [Scale Back Data Use at Night](http://lifehacker.com/5601133/push-your-automated-android-to-awesome-heights-with-these-tasker-setups#data)
- [Pop Up a Menu of Music Apps When Headphones Inserted](http://lifehacker.com/5601133/push-your-automated-android-to-awesome-heights-with-these-tasker-setups#headphones)
- [Mark and Find Where You Parked with GPS Widgets](http://lifehacker.com/5601133/push-your-automated-android-to-awesome-heights-with-these-tasker-setups#parking)

---

## File: _posts/hidden/2010-08-04-google-and-verizon-in-talks-on-selling-internet.md

---
hidden: true
layout: post
title: Google and Verizon in Talks on Selling Internet Priority
date: '2010-08-04T23:01:27-04:00'
tumblr_url: https://seanmonstar.com/post/905772351/google-and-verizon-in-talks-on-selling-internet
---
[Google and Verizon in Talks on Selling Internet Priority](http://www.nytimes.com/2010/08/05/technology/05secret.html?pagewanted=all)  

> The charges could be paid by companies, like YouTube, owned by Google, for example, to Verizon, one of the nation’s leading Internet service providers, to ensure that its content received priority as it made its way to consumers.

**What!** So if I’m downloading something from someone (lets pick Hulu, or Netflix, or Fileplanet) who hasn’t paid Verizon’s extra fee, I’ll get my content slower than Youtubers?

Worse, my general internet browsing will be slowed almost certainly, since I mostly read small blogs.

---

## File: _posts/hidden/2010-08-06-in-defense-of-tumblr.md

---
hidden: true
layout: post
title: In Defense Of [Tumblr]
date: '2010-08-06T16:19:50-04:00'
tumblr_url: https://seanmonstar.com/post/914044948/in-defense-of-tumblr
---
[In Defense Of [Tumblr]](http://log.chrisbowler.com/post/909434670/in-defense-of)  

[Chris](http://log.chrisbowler.com/post/909434670/in-defense-of):

> It is up to the author (or site owner) to make themselves known, not the platform. Tumblr offers a description element as well as pages to share more about yourself. In many authors don’t take the time to do so, we cannot fault Tumblr.

[Cameron Moll](http://cameronmoll.tumblr.com/post/908894991/tumblrs-identity-crisis):

> images are very often posted without attribution to the original source

Because Tumblr has such a lower barrier to entry for people wanting to blog, you’re going to have more people on Tumblr that aren’t as informed about the internet. They won’t always know proper etiquette, like image attribution, nor are they as likely to be trying to sell themselves.

Whereas those people who do bother with the work of registering a domain, paying for hosting, and installing Wordpress are most likely people who want to sell their name. So of course, you’ll find more of those people who bother to make an About Me page.

Tumblr doesn’t stop you, or get in the way at all from making an [About](http://seanmonstar.com/about) page. It’s just that many on Tumblr aren’t as learned as we are. All it takes is some mild instruction for them to either care or not.

---

## File: _posts/hidden/2010-08-12-corporate-blogs-front-page-structure.md

---
hidden: true
layout: post
title: 'Corporate Blogs: Front Page Structure'
date: '2010-08-12T14:10:33-04:00'
tumblr_url: https://seanmonstar.com/post/943115975/corporate-blogs-front-page-structure
---
[Corporate Blogs: Front Page Structure](http://www.useit.com/alertbox/blog-front-pages.html)  

> Showing summaries of many articles is more likely to draw in users than providing full articles, which can quickly exhaust reader interest.

Excerpts are a good thing, you see?

---

## File: _posts/hidden/2010-08-13-language-huh-i-have-no-idea-theres-more-than.md

---
hidden: true
layout: post
title: Language? huh. I have no idea. There’s more than one? I don’t really know what
  he does. I don’t pay attention to that stuff.
date: '2010-08-13T20:50:06-04:00'
tumblr_url: https://seanmonstar.com/post/949799500/language-huh-i-have-no-idea-theres-more-than
---
> Language? huh. I have no idea. There’s more than one? I don’t really know what he does. I don’t pay attention to that stuff.

—[“My husband is a programmer; I have no idea what that means.”](http://www.renaebair.com/2010/08/11/my-husband-is-a-programmer-i-have-no-idea-what-that-means/)

---

## File: _posts/hidden/2010-08-16-if-you-need-more-than-3-levels-of-indentation.md

---
hidden: true
layout: post
title: If you need more than 3 levels of indentation, you’re screwed anyway, and should
  fix your program.
date: '2010-08-16T14:28:49-04:00'
tumblr_url: https://seanmonstar.com/post/963722373/if-you-need-more-than-3-levels-of-indentation
---
> If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.

—Linus Torvalds (via [fooyeahcode](http://fooyeahcode.tumblr.com/))

---

## File: _posts/hidden/2010-08-20-world-ill-pay-extra-if-you-will-please-give-me.md

---
hidden: true
layout: post
title: World, I’ll pay extra if you will please give me less.
date: '2010-08-20T17:45:15-04:00'
tumblr_url: https://seanmonstar.com/post/984160145/world-ill-pay-extra-if-you-will-please-give-me
---
> World, I’ll pay extra if you will please give me less.

—[The Less Feature](http://dilbert.com/blog/entry/the_less_feature/) via Scott Adams

---

## File: _posts/hidden/2010-08-24-advanced-task-manager-revenue.md

---
hidden: true
layout: post
title: Advanced Task Manager Revenue
date: '2010-08-24T13:27:23-04:00'
tumblr_url: https://seanmonstar.com/post/1004252099/advanced-task-manager-revenue
---
[Advanced Task Manager Revenue](http://arronla.com/2010/08/android-revenue-advanced-task-manager/)  

> Android is a viable revenue stream. Although $80,000 total isn’t a lot compared to some of the overnight millionaire stories you hear about on the iPhone App Store (not sure if this is before or after Apple’s cut), you are able to generate good returns. On average, I’m getting around $10,000 a month after all cuts.

Something as simple yet useful as a Task Manager can make $10k a month. On Android. It’s interesting too how much of that is from the free, ad-supported version.

---

## File: _posts/hidden/2010-08-26-stylebot.md

---
hidden: true
layout: post
title: Stylebot
date: '2010-08-26T10:00:46-04:00'
tumblr_url: https://seanmonstar.com/post/1014381158/stylebot
---
[Stylebot](http://stylebot.me/)  

This is a _fantastic_ extension for Chrome. This lets you easily edit the styles of a web page, and have them be saved and applied next time you visit.

The demo shows one excellent use: improving a site you frequent. I did that for Kotaku/Lifehacker. I never use the Share box, and always mistake it for a search box. So, share box hidden, search box moved into place.

Also, I have refrained from Adblockers in the past because I don’t want to block _all_ ads. I respect websites’ needs to make money. But I don’t respect the need to make a website that is more about the ads than the content. So, certain websites that [cover their articles in flash ads](https://twitter.com/seanmonstar/status/22122514533), or have _far too many_ ads in the sidebar, have their ads hidden.

Yes, I know. Shame on me, etc.

---

## File: _posts/hidden/2010-08-26-whats-in-your-simplenote.md

---
hidden: true
layout: post
title: What's in your Simplenote?
date: '2010-08-26T21:30:01-04:00'
tumblr_url: https://seanmonstar.com/post/1017198784/whats-in-your-simplenote
---
[What's in your Simplenote?](http://minimalmac.com/post/1014631828/whats-in-your-simplenote)  

It’s always cool to learn new systems to productivity and work. Patrick Rhone asks people to share what they keep in their [Simplenote](http://simplenoteapp.com), and so I join in:

- **Blog Post Drafts** - Ideas hit me at random times. So I’ll start writing, sometimes at lunch time, or waiting outside the dressing room like a loyal husband, or at midnight after reading from Instapaper. Even _this_ post is in my Simplenote.
- **My Wishlist** - I keep an ordered list of what little things I’d like to save up for, one at a time. Current contents include: a second monitor, [Carcassonne](http://www.amazon.com/gp/product/B00005UNAX?tag=seanmonstar-20), and a chess timer.
- **Brainstorming Spurts** - When I have an idea for something in the future, I like to keep it with me so I may review it from time to time, and add to it when something more hits me. Such as my current freemium plans for a personal project.

I quite like Patrick’s **Yay me!** idea, and [Randy’s](http://cptnrandy.tumblr.com/post/1015104666/minimal-mac-whats-in-your-simplenote) **elevator pitch/bio** idea.

---

## File: _posts/hidden/2010-08-30-ladies-look-at-your-code.md

---
hidden: true
layout: post
title: 'Ladies. Look at your code. '
date: '2010-08-30T19:01:34-04:00'
tumblr_url: https://seanmonstar.com/post/1039097415/ladies-look-at-your-code
---
[Ladies. Look at your code.](http://www.google.com/buzz/kevinb9n/Q3YnNiEC9jr/Ladies-Look-at-your-code-return-Iterables-filter)  

> Now look at mine.
> 
> Sadly, it isn’t mine.

I’m on a horse.[^1]



[^1]: I really shouldn’t be amazed that any time someone points out something neat coming to their language, everyone must point out “language X does it better” or “we’ve had that forever in language Y”.

---

## File: _posts/hidden/2010-09-03-galaxy-tab-preview.md

---
hidden: true
layout: post
title: galaxy tab preview
date: '2010-09-03T17:58:17-04:00'
tumblr_url: https://seanmonstar.com/post/1060396514/galaxy-tab-preview
---
   

While I really want this to be my tablet, I’m wary of whether it will have a **WiFi only version** (I don’t need another monthly fee, thanks), it’s **price** (rumored significantly higher than the iPad), and how well it plays **movies from Netflix and Hulu**.

---

## File: _posts/hidden/2010-09-03-prioritizing-my-tiny-inbox.md

---
hidden: true
layout: post
title: Prioritizing My Tiny Inbox
date: '2010-09-03T19:09:00-04:00'
tumblr_url: https://seanmonstar.com/post/1060701091/prioritizing-my-tiny-inbox
---
The intertubes all have [Gmail’s Priority Inbox](http://mail.google.com/mail/help/priority-inbox.html) in mind. I find people’s reactions to be quite surprising. I don’t get the tidal waves of email as some people do. In fact, I get very little email. Yet, I was excited at the idea of trying to make email better.

Some people were nervous about it. Nervous as in [paranoid](http://ianhines.com/post/1054786267/email-management). I wonder, why? Google isn’t actually “reading” your email. It’s just some algorithms running on your read and reply history. Some Bayesian statistics applied. Anyone worried that their email is _now_ being read should realize that Google could have been reading your email long before now. Really, if anyone is that concerned with privacy, they should consider using their own hosted email server, and an email certificate. Then you can be sure the only people seeing your email are you and your sender/receiver.

Other people don’t want to change their system. They have [rules set up to filter a lot of junk](http://brooksreview.net/2010/09/priority-inbox/) already, or they [use a speedy Inbox Zero routine](http://52tiger.net/mail-rules/) to quickly weed out the crap. I can appreciate that. I like to process my email all at once, and leave nothing left in the inbox. I also use a set of filters, mostly to apply labels to certain things so I can have a context when I open them. But I still appreciate what this Priority Inbox can do. Rules can change. You may add a new mailing list, or find a new friend that sends you chain letters, and instead of adding yet another rule manually, why not just let a computer figure that out for you quickly? Or for those processing every single message themselves, I have to wonder why you would want to spend the time and mental energy on so much junk.

As a programmer, I look at everything and think: “Can’t a computer do that for me?”

Now, I just got Priority Inbox enabled, and the excitement died a little. Not because I think it’s useless, but because **I don’t get a lot of email**. When it turned on, it helped sort 2 emails for me. I can see people getting included in emails by being added to the carbon copy a lot, or if they’re in a position facing the public, like a community manager. But looking at people’s rules, I don’t see how people can accept getting so much junk mail in the first place.

Pretty much all the email I get I would classify as “important”. Almost everything is directed at me. The few mailing lists I subscribe to, I do so because I want to read every single message. I don’t allow applications like Facebook or Twitter[^1] or whatever to send me useless notification emails. Any time any service sends me email that I don’t want, I scour the footer for the unsubscribe link, and make a liberal use of that **spam** button. I can’t imagine allowing myself to receive email that I would want a filter to automatically archive for me. What use was that email for me, then? I never look in the archive. I don’t store information in my email for later reference. How some of you people even allow so much junk is beyond me.



[^1]: Basecamp has no ability inside the app to disable emails, and when posting a new message, the easiest email options is to selected “Everyone” instead of checking everyone but myself. I’ve wanted to hit the spam button for Basecamp so many times, but I always stop myself in case I get message from another Basecamp account that I need to see. _Grrrr_.

---

## File: _posts/hidden/2010-09-03-text-and-email-are-polite-invitations-to-a.md

---
hidden: true
layout: post
title: Text and email are polite invitations to a conversation. They happen at the
  speed and leisure of both the sender and the receiver. In stark contrast, when you
  get a phone call, it’s almost always a convenient time for the caller and a bad
  time for the recipient, who I refer to as the “victim” because I insist on accuracy.
date: '2010-09-03T13:52:02-04:00'
tumblr_url: https://seanmonstar.com/post/1059404138/text-and-email-are-polite-invitations-to-a
---
> Text and email are polite invitations to a conversation. They happen at the speed and leisure of both the sender and the receiver. In stark contrast, when you get a phone call, it’s almost always a convenient time for the caller and a bad time for the recipient, who I refer to as the “victim” because I insist on accuracy.

—[Scott Adams Blog: Phone](http://dilbert.com/blog/entry/phone/)

---

## File: _posts/hidden/2010-09-09-can-regular-javascript-be-mixed-with-jquery.md

---
hidden: true
layout: post
title: Can regular JavaScript be mixed with jQuery?
date: '2010-09-09T13:38:27-04:00'
tumblr_url: https://seanmonstar.com/post/1092558788/can-regular-javascript-be-mixed-with-jquery
---
[Can regular JavaScript be mixed with jQuery?](http://stackoverflow.com/questions/3677140/can-regular-javascript-be-mixed-with-jquery)  

This makes me want to type with my face from now on.

---

## File: _posts/hidden/2010-09-09-update-app-store-guidlines.md

---
hidden: true
layout: post
title: Updated App Store License Agreement
date: '2010-09-09T13:02:57-04:00'
tumblr_url: https://seanmonstar.com/post/1092422384/update-app-store-guidlines
---
[Updated App Store License Agreement](http://daringfireball.net/2010/09/app_store_guidelines)  

Mostly good news. I appreciated some of the casual bullet items at the start of the document, such as not wanting to fill the store with “amateur hour”.

However, [Sascha Segan](http://twitter.com/saschasegan/status/24016093103) expresses the same feeling I get when considering iOS apps:

> People say Apple is being more transparent, but their top app approval guideline is still “we’ll use our subjective judgement.”

---

## File: _posts/hidden/2010-09-10-twitter-for-ipad.md

---
hidden: true
layout: post
title: Twitter for iPad
date: '2010-09-10T15:47:39-04:00'
tumblr_url: https://seanmonstar.com/post/1098384876/twitter-for-ipad
---
[Twitter for iPad](http://brooksreview.net/2010/09/twitter-ipad-2/)  

I got to use Twitter for iPad for a weekend, and I loved it. I loved how smooth and quick it felt going from my stream to a link someone offered, and checking out the person’s profile, and then continuing to create more sliding panels looking at his tweets and more.

I can see how it could be frustrating that you can’t unselect a tweet, but it doesn’t bother me much. I absolutely love, though, that you can view the links without leaving the Twitter client. I find it frustatingly stupid that iOS doesn’t let you go “back” to a previous application if it launches a new one.

As Ben Brooks put it:

> If this is how much they can do on their first try, then there is no telling just what they will be able to do with more time and feedback.

---

## File: _posts/hidden/2010-09-14-being-late-is-selfish.md

---
hidden: true
layout: post
title: No, you are not ‘running late’, you are rude and selfish
date: '2010-09-14T17:13:28-04:00'
tumblr_url: https://seanmonstar.com/post/1122608567/being-late-is-selfish
---
[No, you are not ‘running late’, you are rude and selfish](http://gregsavage.com.au/2010/06/07/no-you-are-not-%E2%80%98running-late%E2%80%99-you-are-rude-and-selfish/)  

> It’s simply that some people no longer even pretend that they think your time is as important as theirs. And technology makes it worse. It seems texting or emailing that you are late somehow means you are no longer late.

---

## File: _posts/hidden/2010-09-16-the-complete-android-guide.md

---
hidden: true
layout: post
title: The Complete Android Guide
date: '2010-09-16T19:41:36-04:00'
tumblr_url: https://seanmonstar.com/post/1134392128/the-complete-android-guide
---
[The Complete Android Guide](http://www.completeguides.net/01_The_Complete_Android_Guide)  

Excellent guide by Lifehacker editor Kevin Purdy. The [10 Things to Do Right Away](http://www.completeguides.net/01_The_Complete_Android_Guide/~Tutorials/10_Things_to_Do_Right_Away_on_Your_Android_Phone) is particularly useful when activating a new phone.

---

## File: _posts/hidden/2010-09-17-the-tie-fighter-pilot-who-saved-the-day-in-star.md

---
hidden: true
layout: post
title: The TIE Fighter Pilot Who Saved The Day in 'Star Wars'
date: '2010-09-17T13:08:49-04:00'
tumblr_url: https://seanmonstar.com/post/1138205740/the-tie-fighter-pilot-who-saved-the-day-in-star
---
[The TIE Fighter Pilot Who Saved The Day in 'Star Wars'](http://www.cracked.com/article_18719_the-tie-fighter-pilot-who-saved-day-in-star-wars.html)  

An excellent point that the one who _really_ saved the Rebellion was a panicky TIE Fighter pilot, not Han or Luke. The writing is also excellent, providing a good laugh.

---

## File: _posts/hidden/2010-09-23-a-motive-for-bad-design.md

---
hidden: true
layout: post
title: A Motive For Bad Design
date: '2010-09-23T06:01:00-04:00'
tumblr_url: https://seanmonstar.com/post/1172987542/a-motive-for-bad-design
---
[A Motive For Bad Design](http://usabilitypost.com/2010/09/22/a-motive-for-bad-design/)  

Dmitry Fadeyev:

> The clutter bombards the visitor with links to click on, confusing and pulling them in different directions. Ads are placed right inside the content, just below the headline, trying to grab your attention by force. Related article links are presented to you right when you’ve finished reading something, pushing you to read something else. All around the page are even more links and ads, asking you to click them, as if the article you’re on isn’t worth your time (and it probably isn’t).

Sometimes, when seeing a particularly advert-filled blog, or seeing youtube’s ads scroll up and cover part of the movie, I ask myself: “How would these people feel if they visited content like their own? Disgusted? Turn on an adblocker?”

Clearly, they don’t care about their own content. They care about selling your eyeballs to an advertiser.

---

## File: _posts/hidden/2010-09-24-style-guide-for-python-code.md

---
hidden: true
layout: post
title: Style Guide for Python Code
date: '2010-09-24T19:55:00-04:00'
tumblr_url: https://seanmonstar.com/post/1181440279/style-guide-for-python-code
---
[Style Guide for Python Code](http://www.python.org/dev/peps/pep-0008/)  

I love Python; the style guide is a great resource for writing consistent looking code. I particularly enjoyed these:

- Always use `self` for the first argument to instance methods.

- `_single_leading_underscore`: weak “internal use” indicator. E.g. `from M import *` does not import objects whose name starts with an underscore.

- `single_trailing_underscore_`: used by convention to avoid conflicts with Python keyword

- `__double_leading_underscore`: when naming a class attribute, invokes name mangling (inside class `FooBar`, `__boo` becomes `_FooBar__boo`).

- Comparisons to singletons like `None` should always be done with `is` or `is not`, never the equality operators.

---

## File: _posts/hidden/2010-10-04-email-hate.md

---
hidden: true
layout: post
title: If you do this in an email, I hate you
date: '2010-10-04T18:33:10-04:00'
tumblr_url: https://seanmonstar.com/post/1244933028/email-hate
---
[If you do this in an email, I hate you](http://theoatmeal.com/comics/email)  

I particularly agree regarding the NDA emails and unsubscribe links.

---

## File: _posts/hidden/2010-10-04-google-tv.md

---
hidden: true
layout: post
title: Google TV
date: '2010-10-04T17:42:21-04:00'
tumblr_url: https://seanmonstar.com/post/1244611698/google-tv
---
[Google TV](http://www.google.com/tv/)  

While I agree that accessing the internet for certain media (videos, in thise case) is a great idea. I already use only Netflix and Hulu, no more cable.

Still, I don’t see a need to browse the web and use “apps” on my TV. I just use my computer. Or if I’m too lazy, I’ll pull out [my phone](http://seanmonstar.com/blog/samsung-galaxy-vibrant-review/) instead.

---

## File: _posts/hidden/2010-10-05-recruiters.md

---
hidden: true
layout: post
title: Why are technical recruiters so clueless?
date: '2010-10-05T18:43:14-04:00'
tumblr_url: https://seanmonstar.com/post/1251615390/recruiters
---
[Why are technical recruiters so clueless?](http://37signals.com/svn/posts/2598-why-are-technical-recruiters-so-clueless)  

DHH wonders if any recruiters actually research us, or if they just blast us with email.

So far, LinkedIn has done a great job of referring these e-mail blasters to offer me terrible jobs at startups with vague descriptions of ruling the world.

---

## File: _posts/hidden/2010-10-05-the-potential-of-mobileme.md

---
hidden: true
layout: post
title: The Potential of MobileMe
date: '2010-10-05T14:44:00-04:00'
tumblr_url: https://seanmonstar.com/post/1250210395/the-potential-of-mobileme
---
[The Potential of MobileMe](http://shawnblanc.net/2010/10/mobileme-potential/)  

Shawn:

> In its current state as “exchange for the rest of us” MobileMe seems neither exciting nor ambitious. […] And iDisk? Well, that is also collecting dust.

It truly is one of iOS’ biggest flaws: that lack of painless syncing. Android doesn’t have this problem; I’ve plugged [my phone](http://seanmonstar.com/blog/samsung-galaxy-vibrant-review/) into my computer two times, total.

While I feel that any developer making an application that uses data that could be accessed anywhere should build their own cloud service[^1], Android provides this to mobile developers who don’t know much about servers. You can use a `BackupAgent` to allow easy re-installation on a new phone, and use `addPeriodicSync` to sync any data the same way Calendar or Contacts syncs.



[^1]: Which shouldn’t be too hard for most developers. You just need a database, and a simple API to send and receive the data.

---

## File: _posts/hidden/2010-10-07-what-we-can-learn-from-procrastination.md

---
hidden: true
layout: post
title: What we can learn from procrastination
date: '2010-10-07T22:52:12-04:00'
tumblr_url: https://seanmonstar.com/post/1270246271/what-we-can-learn-from-procrastination
---
[What we can learn from procrastination](http://www.newyorker.com/arts/critics/books/2010/10/11/101011crbo_books_surowiecki?printable=true)  

> Before we rush to overcome procrastination we should consider whether it is sometimes an impulse we should heed

Just like the magnet on my fridge says, “Hard work has a future payoff; laziness pays off now.”

---

## File: _posts/hidden/2010-10-08-sql-on-rails.md

---
hidden: true
layout: post
title: SQL on Rails
date: '2010-10-08T17:01:12-04:00'
tumblr_url: https://seanmonstar.com/post/1271136716/sql-on-rails
---
[SQL on Rails](http://sqlonrails.org/screencast)  

Hilarious parody on the ridiculous Ruby on Rails intro screencast.

---

## File: _posts/hidden/2010-10-09-cars-on-autopilot.md

---
hidden: true
layout: post
title: Cars on Autopilot
date: '2010-10-09T16:20:33-04:00'
tumblr_url: https://seanmonstar.com/post/1278114769/cars-on-autopilot
---
[Cars on Autopilot](http://googleblog.blogspot.com/2010/10/what-were-driving-at.html)  

Google:

> All in all, our self-driving cars have logged over 140,000 miles. We think this is a first in robotics research.

I’ve always thought our car technology was behind the times. Software engineers have been able to make artificial intelligence reliably drive cars in video games for a couple decades. Finally, **finally** , this may become a reality.

---

## File: _posts/hidden/2010-10-11-mootools-core-13-released.md

---
hidden: true
layout: post
title: MooTools Core 1.3 Released
date: '2010-10-11T19:40:37-04:00'
tumblr_url: https://seanmonstar.com/post/1294696341/mootools-core-13-released
---
[MooTools Core 1.3 Released](http://mootools.net/blog/2010/10/11/mootools-core-1-3-stable-and-mootools-more-1-3rc/)  

Improved speed, improved API decisions. Lots of hard work and tears went into this. Congratulations to the MooTools team.

I’m hurriedly converting my MVC framework to use 1.3, since it fixes a few issues in IE. I could just require the compat mode, but screw that. If you still want 1.2, you can use the compat yourself.

---

## File: _posts/hidden/2010-10-11-windows-phone-7-has-hardware-checklist.md

---
hidden: true
layout: post
title: Windows Phone 7 Has Hardware Checklist
date: '2010-10-11T19:19:49-04:00'
tumblr_url: https://seanmonstar.com/post/1294552215/windows-phone-7-has-hardware-checklist
---
[Windows Phone 7 Has Hardware Checklist](http://www.wired.com/gadgetlab/2010/10/windows-phone-7-4)  

Wired:

> Each device must feature three standard hardware buttons, for example, and before they can ship with Windows Phone 7, they have to pass a series of tests directed by Microsoft.

This will certainly help WP7 to have less segmentation, and keep its brand a bit more uniform. I’m uncertain if the way Android allows the hardware to be anything in the world is a good or bad thing. It allows cheaper phones to be made, like the Charm, and still guarantees a decebt web browser, while allowing better phones to exist like my Galaxy.

I do wish Android’s “hardware” buttons were in a consistant order, though.

---

## File: _posts/hidden/2010-10-13-googles-driverless-cars-subscriptions.md

---
hidden: true
layout: post
title: Google’s Driverless Cars Subscriptions?
date: '2010-10-13T21:35:24-04:00'
tumblr_url: https://seanmonstar.com/post/1309842650/googles-driverless-cars-subscriptions
---
[Google’s Driverless Cars Subscriptions?](http://tech.fortune.cnn.com/2010/10/12/when-can-consumers-buy-a-google-driverless-car-and-why-would-they/)  

CNN:

> Cars that don’t need drivers also may not need private owners – since they could be summoned remotely and returned once their journey is complete. Why take on a lease if you can purchase a subscription to a car instead?

What a brilliant idea! My wife and I had both thought that no one would be able to afford these cars for a while; with subscriptions, that would be a non-issue. There would also be less total cars required to be made.

(via [TightWind](http://www.tightwind.net/2010/10/googles-driverless-cars-and-car-subscriptions/))

---

## File: _posts/hidden/2010-10-14-rollover-image-patent-troll.md

---
hidden: true
layout: post
title: Rollover image on your website? That will be $80,000 (please)
date: '2010-10-14T18:12:51-04:00'
tumblr_url: https://seanmonstar.com/post/1315615598/rollover-image-patent-troll
---
[Rollover image on your website? That will be $80,000 (please)](http://arstechnica.com/tech-policy/news/2010/10/patent-troll-takes-over-the-web-can-it-be-stopped.ars)  

Patent troll comes out to take on the interwebs.

---

## File: _posts/hidden/2010-10-14-tab-in-my-pocket.md

---
hidden: true
layout: post
title: Tab In My Pocket
date: '2010-10-14T16:14:33-04:00'
tumblr_url: https://seanmonstar.com/post/1314864726/tab-in-my-pocket
---
[Tab In My Pocket](http://www.tbray.org/ongoing/When/201x/2010/09/10/Galaxy-Tab-in-my-Pocket)  

Tim Bray reviewing the Galaxy Tab:

> This is an excellent product. It’s fast, beautiful, useful, responsive, and convenient. If Samsung picks the right price point and channels, they’ll sell a ton.

Hopefully, they pick a good price for the WiFi version.

He also notes that his review should be balanced by someone not as biased, since he’s an Android evangelist working for Google.

---

## File: _posts/hidden/2010-10-22-so-long-carbonmade.md

---
hidden: true
layout: post
title: So Long, Carbonmade
date: '2010-10-22T16:18:25-04:00'
tumblr_url: https://seanmonstar.com/post/1375308373/so-long-carbonmade
---
[So Long, Carbonmade](http://spencerfry.com/so-long-carbonmade)  

Understanding users requires asking them. Here’s a great example of noticing the need, and quickly having it implemented by day’s end.

---

## File: _posts/hidden/2010-10-25-a-social-browser.md

---
hidden: true
layout: post
title: A Social Browser
date: '2010-10-25T12:00:58-04:00'
tumblr_url: https://seanmonstar.com/post/1399502461/a-social-browser
---
[A Social Browser](http://techcrunch.com/2010/10/19/facebook-browser-chrome-social/)  

Siegler:

> You might laugh at the notion of a Facebook web browser, but be honest: how many of your friends would use it? Probably a lot. If it had chat, alerts, and, of course, the News Feed, it would be a huge hit. You could visit any site on the web, but you’d be already logged in to your Facebook account. And you’d have one-click access to all your Facebook credits to buy whatever you wanted. And you would already be logged in to comment anywhere.

True. I personally think the browser should solve the login crisis of the web. Let my browser identify myself.

---

## File: _posts/hidden/2010-10-25-advice-to-aimless-excited-programmers.md

---
hidden: true
layout: post
title: 'The two keys: (1) keep it simple, (2) make it something you’d actually use.'
date: '2010-10-25T19:49:52-04:00'
tumblr_url: https://seanmonstar.com/post/1401973930/advice-to-aimless-excited-programmers
---
> The two keys: (1) keep it simple, (2) make it something you’d actually use.

—[Advice to Aimless, Excited Programmers](http://prog21.dadgum.com/80.html)

---

## File: _posts/hidden/2010-10-25-not-getting-it.md

---
hidden: true
layout: post
title: Not Getting It [ORLY?]
date: '2010-10-25T15:53:42-04:00'
tumblr_url: https://seanmonstar.com/post/1400538958/not-getting-it
---
[Not Getting It [ORLY?]](http://daringfireball.net/linked/2010/10/21/beltzner)  

Gruber:

> Apple’s strategy isn’t about bypassing the web or replacing it or anything like that. […] Apple’s strategy is about offering a great web experience and more.

Apple may like to offer a good web experience, but I wouldn’t be surprised when OS X 10.7 doesn’t allow executables to be installed for “[security reasons](http://twitter.com/#!/seanmonstar/status/27954764859)”.

---

## File: _posts/hidden/2010-10-26-edge-prototype.md

---
hidden: true
layout: post
title: Edge Prototype
date: '2010-10-26T16:42:54-04:00'
tumblr_url: https://seanmonstar.com/post/1409040080/edge-prototype
---
[Edge Prototype](http://tv.adobe.com/watch/adc-presents/preview-of-the-edge-prototype-tool-for-html5-/)  

Adobe has a prototype that acts much like their Flash Pro, but generates HTML, JavaScript, and CSS.

I suspect that this will be used on most brochureware websites in the future, but there will of course still be need for optimized hand-coded solutions until browser rendering and performance is as negligible as native apps.

---

## File: _posts/hidden/2010-10-26-youtube5-chromed.md

---
hidden: true
layout: post
title: YouTube5, Chromed
date: '2010-10-26T19:51:02-04:00'
tumblr_url: https://seanmonstar.com/post/1410415572/youtube5-chromed
---
[YouTube5, Chromed](http://elasticthreads.tumblr.com/post/1407434390/youtube5-chromed)  

A Chrome extension that turns all YouTube videos into their HTML5 equivalents, cutting down of the amount of Flash you need to run.

---

## File: _posts/hidden/2010-10-27-when-people-have-strong-opinions-about-things.md

---
hidden: true
layout: post
title: When people have strong opinions about things — when they can talk at length
  about something — it’s a good indication that they’re passionate about it.
date: '2010-10-27T12:30:43-04:00'
tumblr_url: https://seanmonstar.com/post/1416393659/when-people-have-strong-opinions-about-things
---
> When people have strong opinions about things — when they can talk at length about something — it’s a good indication that they’re passionate about it.

—[How to hire a programmer](http://37signals.com/svn/posts/2628-how-to-hire-a-programmer-when-youre-not-a-programmer)

---

## File: _posts/hidden/2010-10-29-flash-to-html5.md

---
hidden: true
layout: post
title: Adobe demos Flash-to-HTML5 conversion tool
date: '2010-10-29T02:56:49-04:00'
tumblr_url: https://seanmonstar.com/post/1429957262/flash-to-html5
---
[Adobe demos Flash-to-HTML5 conversion tool](http://blogs.adobe.com/jnack/2010/10/adobe-demos-flash-to-html5-conversion-tool.html)  

First, the [HTML5 builder tool](http://seanmonstar.com/blog/edge-prototype/). Now, converting your flash **into** HTML5. At least it’s the right direction (HTML5).

---

## File: _posts/hidden/2010-11-02-chalk.md

---
hidden: true
layout: post
title: Chalk
date: '2010-11-02T14:37:54-04:00'
tumblr_url: https://seanmonstar.com/post/1463223220/chalk
---
[Chalk](http://chalk.37signals.com/)  

For you iPad users, a free iPad browser app to sketch ideas.

It is similar to their paid app Draft, but it’s crazy to see [people trashing 37signals for releasing a free experiment](http://37signals.com/svn/posts/2637-introducing-chalk-a-fun-little-browser-based-app-for-ipad-inspired-by-our-new-office#comments).

---

## File: _posts/hidden/2010-11-03-google-console.md

---
hidden: true
layout: post
title: Google Console
date: '2010-11-03T02:06:32-04:00'
tumblr_url: https://seanmonstar.com/post/1468646382/google-console
---
[Google Console](http://googlecode.blogspot.com/2010/11/introducing-google-apis-console-and-our.html)  

Kinda like YQL Console, but for Google APIs.

(via [DeWitt Clinton](http://www.google.com/buzz/dclinton/5ZsMQ4ZnEXb/Introducing-the-Google-APIs-console-Were-unveiling))

---

## File: _posts/hidden/2010-11-03-no-is-easier.md

---
hidden: true
layout: post
title: No is easier to do. Yes is easier to say.
date: '2010-11-03T16:10:07-04:00'
tumblr_url: https://seanmonstar.com/post/1472694948/no-is-easier
---
> No is easier to do. Yes is easier to say.

—[Jason Fried](http://37signals.com/svn/posts/2642-no-is-easier-to-do-yes-is-easier-to-say)

---

## File: _posts/hidden/2010-11-08-chrome-click-to-play.md

---
hidden: true
layout: post
title: Chrome Click to Play
date: '2010-11-08T18:22:24-05:00'
tumblr_url: https://seanmonstar.com/post/1519516123/chrome-click-to-play
---
[Chrome Click to Play](http://superuser.com/questions/201613/disable-java-plugin-in-google-chrome/201633#201633)  

Chrome 8 includes a click-to-play preference for all Plugins (read: Flash, Java). That’s fantastic. No longer need an extension to do this.

---

## File: _posts/hidden/2010-11-10-gauges-are-dirty-liars.md

---
hidden: true
layout: post
title: 'Gauges are Dirty Liars '
date: '2010-11-10T13:35:42-05:00'
tumblr_url: https://seanmonstar.com/post/1535533178/gauges-are-dirty-liars
---
I have several objects that show some sort of resource guage, and I find all too often that they lie as much as a doormat.

My car fuel gauge, when filled, goes past Full. Driving for 180 miles brings the tank to ¾. Another 50 miles brings it down to ¼. The next time I turn on the car, it swears it can’t go another mile, until I get to the gas station, and don’t even put the maximum gallons back in.

My [phone](http://seanmonstar.com/blog/samsung-galaxy-vibrant-review/) says that it has full battery for an entire day. When I wake up in the next morning, it’s at ¾ battery. Maybe 8 hours later, and it’s letting me know I have 20% left.

The Xbox 360 wireless controller claims to have full battery most of its life. It has four bars to indicate battery life. I’ve never seen it show less than 2. The only way I know it is low on battery power is when the controller abruptly shuts off. You can turn it back on right away the first couple times, and it still claims 2 out of 4 bars of power. Yet it insists on dying every 15 minutes after that.

I just wonder, what gives? Why is it that all these gauges like to boast they’re almost full for so long, and only at the very end do they warn me (or not) of hitting empty.

Dirty lying scumbags.

---

## File: _posts/hidden/2010-11-10-readme-driven-development.md

---
hidden: true
layout: post
title: Readme Driven Development
date: '2010-11-10T16:05:40-05:00'
tumblr_url: https://seanmonstar.com/post/1536808785/readme-driven-development
---
[Readme Driven Development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html)  

Tom Preston-Werner:

> Remember that feeling when you first started writing automated code tests and realized that you caught all kinds of errors that would have otherwise snuck into your codebase? That’s the exact same feeling you’ll have if you write the Readme for your project before you write the actual code.

---

## File: _posts/hidden/2010-11-17-postgresql-vs-mysql.md

---
hidden: true
layout: post
title: PostgreSQL vs MySQL
date: '2010-11-17T16:01:00-05:00'
tumblr_url: https://seanmonstar.com/post/1602625455/postgresql-vs-mysql
---
[PostgreSQL vs MySQL](http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL_2009)  

Blazonco uses PostgreSQL, rather than the ever popular MySQL. If you’ve ever wondered why some people do that, this is a great read.

A couple key points:

- Postgres consistently has had better data integrity
- Postgres has far superior support for transactions and rollbacks.
- Postgres does better query optimization on different kinds of JOINs.
- MySQL performs COUNT queries faster.

---

## File: _posts/hidden/2010-11-18-20-things-i-learned.md

---
hidden: true
layout: post
title: 20 Things I Learned About Browsers and the Web
date: '2010-11-18T17:24:00-05:00'
tumblr_url: https://seanmonstar.com/post/1612661516/20-things-i-learned
---
[20 Things I Learned About Browsers and the Web](http://www.20thingsilearned.com/)  

Super awesome book explaining how the Internet and web browsers work in layman’s terms. _And_, the technology powering this site is impressive, with page turning animations, and `pushState`.

---

## File: _posts/hidden/2010-11-19-huge-amount-of-goats-teleported.md

---
hidden: true
layout: post
title: Huge amount of goats teleported
date: '2010-11-19T18:09:57-05:00'
tumblr_url: https://seanmonstar.com/post/1621744289/huge-amount-of-goats-teleported
---
[Huge amount of goats teleported](http://code.google.com/p/chromium/issues/detail?id=31482)  

> **What steps will reproduce the problem?**
> 
> 1. Shift+Esc
> 2. Right click on any process
> 3. Select “Goats teleported”
> 
> **What is the expected result?**
> 
> I expected Google Chrome to teleport maybe three, maximum five goats!
> 
> **What happens instead?**
> 
> About 3\*10^6 goats get teleported! I won’t be able to pay for teleportation of such huge amount of goats!

---

## File: _posts/hidden/2010-11-19-nodejs-windows.md

---
hidden: true
layout: post
title: Node.js on Windows
date: '2010-11-19T14:39:00-05:00'
tumblr_url: https://seanmonstar.com/post/1620411997/nodejs-windows
---
[Node.js on Windows](http://node-js.prcn.co.cc/)  

Still uses Cygwin, but now you don’t have to know about that. Simply unzip, and run `node.exe`.

---

## File: _posts/hidden/2010-11-24-android-killer-app.md

---
hidden: true
layout: post
title: The Interwebz is Android's Killer App
date: '2010-11-24T15:15:00-05:00'
tumblr_url: https://seanmonstar.com/post/1672129772/android-killer-app
---
[The Interwebz is Android's Killer App](http://daringfireball.net/2010/11/where_are_the_android_killer_apps)  

I agree with John that there aren’t any exclusive 3rd-party applications available on the Android that would make an iPhone owner jealous. I really wish more developers would create awesome apps for Android.

However, I think some of the things that would make an iPhone owner jealous are actually from Google[^1].

- The notification system is so much better than iPhone’s.
- The integration with cloud services kicks the crap out of MobileMe. And it’s free.
- Speaking of cloud services, I don’t have to plug in and sync my phone to a computer. It’s its own device. It syncs with the Interwebz. Magically. With pixie dust.
- Chrome to Phone is a great way of quickly moving your browser experience from your desktop to your mobile phone. Marked out a trip in Google Maps? Just Chrome to Phone it, and now you have the directions in the native Maps application, instead of emailing yourself a list of directions.
- When the web front for the Android Market launches, after browsing to an app you would like, you can click install, and instead of having to connect your phone to sync over the installed app, your phone will get a prompt through the Interwebz to download the app.



[^1]: John tries to disqualify that, saying it doesn’t provide proof of 3rd-party support. That’s true. But in the end, I care more about how much more the whole experience is, not just the 3rd-party experience.

---

## File: _posts/hidden/2010-11-25-currently-reading.md

---
hidden: true
layout: post
title: Currently Reading
date: '2010-11-25T14:00:07-05:00'
tumblr_url: https://seanmonstar.com/post/1682637199/currently-reading
---
[Currently Reading](http://reading.seanmonstar.com/)  

A site that aggregates my preferred reading, such as from my Google Reader shared items, or my Instapaper starred articles. See what I particularly enjoy reading.

---

## File: _posts/hidden/2010-11-30-24-ways-2010.md

---
hidden: true
layout: post
title: '24 ways: 2010'
date: '2010-11-30T20:41:50-05:00'
tumblr_url: https://seanmonstar.com/post/2054434699/24-ways-2010
---
[24 ways: 2010](http://24ways.org/2010)  

24ways starts up again this year. Leaves a nice treat in your RSS reader each morning.

---

## File: _posts/hidden/2010-11-30-dependency-injection.md

---
hidden: true
layout: post
title: What is Dependency Injection?
date: '2010-11-30T14:52:00-05:00'
tumblr_url: https://seanmonstar.com/post/2050960630/dependency-injection
---
[What is Dependency Injection?](http://fabien.potencier.org/article/11/what-is-dependency-injection)  

A 6-part series about Dependency Injection. A very valuable technique to allow for more class re-use, and better testing.

---

## File: _posts/hidden/2010-12-01-google-reader-for-android.md

---
hidden: true
layout: post
title: Google Reader for Android
date: '2010-12-01T17:27:34-05:00'
tumblr_url: https://seanmonstar.com/post/2063551998/google-reader-for-android
---
[Google Reader for Android](http://androidandme.com/2010/12/applications/native-google-reader-app-finally-comes-to-android/)  

Very nicely designed. Looks great, and behaves well too. It doesn’t have offline reading ability, but then, that’s what Instapaper is for.

---

## File: _posts/hidden/2010-12-02-pac-man-ghost-behavior.md

---
hidden: true
layout: post
title: Pac-Man Ghost Behavior
date: '2010-12-02T18:06:57-05:00'
tumblr_url: https://seanmonstar.com/post/2075102447/pac-man-ghost-behavior
---
[Pac-Man Ghost Behavior](http://gameinternals.com/post/2072558330/understanding-pac-man-ghost-behavior)  

A super interesting write-up from [Chad Birch](http://gameinternals.com/).

A hint: each ghost’s behavior makes much more sense in Japanese.

- Blinky - “chaser”
- Pinky - “ambusher”
- Inky - “whimsical”
- Clyde - “feigning ignorance”

---

## File: _posts/hidden/2010-12-07-nexus-s.md

---
hidden: true
layout: post
title: nexus s
date: '2010-12-07T21:37:57-05:00'
tumblr_url: https://seanmonstar.com/post/2138840235/nexus-s
---
   

The Nexus S. An upgraded version of [my phone](http://seanmonstar.com/blog/samsung-galaxy-vibrant-review/). I’m very curious about the contour display. And jealous of Gingerbread.

The video is very disorienting and terrible, however.

---

## File: _posts/hidden/2010-12-08-android-23-gingerbread.md

---
hidden: true
layout: post
title: Android 2.3 Gingerbread
date: '2010-12-08T20:07:06-05:00'
tumblr_url: https://seanmonstar.com/post/2148609168/android-23-gingerbread
---
[Android 2.3 Gingerbread](http://developer.android.com/sdk/android-2.3-highlights.html)  

A native copy/paste/selection implementation. Improved power management. Near field communication. Gyroscope API.

---

## File: _posts/hidden/2010-12-08-chrome-crankshaft.md

---
hidden: true
layout: post
title: Chrome Crankshaft
date: '2010-12-08T14:00:07-05:00'
tumblr_url: https://seanmonstar.com/post/2145192257/chrome-crankshaft
---
[Chrome Crankshaft](http://blog.chromium.org/2010/12/new-crankshaft-for-v8.html)  

Chrome’s JavaScript engine, V8, just got even faster:

> Overall, Crankshaft boosts V8’s performance by 50% on the V8 benchmark suite. This is the biggest performance improvement since we launched Chrome in 2008.

---

## File: _posts/hidden/2010-12-08-techcrunch-likes-nexus-s.md

---
hidden: true
layout: post
title: TechCrunch Likes Nexus S
date: '2010-12-08T17:01:06-05:00'
tumblr_url: https://seanmonstar.com/post/2146695232/techcrunch-likes-nexus-s
---
[TechCrunch Likes Nexus S](http://techcrunch.com/2010/12/06/google-nexus-s-review/)  

They like it:

> The bottom line is this. If you are an iPhone user this isn’t going to make you switch. If you’re an Android user you will want this phone more than any other. If you’re currently neither, we recommend that you go with the Nexus S. It is better than the iPhone in most ways.

---

## File: _posts/hidden/2010-12-09-a-table-that-should-exist-in-all-projects-with-a.md

---
hidden: true
layout: post
title: A table that should exist in all projects with a database
date: '2010-12-09T14:00:00-05:00'
tumblr_url: https://seanmonstar.com/post/2156394463/a-table-that-should-exist-in-all-projects-with-a
---
[A table that should exist in all projects with a database](http://blog.cherouvim.com/a-table-that-should-exist-in-all-projects-with-a-database/)  

    create table schema\_version ( `when` timestamp not null default CURRENT\_TIMESTAMP, `key` varchar(256) not null, `extra` varchar(256), primary key (`key`) )

---

## File: _posts/hidden/2010-12-13-tumblr-vs-wordpress.md

---
hidden: true
layout: post
title: tumblr vs wordpress
date: '2010-12-13T19:48:56-05:00'
tumblr_url: https://seanmonstar.com/post/2306245486/tumblr-vs-wordpress
---
   

I know tumblr has been increasingly flaky as of late. And there’s a lot of talk about hopping back onto Wordpress installations. The [quality of Wordpress’ code](http://twitter.com/#!/joestump/status/7466699872) aside, here’s is the **number one** reason I can never go back to Wordpress.

If I’m ever pushed to move, I’ll have to find or make my own installable blog software that has support for different posts types, but doesn’t have the terrible Wordpress clutter.

---

## File: _posts/hidden/2010-12-17-drakes-of-destiny.md

---
hidden: true
layout: post
title: 'Fixing Lag: Drakes of Destiny'
date: '2010-12-17T13:49:59-05:00'
tumblr_url: https://seanmonstar.com/post/2350296074/drakes-of-destiny
---
[Fixing Lag: Drakes of Destiny](http://www.eveonline.com/devblog.asp?a=blog&bid=828)  

I recently found the [Eve Online developer blog](http://www.eveonline.com/devblog.asp), and find it _super_ interesting.

This [series](http://www.eveonline.com/devblog.asp) of articles is about them dealing with the massive load they have to handle in huge fleet battles. Some pretty graphs, and some algorithm analysis. Oh, and they use Python!

---

## File: _posts/hidden/2010-12-21-android-doesnt-need-the-best-ui.md

---
hidden: true
layout: post
title: Android doesn't need the best UI
date: '2010-12-21T20:16:41-05:00'
tumblr_url: https://seanmonstar.com/post/2409220229/android-doesnt-need-the-best-ui
---
[Android doesn't need the best UI](http://www.marco.org/2402097858)  

People make statements like this all the time and assume that’s the end of the argument right there:

> [Android is] never going to be Apple-like in user experience, polish, or design.

I agree that the iPhone is a great product. However, I can also conclude that Android phones are great as well. There are pros and cons to both devices[^1]. Yes, generally, the Apple UI is more pleasing to the eye. I wouldn’t say [it’s clearly more intuitive though](http://scripting.com/stories/2010/08/23/whereIsTheIphone4Spacebar.html).

Regarding the UI: not everyone cares about how perfect the UI is. Sure, designers will care. Even people who are more educated about the design can care. But plenty others won’t care. People I know who don’t care: me, my wife, my parents, my in-laws, my brother, some of my co-workers. Some of us like Android’s pros more than the iPhone’s. Others don’t care either way.

There are some things I don’t think Google will do better than Apple. That’s ok. It doesn’t make either the absolute best, but depending on your tastes, one or the other might be better _for you_.



[^1]: This is also why I try to completely ignore the “score” that video game blogs try to give to games. What they feel makes a great game isn’t necessarily what I feel does. I try to read the reasons why they think its good and bad, and then I can make the choice when they say something like: “the gameplay is really fun and unique, but the ladder climbing animation is just ridiculous. In this day and age, I can’t give it more than a 5/10.” Hey, that’s fine. I’ll go enjoy the gameplay, and you can ignore it for it’s funny yet rarely seen animation.

---

## File: _posts/hidden/2010-12-21-gingerbread-keyboard-without-rooting.md

---
hidden: true
layout: post
title: Gingerbread Keyboard without Rooting
date: '2010-12-21T19:38:07-05:00'
tumblr_url: https://seanmonstar.com/post/2408809047/gingerbread-keyboard-without-rooting
---
[Gingerbread Keyboard without Rooting](http://forum.xda-developers.com/showthread.php?t=875202)  

The wonderful developers at XDA have packaged the Gingerbread keyboard into an APK that you can download on any phone running 2.1 or higher.

---

## File: _posts/hidden/2011-01-04-android-gpu.md

---
hidden: true
layout: post
title: The Care and Feeding of the Android GPU
date: '2011-01-04T12:17:13-05:00'
tumblr_url: https://seanmonstar.com/post/2597051626/android-gpu
---
[The Care and Feeding of the Android GPU](http://www.satine.org/archives/2011/01/01/the-care-and-feeding-of-the-android-gpu/)  

Charles Ying:

> Android’s UX architecture needs work. UI compositing and the view system are both primarily done in software. Garbage collection and async operations frequently block UI rendering.

As much as I like Android, this is definitely a low point. It gets rather frustrating when an app doesn’t respond because of some blocking URL request, or a huge amount of garbage collection is happening. I _always_ want the phone to respond to my touch, at the very least.

---

## File: _posts/hidden/2011-01-06-honeycomb-video.md

---
hidden: true
layout: post
title: Honeycomb Video
date: '2011-01-06T21:08:36-05:00'
tumblr_url: https://seanmonstar.com/post/2630783018/honeycomb-video
---
[Honeycomb Video](http://googlemobile.blogspot.com/2011/01/sneak-peak-of-android-30-honeycomb.html)  

Looks really cool. Though, it also looks surprisingly _un-Android_.

---

## File: _posts/hidden/2011-01-12-tweet-nest.md

---
hidden: true
layout: post
title: Tweet Nest
date: '2011-01-12T14:00:08-05:00'
tumblr_url: https://seanmonstar.com/post/2716099805/tweet-nest
---
[Tweet Nest](http://pongsocket.com/tweetnest/)  

Really neat looking app to keep a viewable, searchable, and customizable archive of all your tweets. Since, you know, Twitter ditches all old tweets. Personally, I’ve setup a tumblr account to pull in all [my tweets](http://tweets.seanmonstar.com), but this definitely looks and functions better. It just costs having your own server.

---

## File: _posts/hidden/2011-01-13-h264-and-chrome.md

---
hidden: true
layout: post
title: H.264 and Chrome
date: '2011-01-13T14:15:00-05:00'
tumblr_url: https://seanmonstar.com/post/2731793881/h264-and-chrome
---
[H.264 and Chrome](http://blog.chromium.org/2011/01/html-video-codec-support-in-chrome.html)  

Google is trying to force everyone off of closed codecs like H.264 and use open codecs, like WebM. Other companies have tried to force away bad technologies, and while they were hated at first, eventually everyone realized it was a good move.

What’s surprising (perhaps it shouldn’t be), is that one of the companies to have done this previously is Apple, and yet, much of the Apple crowd have grabbed their pitchforks. It seems to me, that just like Apple, the company, those Apple fans care less about open standards, and more about Apple’s standards.[^1]

## Update

Regarding why Google isn’t doing the same for Flash: Chrome bundles Flash for security reasons. Most people would download Flash anyways, but they likely wouldn’t bother to keep it up to date. That means their web experience would be riskier.

HTML5 video is still very new, so it’s still pretty easy to mold the direction it is going. Besides mobile devices, most web users don’t see an HTML5 video player. At this point, it makes more sense to ask, “Apple, why do I need an extra encoded version just for you?”



[^1]: That WebM doesn’t have hardware decoders right now does suck, but with a higher need, it is irrational to think they won’t be made.

---

## File: _posts/hidden/2011-01-13-the-open-internet.md

---
hidden: true
layout: post
title: The Open Internet
date: '2011-01-13T17:03:06-05:00'
tumblr_url: https://seanmonstar.com/post/2733954130/the-open-internet
---
[The Open Internet](http://www.theopeninter.net/)  

Beautiful, fun site. Plus, it shows why net neutrality is so important, in a way **normal** people can understand.

---

## File: _posts/hidden/2011-01-18-galaxy-s-2-2.md

---
hidden: true
layout: post
title: Why U.S. Galaxy S Phones run Android 2.1 Still
date: '2011-01-18T16:58:36-05:00'
tumblr_url: https://seanmonstar.com/post/2816382207/galaxy-s-2-2
---
[Why U.S. Galaxy S Phones run Android 2.1 Still](http://forum.xda-developers.com/showthread.php?t=913045)  

Another reason why these hardware companies shouldn’t be allowed to be involved with software:

> Most U.S. carriers aren’t very happy with Samsung’s decision to charge for Android updates as feature updates, especially since they are essentially charging for the Android Open Source Project’s efforts, and the effort on Samsung’s end is rather minimal.

---

## File: _posts/hidden/2011-01-20-hypothetical-tumblr-pro.md

---
hidden: true
layout: post
title: Hypothetical Tumblr Pro
date: '2011-01-20T18:21:53-05:00'
tumblr_url: https://seanmonstar.com/post/2848053401/hypothetical-tumblr-pro
---
[Hypothetical Tumblr Pro](http://modernerd.com/post/2812040784/doing-it-for-a-living)  

Nick Cernis:

> Imagine a web publishing platform that costs $10 per month.
> 
> $5 of that $10 goes to the platform company for the boring stuff.
> 
> The other $5 gets split evenly between the writers, photographers, videographers, designers, and other creative people you follow who also pay to use the platform, up to a maximum of — say — 20 followers, hand-picked by you.

I love it. I couldn’t pay $10 a month for every blog I enjoy. But I could pay that to _read blogs_, period. The people who are good would make fair money.

I’d make $1.33 a month.

---

## File: _posts/hidden/2011-01-21-umlaut-app.md

---
hidden: true
layout: post
title: umlaut app
date: '2011-01-21T15:45:00-05:00'
tumblr_url: https://seanmonstar.com/post/2860790547/umlaut-app
---
   

Umlaut is a beautiful notes app for Android. If it synced with Simplenote, it would instantly replace AndroNoter.

---

## File: _posts/hidden/2011-01-26-honeycomb.md

---
hidden: true
layout: post
title: Android 3.0 Platform Highlights
date: '2011-01-26T21:04:41-05:00'
tumblr_url: https://seanmonstar.com/post/2950421756/honeycomb
---
[Android 3.0 Platform Highlights](http://developer.android.com/sdk/android-3.0-highlights.html)  

It seems like we just had the 2.3 highlights, but I won’t complain about 3.0 coming quickly behind it.

I’m kind of torn with the new UI. Some parts of it look really stylish, like the email message view, or the contacts view. Yet, I feel other parts really clash with the metro-esque look. The whole bottom bar of buttons and the time look terrible. I’m also really not feeling the background they chose. It looks futuristic or Tron-like, but other parts of the UI look more minimalist.

On the major plus side, it will only take one line of code for developers to turn on hardware accelerated graphics for their entire application. The multi-core stuff looks promising as well.

---

## File: _posts/hidden/2011-02-04-honeycomb-xoom.md

---
hidden: true
layout: post
title: Honeycomb Xoom
date: '2011-02-04T20:43:22-05:00'
tumblr_url: https://seanmonstar.com/post/3114404672/honeycomb-xoom
---
[Honeycomb Xoom](http://techcrunch.com/2011/02/02/android-honeycomb-ipad/)  

This very well might be the tablet I go pick up. Assuming it has a WiFi only model. Very impressed.

---

## File: _posts/hidden/2011-02-15-apples-subscription-extortion.md

---
hidden: true
layout: post
title: Apple’s Subscription Extortion
date: '2011-02-15T16:04:24-05:00'
tumblr_url: https://seanmonstar.com/post/3313922968/apples-subscription-extortion
---
[Apple’s Subscription Extortion](http://thinkvitamin.com/web-industry/why-you-should-fight-apples-subscription-extortion/)  

Much evil has been done in the name of business. Here’s some more from Apple (surprise, surprise):

> A lot of apps aimed at the web community will fall into this camp – not big enough to be featured by the App Store because the niche is too small. Therefore there is no extra marketing value from being in the App Store and forking over the extra 30% to Apple.

For instance, in a personal web app of mine, when I start to offer pro accounts, and I wanted to have an iPhone app, I would _have_ to let Apple take 30% of my subscription. Even though the use of the iPhone app would be minor compared to that customer coming to the actual website. No, Apple, you don’t get 30% of my hardwork. Instead, Apple just gets less apps in its App Store.

Commenter farra puts it:

> Apple only hosts the app code, they don’t host all your backend services, or pay the bandwidth for the delivery of in-app media. This is a 30% payment processing fee, which is hugely out of line in the larger market.

I wonder what happens to 3rd party apps that tie into subscription-based web apps, like Campfire.

---

## File: _posts/hidden/2011-02-25-apples-30.md

---
hidden: true
layout: post
title: Apple Wants 30% of Your Hosting Cost
date: '2011-02-25T14:00:00-05:00'
tumblr_url: https://seanmonstar.com/post/3506479113/apples-30
---
Many people seem to [feel like this](http://brooksreview.net/2011/02/subscriptions-mg/):

> I am tired of hearing non-developers whine about this move. The bottom line is that this is the best possible move consumers of iOS devices could have hoped for. […] Yes, this gives developers the shaft.

This coming from a non-developer. I think those people in favor of the new model only care that it’s easier for them to subscribe in-app. Considering that the reason people like the iOS platform is because of all the 3rd party apps, “giving the developers the shaft” is not exactly intelligent.

As [Kyle Baxter puts it](http://www.tightwind.net/2011/02/gruber-apple-doesnt-need-readability-yes-they-do/):

> Gruber’s position is that Apple shouldn’t care, because they don’t “need” Readability. But they most assuredly do, in the aggregate; Apple needs Readability, and Pandora, and Netflix, and Instpaper, and Rdio, and all other businesses put in a precarious position by Apple’s new rules.

What many of those in favor of the policy aren’t keeping in mind is that the subscription is to pay for the entire service. For many software-as-a-service companies, the iPhone app is just a small part in their overall offering. I’m not talking about iOS-only apps. I mean applications that are merely a native client to viewing a larger web app. It costs a lot to offer all the programming, design, customer support, and hosting that they provide. Taking 30 percent for the lifetime of the customer is just greed. It’s not like it’s free to develop an iOS application, anyways. There’s already an Apple tax just to begin. You have to own an Apple computer, an iOS device to test on, and pay a yearly $100 just to be a developer.

What this policy ends up meaning to small independent developers, such as for my own project: Much of the cost is in my development time, and then the server hosting. And my application doesn’t even provide my own content, its a way to view others’ content. It’s biggest use case (in my mind) is the website. I would only consider offering an iPhone application as a nicety to iPhone owners. Since my pricing would be fair, I can’t imagine offering the services of my application for only 70% the price. In return, all Apple will have given me is a credit card processed.

With that kind of one-sided deal, I’m left with simply providing an optimized mobile site. As will many other developers. Then, iOS no longer has a bunch of exclusive content apps; they have a bunch of apps that are equally available on all modern mobile devices. What’s more, the experience will likely be _better_ on Android and Windows Phone 7, since we can still provide native clients without being robbed.

No, I don’t need Apple. Apple needs all the developers like me.

---

## File: _posts/hidden/2011-03-02-node.md

---
hidden: true
layout: post
title: no.de
date: '2011-03-02T20:46:53-05:00'
tumblr_url: https://seanmonstar.com/post/3611469807/node
---
[no.de](https://no.de/)  

I love me some Python, but it’s also very tempting to be able to write JavaScript on both sides of the application. And for now, it’s free!

---

## File: _posts/hidden/2011-03-03-nexus-s-text-selection-sounds-familiar.md

---
hidden: true
layout: post
title: Nexus S Text Selection Sounds Familiar
date: '2011-03-03T14:00:08-05:00'
tumblr_url: https://seanmonstar.com/post/3623295995/nexus-s-text-selection-sounds-familiar
---
[Nexus S Text Selection Sounds Familiar](http://releasecandidateone.com/233:sounds_familiar)  

Chris Clark, giving an iPhone owners’ fairer opinion on Gruber’s Android gripe:

> Be that as it may, consistency of text selection—or just lack of small infuriating inconsistencies—isn’t something it can brag about.

---

## File: _posts/hidden/2011-03-11-shawn-blanc-on-notifications.md

---
hidden: true
layout: post
title: Shawn Blanc on Notifications
date: '2011-03-11T19:47:05-05:00'
tumblr_url: https://seanmonstar.com/post/3794876449/shawn-blanc-on-notifications
---
[Shawn Blanc on Notifications](http://shawnblanc.net/2011/03/ben-brooks-ios-notifications/)  

As we get more and more devices in our lives, we need more and more syncing going on between them. Shawn illustrates an very common issue when apps want to notify us:

> iCal alarms that go off on my iPad, iPhone, and Mac at the same time. I can think of two ways to fix this: (a) the devices know when they are on the same Wi-Fi network and then just one device displays the alarm; or (b) give me the option to set a default device that is the only one that ever displays the alarm.

Some of Google’s apps on Android are smart enough to do this. If I get email, I can see the notification on both my phone and in my web browser. If I deal with the email in my browser, the Gmail on Android is smart enough to remove the notification from my phone a few seconds later. Gtalk also will alert both places of incoming chats, but once you start using one, it stops pestering the other device.

This is what I think all apps should start doing. They should keep track of what device I’m currently using, and make smart decisions about that. Take Twitter: when I’m looking at the website, I’ve obviously seen a bunch of tweets recently. Currently when I pick up my phone, it still thinks I haven’t seen a bunch of @replies.

---

## File: _posts/hidden/2011-03-21-amazon-lendle-api.md

---
hidden: true
layout: post
title: Amazon revokes Lendle's API access
date: '2011-03-21T22:30:58-04:00'
tumblr_url: https://seanmonstar.com/post/4015727130/amazon-lendle-api
---
[Amazon revokes Lendle's API access](http://lendle.me/amazon-api-revocation/)  

Not very well thought out, Amazon.

My wife has found books she never would have normally tried since the risk was removed by borrowing it. Then, since she can only borrow so many books through Lendle anyways, she went and bought most of the rest of that author’s books. Publishers/authors who don’t see the value in that are truly missing it.

---

## File: _posts/hidden/2011-03-22-what-makes-a-great-tech-writer.md

---
hidden: true
layout: post
title: What Makes a Great Tech Writer
date: '2011-03-22T17:00:07-04:00'
tumblr_url: https://seanmonstar.com/post/4029850268/what-makes-a-great-tech-writer
---
[What Makes a Great Tech Writer](http://shawnblanc.net/2011/03/great-tech-writing/)  

Shawn Blanc:

> By making an intentional decision to not pursue a real-time schedule with my site it allows me the space to think and breathe and therefore write things which are more thought related than they are time-sensitive.

It’s why I’m subscribed to far more feeds where the author write longer opinion pieces, despite likely being irregular. I value well crafted opinion over breaking news. I only need the new “broken” once. In my experience, if it’s important, I’ll hear about it somewhere soon enough. If it’s not, I didn’t need to know about it anyways.

My regularity has greatly dropped since changing jobs, but I as it ebbs and flows, I’d rather write the same way. Hopefully, you come here for my opinion. The news is elsewhere.

---

## File: _posts/hidden/2011-03-23-contextless-twitter-search.md

---
hidden: true
layout: post
title: Contextless Twitter Search
date: '2011-03-23T21:35:12-04:00'
tumblr_url: https://seanmonstar.com/post/4054494468/contextless-twitter-search
---
[Marco outlines what’s so terrible about the Quick Bar](http://www.marco.org/3991237704) in the Twitter for iPhone app, but it sounds more like a fair assessment of Twitter’s trending topics feature in general. The trending topics are simply words that Twitter has noticed are having an increased appearance in a short time period. Once in a good long while, when control of my wandering eyes is slacking, I see something that catches my attention in the trending topics. I click on it, curious about what all the ruckus is about. Since this ships me off to a global twitter search of the topic, I immediately scold myself and my wandering eyes. You failed me!

## Twitter Search

The issue with Twitter search is that it is currently a real-time global shotgun of tweets; something I have never found useful. Most tweets are useless garbage, even tweets that I allow into my timeline. The reason I read them is for their context: I have similar interests to the people I follow, and so their short 140-character jabs make sense and sometimes even connect with _me_, my being. I have educated myself on many of these people, and therefore have come to enjoy seeing their tweets. When I search on Twitter, I never know any of the people whose tweets I’m barraged with, at a real time pace that no human could possibly keep up with.

Twitter search would be useful if it searched using the context of who I follow[^1]. Only search the tweets of those “trusted” sources, and perhaps the tweets that they’ve retweeted, replied to, or maybe even favorited. These are tweets that I would care about, because if it’s information I’m after, I trust those sources to have spoken about the topic in the context of my interests. If it’s an opinion I’m after, I only want opinions of people whom I understand and can appreciate.

Google’s first attempt at using the social network’s data was with a super up-to-date widget of tweets that contained the same keywords as what you had searched Google for. Needless to say, they were a net negative, since all it served to do was frustrate and take up space in Google’s SERPs.

Google has recently started inserting web pages into the search results if that page has been tweeted by someone I follow. That is putting the context of people I vaguely know and trust, into my search results. That is something I can’t praise enough. @twitter: see @google.

## Trending topics

In order for trending topics to mean anything to me, they would need to be given context, just like search should. Trending topics could be formed around all the activity of people I follow, plus the people they follow, just to get a bit more data for trending topics. For instance, log in to Twitter in the morning, and oh!, look-y there. In trending topics is how [Amazon shot Lendle in the face](http://seanmonstar.com/blog/amazon-lendle-api/). I would find value in that.

As it is, Twitter assumes I care what the the rest of Twitter has to say. I don’t. If I did, I would follow them.



[^1]: Twitter can keep its global search functionality under its Advanced search. I can see some uses, like when companies want to keep tabs on what anyone on Twitter is saying about them. It shouldn’t be the default, though.

---

## File: _posts/hidden/2011-03-29-js-dictionary-trie.md

---
hidden: true
layout: post
title: Dictionary Performance, Tries, Oh My
date: '2011-03-29T16:18:35-04:00'
tumblr_url: https://seanmonstar.com/post/4190389669/js-dictionary-trie
---
[Dictionary Performance, Tries, Oh My](http://ejohn.org/blog/revised-javascript-dictionary-search/)  

This [kind](http://ejohn.org/blog/dictionary-lookups-in-javascript/) of [stuff](http://ejohn.org/blog/javascript-trie-performance-analysis/) is far more interesting as a programmer than handling click events to fade in an element. In JavaScript, no less.

---

## File: _posts/hidden/2011-04-29-samsung-galaxy-s-ii.md

---
hidden: true
layout: post
title: Samsung Galaxy S II
date: '2011-04-29T15:26:23-04:00'
tumblr_url: https://seanmonstar.com/post/5047378245/samsung-galaxy-s-ii
---
[Samsung Galaxy S II](http://www.engadget.com/2011/04/28/samsung-galaxy-s-ii-review/)  

Engadget:

> Nonetheless, if you’re asking us what smartphone to buy today, unconstrained by such externalities, the Galaxy S II would be the clear choice. Sometimes it’s just as simple as that.

My phone 1up-ed.

---

## File: _posts/hidden/2011-05-13-in-app-purchasing-patents.md

---
hidden: true
layout: post
title: In-App Purchasing Patents
date: '2011-05-13T18:29:36-04:00'
tumblr_url: https://seanmonstar.com/post/5461223494/in-app-purchasing-patents
---
[In-App Purchasing Patents](http://gigaom.com/apple/indie-devs-get-hit-with-lawsuit-threats-over-in-app-purchases/)  

GigaOm:

> The threats accuse devs of patent infringement regarding Apple’s in-app purchase mechanism, but the patent holder appears to be targeting independent developers individually instead of going after Apple itself.

An example of capitalism, where man exploits man as hard as he can.

---

## File: _posts/hidden/2011-05-13-why-the-new-guy-cant-code.md

---
hidden: true
layout: post
title: "…I can guarantee you, without fear of contradiction, that no software engineer
  will ever have to write a binary search after they are hired. It’s like choosing
  a contractor because they know how to forge and cast steel using coal, iron, an
  oven and a bellows, when they actually need to know a) the address of the nearest
  Home Depot b) what to do with the steel once they buy it."
date: '2011-05-13T19:12:38-04:00'
tumblr_url: https://seanmonstar.com/post/5462424945/why-the-new-guy-cant-code
---
> …I can guarantee you, without fear of contradiction, that no software engineer will ever have to write a binary search after they are hired. It’s like choosing a contractor because they know how to forge and cast steel using coal, iron, an oven and a bellows, when they actually need to know a) the address of the nearest Home Depot b) what to do with the steel once they buy it.

—Jon Evans,&nbsp;[Why The New Guy Can’t Code](http://techcrunch.com/2011/05/07/why-the-new-guy-cant-code/)

---

## File: _posts/hidden/2011-05-14-chromebook.md

---
hidden: true
layout: post
title: Chromebook
date: '2011-05-14T17:01:00-04:00'
tumblr_url: https://seanmonstar.com/post/5491265296/chromebook
---
[Chromebook](http://www.google.com/chromebook/#chromebooks)  

I’ve got two Cr-48’s, and I [love](http://seanmonstar.com/blog/chrome-os-for-personal-use/) them[^1]. However, I would never spend $500 on one. It’s still just a browser. I can spend $500 on a Windows laptop, and get Chrome, _plus_ a bunch of other software.



[^1]: I must have special touchpads, cause mine work brilliantly.

---

## File: _posts/hidden/2011-05-16-androids-arrival.md

---
hidden: true
layout: post
title: Android’s Arrival
date: '2011-05-16T13:02:06-04:00'
tumblr_url: https://seanmonstar.com/post/5547696219/androids-arrival
---
[Android’s Arrival](http://carpeaqua.com/2011/05/12/androids-arrival/)  

Justin Williams:

> Maybe [Google] realizes that they now have a platform that can stand toe to toe with Apple in a variety of categories. Android isn’t as simple to use and not as elegant, but it’s powerful, functional and has a rabid fan base.

I can admit that iOS is more elegant. Thing is, I’m all about function before form. Frankly, my Android can just plain do more. Other’s are noticing, and Android is growing. Calling it ugly won’t stop that.

---

## File: _posts/hidden/2011-05-16-lunch.md

---
hidden: true
layout: post
title: Lunch
date: '2011-05-16T15:32:06-04:00'
tumblr_url: https://seanmonstar.com/post/5551224966/lunch
---
[Lunch](http://www.joelonsoftware.com/items/2011/04/28.html)  

Joel Spolsky:

> The importance of eating together with your co-workers is not negotiable, to me.

Working from home, eating lunch with my wife every day is a perk of the job. However, I do value being able to eat with my team when I fly up to Mountain View. I get to argue out my ideas that are too nerdy/technical for my wife. Some decent ideas come from that arguing.

---

## File: _posts/hidden/2011-05-19-qx410-gpu-off.md

---
hidden: true
layout: post
title: Turn off GPU on QX410
date: '2011-05-19T17:01:05-04:00'
tumblr_url: https://seanmonstar.com/post/5646710963/qx410-gpu-off
---
[Turn off GPU on QX410](https://github.com/mkottman/acpi_call)  

I use a [Samsung QX410 laptop](http://www.amazon.com/dp/B004B57XTG/?tag=seanmonstar-20) when I travel, and when I want to stand while working at my counter. Since it’s mostly for development, I run Ubuntu on it.

Sucky thing is, the hybrid Optimus card has no support or love from nVidia on Linux. Since we can’t use the thing anyways, this command let’s you turn it off, giving you an extra 2-3 hours of battery life. Score.

---

## File: _posts/hidden/2011-05-19-termkit.md

---
hidden: true
layout: post
title: termkit
date: '2011-05-19T14:00:00-04:00'
tumblr_url: https://seanmonstar.com/post/5642032753/termkit
---
   

Steven Wittens:

> It’s 2011, and monospace text just doesn’t cut it anymore.

TermKit. It’s a web[kit] app. Written in node.js. Would be more impressive if it could run in any distro of \*nix.

---

## File: _posts/hidden/2011-05-26-google-wallet.md

---
hidden: true
layout: post
title: Google Wallet
date: '2011-05-26T14:30:51-04:00'
tumblr_url: https://seanmonstar.com/post/5870778757/google-wallet
---
[Google Wallet](http://www.google.com/wallet/)  

[Me, 18 months ago](http://seanmonstar.com/blog/tablets-will-replace-everything/):

> As money: Paper money and even credit cards can be a hassle. Credit cards especially suck at letting us split the bill at a restaurant with 20 people. It’d be to everyone’s advantage if a vendor could broadcast a bill (or a money request), and we could accept on our device. Or if a friend needs to borrow a couple hundred or a thousand dollars. Sure, here you go [press button]. It will happen.

It _is_ happening.

---

## File: _posts/hidden/2011-06-02-windows-8-preview.md

---
hidden: true
layout: post
title: Windows 8 Preview
date: '2011-06-02T12:57:34-04:00'
tumblr_url: https://seanmonstar.com/post/6110940929/windows-8-preview
---
[Windows 8 Preview](http://www.youtube.com/watch?v=p92QfWOw88I)  

This looks like an impressive OS for a Windows tablet, and will feel comfortable to people used to the Windows Phone 7. But, I’m very skeptical as to how well this would replace my current Windows 7 desktop.

---

## File: _posts/hidden/2011-06-09-apple-chicken.md

---
hidden: true
layout: post
title: Apple's Game of Chicken
date: '2011-06-09T14:55:13-04:00'
tumblr_url: https://seanmonstar.com/post/6359548618/apple-chicken
---
[Apple's Game of Chicken](http://www.macrumors.com/2011/06/09/apple-reverses-course-on-in-app-subscriptions/)  

Many cheer that Apple finally accepted common sense. What really happened was that Apple lost it’s game of chicken versus Amazon, Netflix, et al.

The people who lost the game were those smaller companies who believed Apple wouldn’t step down. They closed shop, or complied with Apple’s demands, even though Apple didn’t mean to carry through (as long as it’s big 3rd-party friends didn’t give in).

---

## File: _posts/hidden/2011-06-17-for-every-new-feature-we-add-we-take-an-old-one.md

---
hidden: true
layout: post
title: For every new feature we add, we take an old one out. A lot of big sites don’t
  do that, and it’s a problem. Twitter started as a beautifully simple product, but
  it’s now going the same route as Facebook. The drive to innovate can overencumber
  and destroy a product.
date: '2011-06-17T02:19:18-04:00'
tumblr_url: https://seanmonstar.com/post/6614244577/for-every-new-feature-we-add-we-take-an-old-one
---
> For every new feature we add, we take an old one out. A lot of big sites don’t do that, and it’s a problem. Twitter started as a beautifully simple product, but it’s now going the same route as Facebook. The drive to innovate can overencumber and destroy a product.

—David Karp, about Tumblr

---

## File: _posts/hidden/2011-06-29-ios5-copies-android.md

---
hidden: true
layout: post
title: Copy Me, and I'll Sue!
date: '2011-06-29T19:01:06-04:00'
tumblr_url: https://seanmonstar.com/post/7060135942/ios5-copies-android
---
[Copy Me, and I'll Sue!](http://smokingapples.com/opinion/my-thoughts-on-the-whole-ios-5-copying-android-situation/)  

Apple has several [lawsuits against](http://allthingsd.com/20110418/apple-files-patent-suit-against-samsung-over-galaxy-line-of-phones-and-tablets/) [manufacturers](http://seanmonstar.com/blog/apple-sues-htc-again-over-new-sense-ui-features/) of Android phones, essentially saying they copied the iPhone and iOS.

Then, when Apple does the copying, Apple fanatics argue “well yea, how else would Apple have made notifications?”

> Android had pretty much perfected the notification system. So if Apple had to create a perfect notifications system it was going to be difficult for them to not make it look like the one on Android.

I don’t really care when people copy good ideas. I think that copying good ideas is better for consumers. It’d just be nice for people to notice the hypocrisy around this.

---

## File: _posts/hidden/2011-06-30-battleheart-on-android.md

---
hidden: true
layout: post
title: Battleheart on Android
date: '2011-06-30T15:01:06-04:00'
tumblr_url: https://seanmonstar.com/post/7089665718/battleheart-on-android
---
[Battleheart on Android](http://mikamobile.blogspot.com/2011/06/android.html)  

An excellent, fair look at selling a popular app on the Android Market, from someone who has had the same app in the iOS app store. The Android version is currently selling about 80% of what its selling on iOS, which shows the Market definitely supports selling _quality_ apps.

And [Battleheart](https://market.android.com/details?id=com.KelliNoda.Battleheart) is definitely quality.

---

## File: _posts/hidden/2011-07-12-on-competing-with-circles.md

---
hidden: true
layout: post
title: On Competing with Circles
date: '2011-07-12T07:34:28-04:00'
tumblr_url: https://seanmonstar.com/post/7530246913/on-competing-with-circles
---
[On Competing with Circles](http://rethrick.com/#google-plus)  

Dhanji R. Prasanna, former Google+ engineer:

> Now, I’m not saying that Circles is the one killer feature to bring down facebook — not at all. What I am saying, however, is that [Google+ and facebook] are not playing on an even field. Like Microsoft and online Office, it is incredibly difficult for facebook to make fundamental changes to their product suite to answer competitive threats. It is for this reason I feel that Google+ has a genuine shot at dethroning facebook.

Facebook’s answer was Groups, but its a tiny hidden feature, and the default way of sharing with Facebook is still to share with your entire friend list.

---

## File: _posts/hidden/2011-07-13-plus.md

---
hidden: true
layout: post
title: seanmonstar.com/+
date: '2011-07-13T08:14:57-04:00'
tumblr_url: https://seanmonstar.com/post/7570713271/plus
---
[seanmonstar.com/+](http://seanmonstar.com/+)  

[nikf](http://nikf.org/post/7538019123):

> So Richard pointed out [this excellent post](https://plus.google.com/u/0/114592751246503219483/posts/5Zs1CwVhh4g) about using HTACCESS files on a server to redirect domain.com/+ to your Google+ account. In his post, he lamented the inability to do is with his domain as it’s hosted on Tumblr, just like this blog is.
> 
> However, with Tumblr you **can** actually hook this…

---

## File: _posts/hidden/2011-07-15-git-achievements.md

---
hidden: true
layout: post
title: Git Achievements
date: '2011-07-15T14:09:32-04:00'
tumblr_url: https://seanmonstar.com/post/7657325842/git-achievements
---
[Git Achievements](https://github.com/icefox/git-achievements)  

This is brilliant. You can just be hacking away as usual, decide to rebase your work, and then: “Achievement unlocked! Butcher”.

---

## File: _posts/hidden/2011-07-20-android-market-refresh.md

---
hidden: true
layout: post
title: Android Market Refresh
date: '2011-07-20T15:00:05-04:00'
tumblr_url: https://seanmonstar.com/post/7852433728/android-market-refresh
---
[Android Market Refresh](http://www.youtube.com/watch?v=5Pbo-d62ivY)  

Finally, a design for the Market that I think looks great. Reminds me of Gingerbread’s theme.

---

## File: _posts/hidden/2011-07-27-google-real-names.md

---
hidden: true
layout: post
title: Google+ Wants Real Names
date: '2011-07-27T19:25:06-04:00'
tumblr_url: https://seanmonstar.com/post/8147186636/google-real-names
---
[Google+ Wants Real Names](http://scripting.com/stories/2011/07/25/whyGoogleCaresIfYouUseYour.html)  

Dave Winer’s take:

> There’s a very simple business reason why Google cares if they have your real name. It means it’s possible to cross-relate your account with your buying behavior with their partners, who might be banks, retailers, supermarkets, hospitals, airlines. To connect with your use of cell phones that might be running their mobile operating system. To provide identity in a commerce-ready way. And to give them information about what you do on the Internet, without obfuscation of pseudonyms.
> 
> Simply put, a real name is worth more than a fake one.

I don’t see the conspiracy theory others seem to see. I see a decision made by people involved in a project who wanted the project work a certain way.[^1] I’d rather see people’s real names. I prefer real names on Twitter, also.

Then again, I’ve disagreed with much of what Dave suggests recently.



[^1]: I might be naive. Where I’ve worked, we just kick around ideas about how to make the product the best.