Laws of Repulsion: Building a herding dog game

My latest project has been the basic game mechanics for herding humans with a dog. Why herd humans with a dog? You'll find out if I ever finish this game. I don't want to spoil it in advance.

Screen_Shot_2017-11-15_at_10_07_56_PM.png

My partner and I started this project earlier this year. In one short pair programming session, we built a dog (a box with a nose) that would animate to wherever you clicked or tapped on the screen.

My goal has been to get a simple version of the game play working that I can evaluate whether it's fun to herd humans with a dog and thus whether the rest of the game is worth building.

It's simple, right?

Here are the basic steps:
1. Draw a human (another box with a nose).
2. Tell the human to walk in a straight line.
3. Tell the human to turn 30 degrees when the human is within 10 pixels of the dog (a single corner of the dog, not anywhere on a rectangle, to keep things simple).

Then stop at this point because so far this sucks. The human spins like crazy when the dog is nearby because the human spins faster than it can move away from the dog.

[Sorry, I don't have a video of this. I must've deleted the code before I got too dizzy.]

Side tangent about the programming I'm learning

Despite the stupid spinning human, I'm happy because I'd learned how to use threading macros in clojure and was getting familiar with them. 

A threading macro is a nicer way to write out a set of nested instructions. Here's a familiar example from math: ((3 * 2) + 1) is one math expression nested inside another. You start with evaluating (3 * 2) and then you take the result and add it to 1.

A threading macro writes this in the order it will be evaluated:
-> (3 * 2)
(+ 1)

At first, I couldn't see how these chained together or the order of the arguments. Is it ((3 * 2) + 1) or (1 + (3 * 2))? There is a rule that determines this and you just have to learn it. Not so bad. Very useful.

[If you're interested in clojure, you can read about it in this article about threading macros. I didn't show clojure code here because I think it would confuse most people I know -- standard math notation is more familiar.]

Building a grid

I was a bit stumped about the spinning human. 

I needed a system that would give the human a new direction only once, not repeatedly. I was stuck trying to imagine how to do this with the proximity check I was already using.

My partner suggested that I build a grid system. So I thought about it for a bit and it began to appeal to me. I did a little reading about grids from Amit Patel. (Someday I want to try a hex grid. Amit has great tutorials about building these.)

Since I'm working with a web browser, I'm already using the pixel grid. But it's been difficult because my characters are larger than a pixel; so which of its many pixels defines a character's location? Keeping track of those pixels gets complicated.

By building my own grid, I can group the pixels together, say in 40px by 40px boxes, and my characters can be located *within* the box. Now, the location of my human is simply a pair of coordinates on the grid (similar to the x,y coordinates of graphing equations). It's much simpler.

Screen Shot 2017-11-12 at 9.51.10 AM.png

Having a visible grid made it easier for me to debug because I could see when things weren't lined up right.

Moving on a grid and sensing walls and the dog

Once I had the human and dog on the grid, I wanted the human to move about the grid without input from me. 

First, I had the human move straight down the grid and stop when it reached the walls, the edges of the grid.

Then I added a check for the dog. If the dog was in the way, the human would stop.

Just moving straight down the screen is quite boring but it's a necessary step towards something more interesting.

Semi-independent movement

There's no element of surprise in what I'd built so far. The human is so predictable and all you can do as the dog is stand in its way.

Someday, I want the human to have a path it is trying to follow but to start simple, I'm just going to have the human move around so I can try and herd it with the dog.

Movement 1: Look at the four boxes adjacent to the human, discard any that are off the grid or that contain the dog, then randomly choose one to move into.

The human walked all over the place, willy nilly. How do you herd something like that?

Movement 2: You are given a direction, move in that direction until you reach a wall or the dog, then turn to a randomly chosen direction

This worked okay but my human tended to walk around mostly along the edges of the grid. I want the human to cross the middle sometimes.

Movement 3: Toss a 5 sided die and if it's a 1 (20% chance) then change direction, otherwise, follow the instructions of Movement 2.

Pretty passable. The human is a bit tricky to herd but the feeling of the interaction is beginning to take shape.

Laws of Repulsion

I want to simulate the way herding dogs can push other animals (or humans) in a certain direction.

The human shouldn't want to cross in front of the dog. It might be really cool to do some kind of reverse gravity stuff here but I need to start with something simpler. A dog-zone. 

I created a line of boxes in front of the dog that are considered the dog-zone, a place that causes the human to change direction.

Now, the dog has more reach, enough to do some basic herding. With some imagination.

