Filed under programming

Re-Introducing ProjectNom

ProjectNom Screencap
The original idea for ProjectNom was born about four years ago. At that time, my method of storing recipes involved a pile of printed recipes. As I picked up this pile — a pile with no organization, rhyme or reason — I wondered if there was a better way.

A better way to organize recipes, especially those found online.

A better way to cook those recipes, without having to resort to paper.

A better way to surface those recipes later when it came time to plan a meal.

The options at the time were rather limited. They were all locked to a certain platform, blissfully ignorant of the web. Importing recipes was a pain, and cooking directly from the software wasn’t a primary feature.

I built the first version of ProjectNom quickly, mostly because I wanted to get my own recipe mess under control as soon as possible. What I ended up with was a solid proof of concept, but the accelerated development time forced cracks in the infrastructure. The result was difficult to maintain and difficult to extend — classic hallmarks of such a rushed effort.

This year, I decided to finally give ProjectNom the professional treatment it deserved — or at least, the best treatment a one-person development team could deliver. Specifically, there were a few aspects I wanted to improve over the original “proof of concept”:

  • True responsive design. I used Bootstrap for the original ProjectNom, but a combination of my inexperience with modern front-end development combined with early-version Bootstrap limitations resulted in a lack of finesse, especially on smaller devices.
  • Easier importing. The first version of ProjectNom made importing recipes as easy as selecting text. While that was better than typing it in from scratch, it was still a hassle.
  • Sharing. Part of the fun of cooking is sharing the recipes you find. Having a way to do this in the same place that you store your recipes only makes sense.
  • Technical foundation. The original ProjectNom was difficult to maintain and improve upon.

This work started in January. Eight months later, I’m proud to finally reveal the complete rewrite of ProjectNom.

  • True responsive design. While I’m still not an expert in front-end development, the new ProjectNom is truly responsive across a variety of devices. If it has a relatively modern browser, it’ll look good. Some pages — namely editing a recipe — are more usable on devices with larger screens, but they’ll still render intelligently.
  • Easier importing. The new ProjectNom can quickly import recipes from known sites in one click. At launch, the following sites are supported: Food Network, Epicurious, Serious Eats, Bon Appetit & AllRecipes. The best part is that adding new sites is relatively easy, so please send along suggestions for any site not on this list! In the meantime, the traditional import functionality can be used — just select the text you want and click “import”.
  • Sharing. Invite your friends to join ProjectNom, add them to your list of friends, and then share your recipes! It’s that easy. You can even import the recipe directly into your collection for easy access.
  • Technical foundation. This could be an entire post in itself (and probably will be at some point) so I won’t go into too much detail here. But suffice it to say: the new ProjectNom is better organized for maintenance and expansion. One example: an API layer to keep the back-end concerns separate from the front-end.

There are bound to be bugs in this first version, but I’m committed to getting them ironed out. If you find anything amiss, please let me know either here in a comment, or at support@projectnom.com. I also welcome any feature ideas — I want to keep improving ProjectNom until it’s the ultimate recipe management solution across all platforms and all devices.

And on that note, I wanted to end with some musings on the state of recipe tech in general. Recipe web sites have improved greatly since I first started working on ProjectNom, but they’re still distinct silos of information. So even if a website lets you save recipes into a personal “recipe box”, you still have to remember which site has the recipe you’re looking for.

It’s also interesting to me that a lot of recipe management tools available today are locked to a particular platform. To be clear, they’re great apps — but if you’re not tied exclusively to Apple or Microsoft devices, then you suddenly lose access to your recipe collection. I certainly see the allure of staying on one platform — recipes are complex beasts, and it helps to harness the power of a specific platform to get the best experience. I certainly haven’t ruled out the possibility of creating platform-specific interfaces to ProjectNom. But the ability to access a recipe from any device at any time is a critical feature, and should never be compromised.

With ProjectNom, you can rest assured that it never will.

Now get out there and start cooking!

Tagged , , , , ,

Trowl 0.8, Or How I Learned to Stop Worrying and Love API 1.1

Overdone jokes aside, I realized that I use Trowl too much, and I invested too much time in the app, to just toss it aside when Twitter decided to finally turn off version 1 of its API. That said, it’s not a trivial process.

Technical Details

If you’re interested, Trowl was originally built on requesting XML responses from Twitter. This was primarily because, at the time, .NET was best suited for parsing XML documents more than anything else. With the switch to API 1.1, Twitter completely dropped the ability to request XML responses, in favor of JSON. Luckily, .NET has become more fluent with JSON recently – but it still meant going back through all my calls to Twitter and replacing the XML-based response/parse logic with JSON-based response/parse logic.

The Status of 0.8

