HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
ChimeraCoder
anaconda
Go2014–2018
ChimeraCoder / anaconda

anaconda

A Go client library for the Twitter 1.1 API

4Distinct people
10Mentions
0Explicit recommenders
1.1KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A Go client library for the Twitter 1.1 API

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 12:54:37 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year10 dated mentions

Observed mentions: 2014-07-21 18:43:21 UTC to 2018-04-30 16:02:29 UTC.

0123452014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments20142015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20162017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2018

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC505
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC101
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC202
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC101
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC101

What Hacker News says

10 sources
> Twitter also gives away their data to anyone that wants it for free. You can be streaming millions of tweets per day within minutes of creating an account. That's news to me. I maintain the Twitter client library for Go[0], and I still haven't been able to get through the process for getting access to the new streaming API (for testing the library). It requires an application stating your intended purpose and usage. I applied explaining the situation and was rejected (with a request to provide more information - I still have to resubmit that, but it's time and I just haven't gotten around to that yet). It's possible to stream millions of tweets per day, but good luck trying to do it "within minutes of creating an account". And it's definitely not free. For full context: I'm already a verified user on Twitter (ie, "blue check mark") and
Read the rest
was clear in my application that I was requesting access so I could develop and test the library that other users of the Twitter API develop with. I'm not exactly complaining that they didn't approve the request initially, but if that's not sufficient to get access, it's pretty clear that they're not "giving away their data to anyone that wants it for free". [0] https://github.com/ChimeraCoder/anaconda
In Twitter also sold data access to Cambridge Analytica researcher
This actually seems to be a problem with certain test fixtures in one of the dependencies: (github.com/ChimeraCoder/anaconda) . The offending files are: json/statuses/show.json?id=404409873170841600 json/statuses/show.json?id=738567564641599489 This occurs because Windows can't have question marks in the file names. I would suggest creating a pull request, or an issue on that repo asking that those files be renamed and the test logic be modified to not require the files to have the question marks (a simple character replacement in the required tests should probably do the job).
In Show HN: Beehive – An open source IFTTT powered by Go's templating engine
I created my own Twitter Go project yesterday: https://github.com/buro9/deleteoldesttweet The aim of that one is to delete all tweets... but, to do so by scraping Twitter's "First Tweet" page for the oldest tweet. This needs to be done as it's not actually possible to delete old Tweets using the Twitter API as you cannot find your oldest tweets. What I would like to achieve is to have Tweets be temporal, and to self-destruct after a period of time. The nature of the way that I use the service is that it is conversational, and a Tweet taken out of context long after the conversation is likely to not be a good representation of my views (fitting reason into 140 chars is hard). I already use [Tweet Delete](http://www.tweetdelete.net/), but wanted to go back and nuke the older tweets too, hence this code. But... I broke the page. https://disc
Read the rest
over.twitter.com/first-tweet#buro9 That no longer returns my first Tweet, it's borked. My profile still shows I have 1,700+ tweets, but they seem to be totally inaccessible now. Oh well. I did manage to delete a good thousand or so, a small triumph. Anyhow, Go code and Twitter, I heartily recommend this project: https://github.com/ChimeraCoder/anaconda It's an easy to use and quite complete package that implements the Twitter API.
In Show HN: Go-odbye – Twitter Follow/Unfollow Reporting Tool Written in Go
I maintain the Twitter API client library for a popular language, and I have a love-hate relationship with the Twitter API. Parts of it are really nice, but sometimes I feel like I'm playing whack-a-mole with the documentation. The example responses they provide are correct... except when they aren't. They use heterogenous JSON in their responses (silently replacing string literals with arrays, but only for some responses, etc.). They've added error codes without updating the docs for months on end (which sort of defeats the point of an error code - what use is it if you don't know what the error means?) The only way I'm notified of these changes is when people file bug reports with the library, and I always have to ask them to tell me the exact query that cause the error for them, because they're almost impossible to reproduce otherwise[
Read the rest
0], and the API is so inconsistent that I can't try and manually search for similar responses that will cause the error. On the other hand, the Twitter API is a seamless[1] way to interface with an incredibly useful and powerful product, and it's a great source of data. I just wish the developer experience were seamless. [0] e.g. https://github.com/ChimeraCoder/anaconda/issues/82 [1] Assuming your client library works, but I can't assume that if I'm the one responsible for maintaining it!
In Twitter CEO Dorsey Apologizes to Developers
> There is no easy way to sort of "parse" json piece by piece, which is what this library provides Well, you can use json.RawMessage to delay decoding until other values are known[0]. However, this still requires that the input set is known at compile-time, which may not always be the case (some APIs sadly use a highly variable JSON schema, which can only be determined at runtime.) You also don't need to pass a pointer to a struct. For example, you can pass an interface{}, which allows you to decode data into a type that is specified by the calling function, which I made heavy use of in this Twitter client library, for example[1]. (This is more or less how encoding/json itself works under the surface, when you think about it, but oftentimes people forget to take advantage of this idiom in practice.) [0] http://golang.org/pkg/encoding/jso
Read the rest
In Show HN: Jason – A new JSON Library for Go
For context: Go has been my primary language both at work and for personal use for over two years now. > It is worth pointing out that if the Go community settles on something like this as the solution, it negates one of the underlying arguments that the Go designers have against generics in the language. It wouldn't really negate the underlying arguments; it would just mean that the community had grown and attracted developers who may not necessarily share that part of the language creators' original vision of the language. > But all the other solutions that are headed into that gap are just one level or another of convenience wrapper around exactly that. Well, focusing on "the other solutions" misses two things: First, many (I dare say most) Go developers[0] don't really use any "solution" for this other than the features built into the
Read the rest
language itself. In other words, they're not out there writing alternative solutions because they genuinely don't perceive a lack of generics to be as big of a problem as other things, which they do write tools for. Secondly, there is a way to use interface{} to accomplish some (not all) of the same things that generics do, while still preserving type safety. Look at the functions in this Twitter client library I wrote: https://github.com/ChimeraCoder/anaconda/blob/master/users.g... All the endpoints use the same apiGet() function ("generic"), but they all return concrete types, and they are all typesafe - you will never get a runtime panic from any of those functions. This is more than Java's generics guarantee, due to the quirks of the way type erasure works there[1]. No, this isn't "generics", but it provides an alternative way of solving the problem most of the time (in practice), and isn't that what matters? And yes, this is not quite as clean as some languages which focus on having a very expressive and precise type system (ML, Haskell, etc.), but it provides enough type safety for me without requiring me to think consciously about the types that I am using (which I have to do when writing ML or Scala). [0] I mean people who write primarily Go at least 4-5 days a week, for work, as opposed to people who dabble with it for side projects but primarily use other languages. [1] TL;DR: Java's generics are converted to "Object" after compilation, which means that you can actually end up with runtime type errors that are detectable at compiletime, due to inheritance. (It's been a while since I used Java, so I won't provide an example, but they're easy to find online).
In Idiomatic Generics in Go
It looks like this is the function: https://github.com/ChimeraCoder/anaconda/blob/master/twitter... This looks like a good example of interface{} used correctly - the consumer of the apiGet function passes in their strongly typed object, which then is handed in to json.Decode. No type safety is lost from the perspective of the consumer, while the json.Decode can operate on any struct type. Sure this addresses a different issue, but for all the complaints about interface{} I think this is a good use-case.
In Channels Are Not Enough
It's funny that OP uses Twitter as the case study at the end. I wrote what was then the first (and think still the only) Go Twitter client library that works with v1.1 of Twitter's API[0]. It implements automatic rate-limiting/throttling behind the scenes, and it returns values of concrete types (not interfaces) ready for immediate use. Keep in mind that, were I to write this again today from scratch, there are a number of things I would do differently (since I started it as a relative beginner expanded on it as my familiarity with Go developed, it's grown to be a bit over-engineered in places). But I still think it's a worthwhile example in this discussion. For concurrency, I wouldn't say that what OP is trying to do is going to be easy in any language, because OAuth in general kind of sucks[1] the Twitter API itself has a number of quir
Read the rest
ks that make it cumbersome in general, irrespective of language[2]. That said, Go was by far the easiest to work with here, because channels allowed me to abstract the pagination and the rate-limiting in a way that it would be invisible to all callers, but "magically" handled behind the scenes. Without going into too much detail, I can see that the way OP has designed his code looks a bit cumbersome. That said, while it's a reasonable way of approaching it, I don't think it's actually the best approach in Go given the language's idioms. One other thing I want to draw attention to is the use of the general-purpose function for issuing a GET request to Twitter, and how that is shared among the various functions that use it to return values of varying, but known, types. I don't want to use the word "generic" here because people expect a certain thing when they hear that word, but I will say that this function is (A) general-purpose, and (B) type-safe - it involves no type assertions, and the functions all return concrete types instead if interface{}. [0] https://github.com/ChimeraCoder/anaconda/ [1] Don't get me started on this [2] I've written client libraries for Twitter in a few different languages, so I actually have a reasonable point of reference on this - at one point, it was my personal "hello world" for testing out a new language.
In Channels Are Not Enough
> Underscore in Go actually means something, which is why this is actually double-underscore, which makes it even visually more confusing. It also breaks the conventions for Go package names. Except for the standard library, packages should be in hostname.tld/path/to/repo e.g.: github.com/ChimeraCoder/anaconda This is convenient because the import identifier, the relative path to the package on the filesystem (using $GOPATH as the root), and the location of the package on the Web are all the same. If I saw this as an import, I would be confused as to where to go to find the canonical URL for the package.
In Underscore.go

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.