Next Up

This is a good, basic prototype for dog herding. Prototypes should be bare bones, the least effort to get the most learning. I had bigger ideas but this does an excellent job of testing out a very simple version of the most important aspect of this game.

Is it fun to herd humans? 
I don't think this prototype gives me a definitive "yes" but it doesn't tell me "no".

I'm going to take a break from this and work on something else. The grid work in this project will probably be really useful for other games I want to build. A little time away will help me decide what to prototype next for dog herding.

Thanks for reading! Let me know if you have any questions or ideas for what to try next with the dog herding.

The So Fresh 9000: A washing machine interface built with state charts

Summary

I had a bad experience with a washing machine so I tried building my own using a state machine. The project has convinced me that I want to keep doing product design with state machines and state charts.

The Cabrio That Never Stops

A year ago, I was trying to wash the linens at a friend's vacation home before I left for the airport. I was using Whirlpool's Cabrio WTW7300DW.

Not sure what the green, red, and blue lights in the center mean.

Not sure what the green, red, and blue lights in the center mean.

With seven minutes left on the wash, the Cabrio got stuck in a loop. Each time I went back to check on it, it still showed seven minutes and the linens were spinning in water, far too wet to put in the dryer. Doesn't this machine have a spinning teacups mode for extracting as much water as possible?

Obviously there's an error but there's nothing telling me what's wrong. Problem #1: no user feedback for an error.

Problem #2: the error is looping. Why is there a state with no exit?

My options are just to pause the cycle and try to run another cycle. Preferably just the spin cycle.
Problem #3: I didn't notice the option to Rinse & Spin. On the interface, this is a small label above something labeled Utility Tools. Is it an option I can select? I'm not sure.

Tools that are so full of utility.

Tools that are so full of utility.

I stumbled on the solution. I shuffled the linens around in the wash tub and once I started the machine again, the time remaining began to count down. Turns out the laundry was unbalanced and for some reason that was preventing the cycle from finishing.

The machine is top-loaded so the laundry sits in a vertically-oriented cylinder that is spun by a motor. If the laundry is unevenly distributed, more weight on one side of the cylinder than the other, then the cylinder will wobble as it spins. An unbalanced laundry tub can cause wear on the motor and its connections to the tub. It can also makes disturbing thumping noises.

I'm not sure why the unbalanced load caused the machine to loop. Seems like it would do more damage that way. 

Anyway, this is how the story starts. I was worried about either missing a flight or creating a moldy laundry monster for the next vacationers. It was a crappy product experience. 

But I don't want to just throw shade, I decided to try to make something better.

The problem to solve

My goal was to build a washing machine interface that:
+ allows users to choose their wash preferences or use presets
+ runs the wash based on the user inputs
+ displays the time remaining
+ displays an error when the machine is unbalanced

In addition to these basic goals, I included the usual things you expect from a washing machine. For example, if you open the door, it should pause which means that it remembers what it was doing and resumes when you close the door. Give it an elephant's memory. I won't list the rest of these details here.

The solution

The solution could've been much simpler. I could've just drawn you a picture or even marked up a photo of the current interface to say "Add an error message here when the sensor registers an unbalanced load!"

cabrio_adderror.png

I wanted to work through designing the whole system to see how things like settings and sensors on the machine could work together to present a clear, usable interface.

So I built a web-based prototype of the interface that I could interact with and move through its various states.

For unbalanced loads, I've simply made an unbalanced load message appear on the interface that is cleared if the balance is regained. I'm just working with the interface here so I've made assumptions about the physical sensors and how frequently they report back to the washing machine's control system.

How it's made

The washing machine prototype is basically a functioning website.

The core of the program is a state machine. The state machine is terrifically useful because it controls the app by moving between states. For example, when the washing machine is inactive, it's in the Dim-Display state. I can tell the interface to dim the display when the washing machine is in this state.

Screen Shot 2017-11-05 at 4.42.33 PM.png

Then, when someone presses the Start button, the machine knows to transition from the Dim-Display state into the Ready state.

The awesome thing about state machines is that you create a system of logic for your program to follow. Based on this state machine in this chart, there is no way to move from the Ready state to the Done state. So in creating the machine, I can declare the behavior I want and prevent behavior I don't want.

I built the state machine with a tool my partner, Kevin, has been working on. He hasn't shared anything about it publicly yet so just ask if you're curious.

I was able to define the state machine in code which generates an interactive chart. Being able to see the chart and navigate it helps me test out the system I've created. I can explore the possibilities I've created and look for gaps in functionality or behavior I want to prevent.