Okay, so, I’m making this version 0.8 because I’m essentially changing the entire foundation that Trowl is based on. There aren’t any new features here, but it’s a big enough infrastructure change that I felt justified in bumping up the version to 0.8.

I’ve converted almost everything over to API 1.1 except the following:

  • Controlling Trowl through DMs (which I don’t think anyone uses anyway)
  • Spam reporting
  • Additional caching in light of API 1.1’s stricter rate limiting

Everything else should work, but I’m releasing a development version first so people can try it out and let me know what bugs they find.

Trowl 0.8 Download

UPDATE 6/17/2013+ Another quick update that fixes some issues with retrieving friends (darn those stricter rate limits!). Authorizing a new account should be fixed now too.

UPDATE 6/17/2013 All functions should be switched over to API 1.1 now, but please send me any bugs or issues you find. Thanks!

Thank you for sticking by Trowl during the API shutdown!

Tagged , ,

Trowl 0.7.3 (Tweet Marker Support)

I’m making a development version of 0.7.3 available for anyone who would like to help me test it before it’s released to everyone. This version has better stream error recovery handling, and makes a couple of other minor under-the-hood changes. The most noticeable change, though, is Tweet Marker support.

What is Tweet Marker?
For those who aren’t yet familiar with the service, Tweet Marker syncs your Twitter timeline across applications by recording the last tweet you read. Applications that support Tweet Marker can quickly jump straight to the spot in your timeline where you left off.

How does that work for Trowl?
Since Trowl doesn’t show you a traditional Twitter timeline (at the moment…), it uses this information a little differently.

Saving your last read tweet: in Trowl, a tweet is considered “read” when its notification is dismissed. Every 15 seconds, it will send the tweet that was last dismissed to Tweet Marker.

Retrieving your last read tweet: every 5 minutes, Trowl will pull the latest Tweet Marker from the server. It can’t remove any tweet notifications already on screen, but it won’t send new notifications for tweets you’ve already seen. Instead, it will pick up with the first new tweet. Depending on your settings, this will also happen when you uncheck the Silence option.

How do you enable Tweet Marker?
Tweet Marker has been added as one of the “missed tweets” options:

Tweet Marker

This option covers both tweets and mentions.

I’ve also updated Metro Display slightly. In addition to the coalescing support that I added a little while back, I also changed it so that the Twitter timestamp dynamically updates – this should have been added a long time ago, so I apologize for the wait. I also fixed a nasty memory leak bug.

You can try both of the new toys here:

Trowl 0.7.3 Development
Metro Display 1.5 Development

Please send any bug reports my way – you can comment here, send me a tweet, or post to the Google Group. Have fun. :)

Tagged , , ,

My Little Twitter Bot

It all started when @ndoto replied to one of my “eeyup” tweets saying that he wished there was a Big Macintosh Twitter bot that would reply with an “eeyup” if you sent a tweet containing “eeyup”.

For those who aren’t in the know, Big Macintosh is a character on the cartoon My Little Pony: Friendship is Magic. It’s a slight re-imagining of the original show, headed by the same creative mind behind Foster’s Home for Imaginary Friends – an awesome show with clever writing. Needless to say, that same maturity (but kid-appeal) carries over to the new My Little Pony. I suppose I should clarify that I’m not enough of a fan to call myself a brony, but I do think the show is about 20% cooler than most other things on television – and Big Macintosh is by far my favorite character. :)

I’ve always wanted to make a Twitter bot, so I jumped at the opportunity. In this post, I’d like to share some of the technical details, and decision making, that brought @BigMacinbot to life.

Continue reading

Tagged , , , , , , ,

Trowl 0.7 Preview – Update!

Just a quick post to provide an update on the next version of Trowl.

Preview builds are now available. I waited until things seemed relatively stable, so if you want to give 0.7 a whirl, you shouldn’t experience too many problems. Of course, if you do, I’d love to hear about it. Then I can fix it and everything will be happy again. :)

While 0.7 is mostly finished, there are still a few small features that I’d like to add. I didn’t want the preview builds to get held up by these last few changes, but you can expect a couple more goodies to slip through before things are finalized.

So, what are those features? Thank you for asking, imaginary commenter!

* New "Event" notification. (NOW AVAILABLE in build 002) The user stream sends more than just tweets — it also sends notifications about new followers, retweets and favorites. So it only seemed appropriate to pass those notifications on to Growl. As new notifications get sent to the stream, I’ll integrate them into this notification type.

* Complete t.co integration. (NOW AVAILABLE in build 003) Twitter is finally starting to push ahead with implementing its t.co URL "shortening" service to the rest of its ecosystem. To that end, Trowl will behave slightly differently when posting a tweet with URLs. Each URL will automatically deduct ~19 characters from your tweet, no matter how long the URL is. My current plan is to keep the built-in is.gd shortening available for those who like to use that, but it’ll probably become less important as t.co becomes more widespread.

* Photo uploads. (NOW AVAILABLE in build 004) I think everyone knows what this is now that Twitter has rolled it out to everyone on the Twitter website. It is not yet (officially) part of the API, though, and currently Twitter has no date planned for a roll out. (So much for late June.) Like mentioned above, this may or may not make it into 0.7 depending on how long this takes.

* Higher resolution profile pictures. (NOW AVAILABLE in build 005) Profile pictures will now be 200 by 200 pixels, if possible. A lot of profile pictures aren’t that large when pulled from Twitter, so some changes were made to how the retweet profile pictures are composed. Overall, though, you shouldn’t notice too much of a difference unless you are using a Growl display that shows large images, or you forward notifications to another device, like Howl on iPhone. Metro Display was changed to show a larger version of the profile picture if you hover your mouse over the profile picture.

Thoughts, questions, suggestions? Feel free to comment. :)

Tagged , ,

Trowl 0.7 Preview

Now that my experimental project is out there in the wild (have you tried it yet? please try it!), it’s time to move on to something a bit more stable and mainstream: Trowl.

I feel a little bad that it has been almost a year since the last big release, Trowl 0.6. Between other projects that I have been working on, and Twitter’s announcement (“read our tweets, no new clients!”), Trowl has been put on the back burner. The good thing about that, though, is that it has given me time to think of ways to improve the program, and collect feedback about what others would like to see too.

Today, I’d like to give you a preview of all the new shinies in Trowl 0.7.

Continue reading

Tagged , ,

Sociable Wallpaper

All right, so I’ve been teasing this guy for a little while. I think it’s time I let the cat out of the bag.

secret_project

So what is it? Put simply, it searches Twitter for desktop wallpaper, adds what it finds to your library, and then randomly sets your computer’s wallpaper to one of the images at regular intervals.

I forget what, exactly, prompted me to start working on this project. I think it had something to do with the fact that there are a lot of images out there that make excellent wallpapers – but they’re a bit hard to find. A few websites have popped up recently that have helped with this task, but it’s usually pages upon pages of images that takes a lot of time to sift through.

But Twitter is a great natural filter – people usually don’t tweet something unless it warrants it. (Excluding things like spam or commercial accounts, of course.) So, I started working on this little program.

At this point, it’s a proof of concept. It’s not in any sort of polished, final form. All the features work in a “this is alpha code and may break” sort of way. It searches Twitter for tweets with the “#wallpaper” hashtag, and then looks for any URLs. If one of the URLs points to an image, it pulls it down and adds it to a temporary list – the lower “Twitter” section in the screenshot above.

Selecting a wallpaper shows who tweeted it, and what the original text of the tweet was. When you mouse over a wallpaper, you also get three options:

secret_project_buttons

The top button removes an image from your library. Because you may sometimes come across images that you don’t particularly like, the program asks if you want to exclude this picture from ever showing up again. If you say yes, then it’ll be added to an exclusion list that will stop it from showing up again – regardless of who tweets it.

The middle button pins the wallpaper. Pinned wallpapers are images you want to keep in your library. They appear in the section on top, as seen in the screenshot above, and won’t disappear if you restart the application. If you ever decide you don’t want to keep a wallpaper, you can unpin it. (To indicate that it is pinned, the wallpaper will keep showing the pinned icon, even after you mouse away from it.)

The bottom button magnifies the wallpaper. In this view, it fills the entire upper portion of the program. You can click anywhere on the zoomed version to dismiss it. Keep in mind that you can resize the main window (or fully maximize it) – which will also expand the size of the magnified image.

There is also a small settings screen that you can access by clicking the button with the gear on it, in the lower right. From this screen, you can control how often Twitter is searched, how often your wallpaper should change, and what the minimum size an image should be in order to be included in the library.

And speaking of changing the wallpaper – it will randomly choose an image, either from your pinned list, or the images it has found on Twitter. So if you don’t want an image to show as a wallpaper, it is best to remove it.

A few last points: by default, a wallpaper image is named the URL it was pulled from. But you can rename it to anything you want – selecting the thumbnail lets you change the text below it. You can close the main window any time – it will sit in your system tray. Double click the icon to re-open the window, or right click to Exit. When you first start the program, it won’t check Twitter right away. It will start at the next scheduled interval. You will know it’s checking Twitter, as there will be a green progress bar in the “Twitter” header bar.

I think that’s it as far as features go. I’m offering this proof of concept version as a way to gauge what people think of it. I have a lot of interesting ideas for where this could go – but with both Trowl and Project Nom being actively developed, I don’t want to spend a lot of time on this unless it’s something people would actually use and enjoy.

So if you like it, let me know! And if you don’t like it, let me know that too – but let me know what could be done to improve it.