In addition to defining the state machine, I can code up an interface that responds to events in the system. That's what you saw above.

Statecharts make design better

My process for designing interfaces used to start with
1. a bit of writing -- goals, use cases, a list of screens I think I need to draw,
2. an information architecture diagram,
3. sketching out the screens,
and so on.

None of these tools does a good job of conveying the underlying functionality of the system.

The information architecture is the closest I used to come to looking at the system from a high level. And to be honest, an information architecture is a poor representation of a program. It's a rough approximation of how websites used to be built using just HTML and CSS, before programs on servers began generating the HTML, CSS, and Javascript that web browsers read. Information architecture is best used for communicating how a website will be organized. 

With a state chart I can define the control system that affects how people interact with what I'm designing.

I'm curious to try this out with other folks. I hope state machines will make it easier for the teams I work with to align and get a prototype working quickly. 

Living in Melbourne

At the beginning of October, my partner and I began an extended stay in Australia. We'll be in Melbourne for the next bit.

So far, I can say that I love how Australians shorten nouns into diminutives. Especially when I see it in formal contexts. 

The Australian Post career opportunities list "Postie" as an admirably gender neutral version of "postal delivery worker".

The Australian Post career opportunities list "Postie" as an admirably gender neutral version of "postal delivery worker".

Moneyhawk App: organize your Money without trusting the cloud

This week, Kevin and I launched Moneyhawk App, a personal finance tool for Mac. With Moneyhawk, you have a single view of where your money goes, while keeping your data and privacy safe.

Screen Shot 2017-10-10 at 9.34.57 AM.png

Features include: 
* cloudless, your data is stored on your computer
* drag 'n drop file import
* view totals for categories
* create tags, categories, and notes
* rename transaction payee
* fast search
* date and account filtering
* keyboard commands

This post covers the thinking behind a couple of our key features: data safety, spending categories, and performance. To create these features, we've made some unconventional trade-offs such as eschewing auto-download bank sync, mobile or web apps, and budgets.


Tracking Instead of Budgets

In Moneyhawk, we've built out the tools to categorize transactions for tracking but we haven't added a way to create a budget. Should a budget number persist for each future month? Should a budget be for calendar months or any time period you choose?

categories.png

Are budgets as accurate as they promise to be? Do you always end up with the final balance at the end of the month that you expected from following your budget? What happens when reimbursements are delayed for months? When bills are divided amongst housemates? 

There are other great tools out there for budgeting (YNAB, for example), so we're satisfied with tracking spending for now.


Data Safety and Privacy

It feels like every day another large company is hacked and our sensitive data is compromised. But there aren't many options on the market that protect our data. Many promise high levels of encryption on servers and clients and pieces of the puzzle we've never heard of before. 

We chose a simpler solution - we don't transfer or store your data. You have full control.

Having full control over your data with Moneyhawk means that:
* you never have to trust us with your bank passwords
* you store your bank data locally on your computer, not in a cloud server that could be hacked

The tradeoff with our approach is that you need to download your data from your bank and import it into Moneyhawk, unlike the many automated services out there today. We feel data security is worth the effort.


Performance

Our goal is to make Moneyhawk fast and reliable. A tool you can grow comfortable using.

One aspect of being fast is being responsive. Check out the search. It matches your keystrokes immediately.