In any case, I hope you like playing with this as much as I have. You’ll notice that there aren’t too many #wallpaper tweets that actually link directly to an image, so if you have any wallpapers you can share with a #wallpaper tag on Twitter, please do! And I’ll do the same.

Enjoy!

TweetWallpaper
Proof of concept. Requires .NET Framework 4. 505KB.

Update: Something like this doesn’t really work unless lots of people contribute their favorite wallpapers. So, to that end: you can now upload your own wallpapers and tweet them!

Tagged , , ,

Trowl: Re-Authorize for DM Permissions

settings_add_accountTwitter recently announced that they’re adjusting application permissions such that DMs require a new level of access. To ensure that users know exactly what is being accessed by the programs they use, Twitter wants users to re-authorize applications that require DM access.

If you use Trowl to view DMs, or you use the DM remote feature, you will need to re-authorize Trowl to access your DMs. otherwise you will start getting errors at the end of June.

Luckily, it’s pretty easy to do this. The first step is to go to the settings screen and click on ‘Add Account’, like the screenshot at the right shows. This will take you to the usual authorize screen, as if you were adding a brand new account. Click the link, and you will be taken to the Twitter website to authorize your account. The screenshot below shows the important part – that you will be allowing Trowl to access your direct messages.

After you enter your username and password, you will get the pin to enter back in Trowl. After you do this, Trowl will realize you authorized an account you already have set up, and will simply update your existing account with the new authorization. You will need to repeat this process for all accounts you use with Trowl. Click ‘Save’ to confirm the new authorizations and you’re done.

(One other minor thing to note: I run Trowl on several computers, and each instance is authorized for the same Twitter accounts. One thing I noticed is that as soon as I re-authorized one instance of Trowl with the new access permissions, the access permissions used by the other instances of Trowl instantly became invalid. So, if you have a similar situation, you will need to update every instance of Trowl. I imagine this isn’t a common situation, but wanted to mention it just in case.)twitter_authorize

What if I don’t want Trowl to access my DMs?
If you actually don’t want Trowl touching your DMs for whatever reason, then you can either refuse to re-authorize Trowl – in which case you will get errors whenever Trowl attempts to access them – or you can change your settings to not Growl DMs or use remote DM commands.

This is a bit of a nuisance, so thank you for taking a minute to do this. I understand Twitter’s motivations, but I can’t help but think there must have been a more streamlined way to implement this.

Anyway, that’s it. As always, if you have any problems, send me a tweet!

Tagged , , ,

Metro Display / Twitter Display Updates & Response to Twitter’s Developer Announcement

Today, I’m releasing a minor update to Metro Display and Twitter Display. For Metro Display, it will now properly display twitpic/yfrog images if the links were shortened by t.co. For both displays, they will now properly link mentions/hashtags/URLs if they appear more than once in the tweet. They can both be downloaded from the usual location. You may need to delete your current versions of the displays before installing the new versions.

Continue reading

Tagged , , , ,

Introducing Project Nom

A long time ago, back when the internet was still assembling itself, there was a service called Prodigy. I used Prodigy more than I’d like to admit, usually for things that weren’t especially productive. One of the few exceptions to this was when I wanted to find a new recipe for an appetizer.

There were distinct silos of information on the Prodigy service, similar to AOL’s keywords. If I remember correctly, the food section had a small selection of recipes, but nothing terribly impressive. The main draw were the message boards, where people were actively swapping their favorite appetizers, entrees and desserts.

After creating a new topic on the board, someone replied with a recipe that sounded perfect, so I printed it out. There was no other way to save it, really — besides, it was the only practical way to cook the recipe. I didn’t want to run between the kitchen and study whenever I needed to refer to the instructions.

Many years later, technology has improved considerably. Message boards are no longer the focus, but, if you have the time, you can find just about any recipe you want. But one thing remains the same: if you want to preserve your recipe, the best method is to print it out.

Oh, sure, there are websites that let you bookmark your favorite recipes in a virtual recipe box. Food Network has one. Epicurious has one. I’m sure there are others, too. But since when was it a good idea to have three recipe boxes in your kitchen, with recipes randomly distributed between them?

And what about cooking them? Are you supposed to drag your laptop into the kitchen while you cook? I’ve tried that, and it’s not practical — if for no other reason than it takes up a lot of counter space.

There have been some software solutions over the years. The best right now are locked onto Apple’s OS X/iOS platforms. That’s fine and dandy if you’ve bought into that ecosystem, but most people haven’t.

No, the best solution for an omnipresent need ("what do I want to eat?") is an omnipresent platform. All that time ago, Prodigy had the right idea. But now that technology has evolved, it’s time to evolve those original ideas.

That is the goal of Project Nom.

Continue reading

Tagged , , , , , , , , ,