Another aspect of being fast is having keyboard commands. Muscle memory wins out over mousing around. Here's a few of the commands:
* Tab to navigate between search and the transaction list
* CMD + p to edit payee
* CMD + t to edit tags
* CMD + k to edit categories (didn't want to get in the way of CMD + c for copy)
* CMD + n to edit notes
* Enter to save
* Shift + Enter to save & edit the next transaction for the same field

Reliability means that Moneyhawk won't spaz out and lose the data you just entered. 

A side benefit of our security approach is that we don't have to worry about the difficulties of syncing between your bank, our cloud server, and the local app on your computer. Large companies with armies of developers are still working on making the syncing experience seamless.

You might've guessed we're fans of old-school desktop software.


What's next?

We have a few things in progress.

Totals can be confusing. Right now, we sum debits, credits, and all transactions. There are two problems to solve:
* transfers give the appearance of higher spending and income - did you really "spend" $100 if you just moved it between accounts?
* an overall total could match the sum of your bank balances but only if you've imported your full transaction history (because some banks may not keep the full history, we may need to introduce an "initial balance")

Date filtering for custom time frames.

Better design documentation. This one's a behind-the-scenes feature. You might never see it but it will help us build a better Moneyhawk. For example, we're building a nice state chart for our subscription page so we can make sure the app moves smoothly between states (new, pending, subscribed, cancelled) and won't get stuck in an undefined black hole.

---

You can download the app for free at moneyhawkapp.com and sign up for our mailing list. The free version has a rolling limit of 200 transactions (that's probably months!) which can be lifted for a small monthly fee. We hope you'll give Moneyhawk a try and let us know what you think. Email Nicki at nicki@moneyhawkapp.com.

To clear skies,
Nicki

Sitting Stools - Part 2

The July sitting stool project has wrapped up. I made a cement-top stool and three A-frame stools from Ikea bed slats. To top it off, we had a little party with friends, some of whom showed off their own sitting stools they'd made for the occasion.

Professionals made the ones on the far left, unfortunately they're hard to see in this photo. The furry one was easily most comfortable and personafiable.

Professionals made the ones on the far left, unfortunately they're hard to see in this photo. The furry one was easily most comfortable and personafiable.

In the photo, the second stool from the right is the cement-top design I learned from this awesome how-to video from HomeMade Modern. I tried three times to build a cement stool. Only one survived.

The tricky thing about cement is landing the mixture and how we humans try to describe consistency. I read that the cement should feel like cookie dough when you try to stir it. But cookies don't have rock aggregate in them so.... My partner recommended peanut butter consistency. That seemed to work for me but at the party we discovered that we all disagreed on whether that meant chunky or smooth peanut butter. What I do know is that if you have too much water, the extra evaporation of that water can cause cracks, which is what I think did in my other two stool attempts.

This is attempt #1. If you look closely, you can see three cracks. Luckily the dowels came out so I was able to reuse them.

This is attempt #1. If you look closely, you can see three cracks. Luckily the dowels came out so I was able to reuse them.

The whole thing was a big success. I was really thrilled with my fine friends who all brought really amazing sitting stools.

Sitting Stools - Part 1

My partner is interested in woodworking but seemed to be delayed getting started so I challenged him to build 4 sitting stools over the month of July.

I choose the number 4 because:

  1. You've got to make more than one of something to get good at making it.
  2. A week per sitting stool seemed reasonable for planning and execution.
  3. Sitting stools can be simple to build but the possibilities are great and they don't need to be as structurally sound as a step stool.
The stools we saw in Vietnam really kicked off our interest. Little sidewalk restaurants use them to set out a dining area while open and stack them away after closing.

The stools we saw in Vietnam really kicked off our interest. Little sidewalk restaurants use them to set out a dining area while open and stack them away after closing.

I'm making some sitting stools, too. My interest is stools that can be stacked easily and I found many great ideas on Pinterest. I was most impressed with a design that stacked horizontally instead of vertically.

AA Stools by Torafu Architects

AA Stools by Torafu Architects

I read about them a bit in this Dezeen article. The website for Torafu Architects is www.torafu.com. There is a nice story about how the architects designed this as a joint project with a community workshop established after the tsunami.

These seemed simple enough for me to make. My partner created some drawings for them, making up an angle for the legs.

These came pretty close! A bit of a mishap in the heights.

These came pretty close! A bit of a mishap in the heights.

Before I go further, I want to say that TOOL LIBRARIES ARE AWESOME! We were able to borrow this great miter saw in the photo and it was so helpful.

Making thing is hard! The photo hides a lot:

  • gaps between the wood because I didn't clamp them together while screwing in the screws
  • accidentally screwing in on the outside instead of the inside of the legs
  • an extra screw on the top to try and reduce wiggle

I took one apart and pretty much redid the whole thing. I made 3 of these so that knocked out most of the month's requirement. ;)

Volvo Game - Part 1

Following up on my experiment to code a moving road (as you would see it from a helicopter), I began building a driving game in Javascript. It will feature my Volvo once I get around to designing the graphics.

I switched from Processing to Javascript because HTML/CSS/JS are the real workhorses underneath the web and app tools that I design in my work and I wanted to better understand the limitations and possibilities of these languages.

The road moves. And I can move the car with left/right arrow. Woo!

The road moves. And I can move the car with left/right arrow. Woo!

Now I have obstacles appearing on the road. But I need them to look like they're sitting on the road, not falling down the screen.

Now I have obstacles appearing on the road. But I need them to look like they're sitting on the road, not falling down the screen.

The next big task was collision detection. To start, the road obstacles just disappear when they collide with the car (the white box).

The next big task was collision detection. To start, the road obstacles just disappear when they collide with the car (the white box).

It's been a lot of fun. I have a long way to go. All of this is vanilla Javascript, that means no libraries. A library might already have something like collision detection where you give a function to objects and the function tells you if they are overlapping. I wanted to figure it out for myself. Did a little trigonometry -- my favorite math in high school.

Next, I want the obstacles to bounce away from the car.

Experiment: Make a Moving Road

This past week, one of my experiments has been to program a moving road. I'd love to make a driving game, a super basic 2D game where your car moves only left and right and the road appears to move under you. I set myself the task of making just the appearance of a moving road. I used Processing [a programming language] because it's familiar; I spent a semester playing with in graduate school. 

The white box is going to be my car. Right now it follows my mouse.

The white box is going to be my car. Right now it follows my mouse.

Basically, my road is a set of dashes that move down the screen each time a new frame is drawn. One dash was easy. Then I created a set of dashes to fill the screen but the set would just move down the screen, leaving it empty above the first dash. I was resetting the position of the set based on the the first dash reaching the bottom of the screen, so the rest were further below the screen edge. Now I have a set of dashes twice as tall as the screen so visually cycles. And I made it to fill whatever height screen you have. Extra credit. But this method isn't efficient because I have twice as many dashes as I need. My next experiment could be to find a way to drop the dashes onto the screen individually, starting each one over as it reaches the bottom.

Launched: New site for UNOCHA's Financial Tracking Service

Congratulations! After over a year of hard work, the Financial Tracking Service team just launched their improved website for sharing data on humanitarian aid funding.

I've enjoyed working with these folks since August. My focus has been on the Data Search feature that makes it possible for the humanitarian community to download and make use of the data FTS collects.

Check out the site: https://fts.unocha.org/

Be Excited: Ici & Maintenant

Excitement category: music videos

I don't know about you but there are some music/dance videos that inspire such embarrassing feelings of happiness and love that I question my agnosticism. When I am feeling bummed, watching one of my favorite music videos will turn me around. And possibly waste an hour on YouTube.

My latest favorite is Yelle's Ici & Maintenant (Here & Now) and it's destined to stay at the top of my list for a long time. The video fulfills my basic criteria for a good video:

  • it tells a fun story,
  • it makes the most of mood in the music,
  • the dancing makes me want to dance, too, and
  • it doesn't have characters who are depressed, cruel, or only sexual.

What takes this video to awesome-as-space level is that it is playful, inclusive art. The team that created this video took an odd idea, a relationship in which one person is always moving spastically, and they delved into the absurdity. Who are these people? Why is one always moving? Are they in a relationship? What kind of relationship?

As I watch, I go from being curious and amused to becoming attached to this endearing couple and the mystery of their lives. And at the end, I'm rewarded with a fun surprise - a final clue that extends the mystery. Did they switch places at midnight? What does that mean?

I don't know French so perhaps understanding the lyrics might change my opinion. The Google translate version of the lyrics doesn't seem unexpected or inappropriate so I'll stick to my opinion: I absolutely love it and I'll probably be happier and more creative if I watch it every morning. 

Hope you like it, too!

PDX Webvisions 2016: My Favorite Talks from Bearded Men

I don't know how many bearded men spoke at Webvisions in Portland this year but I went specifically to see Aaron Draplin and Mike Monteiro. Both were epic and inspiring and qualify for the "watch again" category.

Aaron Draplin is the pride of the Portland design scene because he is a prolific, well-known designer of logos, posters, and the creator of much-beloved Field Notes. I admit I thought maybe Portland overhyped him because he's a hometown hero - but no, he's explicatively fantastic. He gave a standard here's-how-I-became-a-designer talk but it was awesome because it came with so much happiness, authentic gratitude, and love for the world. This guy loves the doing the design he does and he told a touching story about how he was able to help a guy out a tough spot with a good logo. I think he's such a happy guy because he is doing what he loves doing and doesn't take it for granted.

I feel lucky that I feel the same way. I'm going to be able to look back on my career and how it impacted my life in the same way. I feel like a rockstar because I get to do UX design as a job. I've felt that way since I got my first job, barely knew nothing, barely paid much, but totally in love with UX.

Mike Monteiro is a master at giving talks. His talks aren't just good talks, they're next level. He hits you in the gut with meaning and spins a bunch of tops that wobble around in your brain for days. His talk this year addressed a problem I didn't even know existed. There's a huge demand for designers and there aren't enough good designers prepared for it. Sounds like a good problem to have. Except that our lives are spent interacting with designed products and services and we suffer when they aren't designed well. Mike covered how schools and industry aren't doing enough to educate new designers. I paid a lot of attention here because, as a UX manager, I wondered a lot about whether the lack of satisfactory design candidates was a problem we should be solving by better educating new hires. The solution, Mike encouraged, was to give back by taking on this education, either formally with hires or informally through mentoring. I especially liked that modeled a community attitude by explaining that when his teammates are ready to move on that he helps them find their next job. Even though its a loss to have someone outgrow your team, you've made a contribution. I'm very thankful that I had a couple good mentors and a manager in particular that helped me learn in leaps and bounds. 

Archery Bag Complete

Update on "Trying a New Medium: Sewing".

The bag is finished! I was lagging on sewing up the bottom.

 

I tried a different approach to the bottom. I sewed the bottom in a straight line and then folded it flat. I sewed across the triangle corners that are created when it is flat.

Yeah, the tension was all out of whack. I'll probably have to re-do the bottom soon.

The bottom ends up looking like this. Like a very wide "H". This was much easier than the first way I tried. Below is my first try. I sewed darts in 4 corners and then across the middle. The bottom comes out with a shape like ">--<". I think it looks a little nicer so maybe I'll use it again on another project.

 

FAQs:

What are those spots on the side?

I'm not sure, maybe oil stains from stickers. The fabric came like this and was super discounted.

What kind of fabric is this?

It's urethane coated ripstop nylon. The awesome folks where I got it said that this is the material Arc'teryx uses on their bags. It does look like a match for this bag. They describe the material as: 

Used on Arc'teryx alpine climbing packs, the NC400r-AC² nylon 6 ripstop material is ultra light, but very strong and durable. Urethane coated on both sides, the fabric is waterproof and air-impermeable, and has a white coated interior for increased visibility inside the bag.

I can tell you it's great because it has a grid in it. This make cutting easy. It's super difficult because it's coated surface makes it hard for the sewing machine foot to pull it through smoothly.

Trying a New Medium: Sewing

One of my goals for my time off was to try out sewing. I'd spent a lot of time investigating the perfect backpack a couple years ago and while in Japan in January, really admired a lot of the backpacks and men's clutches that I saw. I decided to try it out. This was an easy decision because my SO was interested in the same thing and had already gotten a sewing machine set up in my apartment.

First Project 

My first project was to tear apart a pencil case he'd made in an introductory case and sew it back together. It was a good way to get familiar with the sewing machine. Sewing straight lines, thinking about the order of operations, and doing the reverse stitch to end each section.

Second Project: Archery Bag

I'm on my second project now. An archery bag. Here are my requirements:

  • it stands up on a flat bottom
  • it has a way to hold the quiver upright
  • it has pockets for various items that often get tangled in my basic tote bag
  • I can carry it over a single shoulder like a tote bag.

It's not a backpack or anything to be used in hunting. Just to hold my stuff on the ground while I shoot.

First Attempt

I pulled a basic bag together that could hold a quiver and had a flat bottom. Making a flat bottom from a cylinder was the most difficult and most fun part of this project. I had looked at a few other bags and borrowed some ideas about how to create a flat bottom.

It wasn't pretty, but it made a flat-bottomed bag! Then I started thinking about adding pockets and realized I was going to have a hard time trying to fit my sewing machine into a tote bag.

Second Attempt

I really really love pockets. Gotta have 'em. So I deconstructed my bag and cut fabric for pockets and started all over again. This is great because it means I can do a better job the second time around. More practice!

After 3 hours, I got the pockets in, handles, and made the bag's cylinder shape.

Next time, I'll work on the bottom again. I'm having a great time. So far I enjoy this a lot more than many of the other projects I've tried to do. I love the spatial problems of taking flat cloth and making 3D shapes. I also might enjoy it because I'm not worry about the details, or making sure this looks good. I'm happy to be prototyping.

 

 

Big Changes

I left Citizen, Inc. a week ago. It was incredibly touching. I'll miss everyone there. 
I decided that it was time for me to get out of my comfort zone. I want to learn how other people design digital products. And I want to know if I can find a work schedule where I have time for side projects, daily flexibility to stay healthy, and can travel frequently.
It might not be possible. I'm not sure what form my ideal job would take. But I know I need to try to find out and the exploration makes me happy.

I'm going to take on some contract work. I'm taking interviews for full-time work and learning how to evaluate what a company has to offer. I might schedule a few weeks for strictly personal projects. TBD.