{"id":16793514,"url":"https://github.com/mdp/planeboard","last_synced_at":"2025-03-22T01:30:48.485Z","repository":{"id":57535659,"uuid":"60567379","full_name":"mdp/PlaneBoard","owner":"mdp","description":"Read your tweets on the go via DNS TXT records","archived":false,"fork":false,"pushed_at":"2016-06-13T18:56:09.000Z","size":20,"stargazers_count":83,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-18T06:51:24.365Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mdp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-06-06T23:28:05.000Z","updated_at":"2025-02-27T21:20:26.000Z","dependencies_parsed_at":"2022-08-29T00:41:01.114Z","dependency_job_id":null,"html_url":"https://github.com/mdp/PlaneBoard","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdp%2FPlaneBoard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdp%2FPlaneBoard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdp%2FPlaneBoard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdp%2FPlaneBoard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mdp","download_url":"https://codeload.github.com/mdp/PlaneBoard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244893347,"owners_count":20527575,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T08:49:31.209Z","updated_at":"2025-03-22T01:30:48.213Z","avatar_url":"https://github.com/mdp.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PlaneBoard\n#### Read your tweets, even behind captive WiFi portals, using DNS TXT records\n\n![aeropuerto](https://cloud.githubusercontent.com/assets/2868/15951028/737d6ea8-2e69-11e6-8eda-a9a82d57a0ee.png)\n\n## Quick Demo\n\nFrom your command line, lets fire up 'dig' and try it out!\n\n`dig txt p0.t.news.pb.mdp.im`\n\n## Why\n\nThis project has no serious application, it's merely a fun experiment that I prototyped while waiting on a delayed flight. There are numerous methods to tunnel traffic through DNS queries, iodine being the most popular. This is just a simple demonstration of how it's possible to get up to date, human readable information from a DNS query.\n\n## How\n\nNearly all captive portals will still proxy outbound DNS requests. We can use this proxy of DNS requests to 'leak' information we might be interested in. In this case I'm returning my Twitter stream as TXT DNS records.\n\n## Installation\n\n    git clone https://github.com/mdp/planeboard\n    cd planeboard\n    go get -u\n    go build\n    cp config.toml.sample config.toml\n    vi config.toml # Update with relevant information\n\nWhat you'll need to use this:\n\n1. An NS record pointing at the host you're running this on\n2. A [Twitter OAuth application](https://apps.twitter.com/) and it's consumer keys\n3. A Twitter account to authenticate with the Twitter OAuth application\n\n#### NS record example\n\n    pb\t\t    IN\tNS\tserver.myhost.com.\n    server\t\tIN\tA\t  192.168.1.1\n\n#### Authentication with Twitter\n\nOnce you got config.toml setup with your Twitter keys, just run `./planeboard auth` and follow the instructions. You'll get back a set of access keys tied to the Twitter account you want to read from.\n\n#### Running planeboard\n\n    sudo ./planeboard\n\n## Usage\n\nLets say I'm using pb.mdp.im as my host\n\n    # The following are example 'dig' commands you would enter on your command line\n\n    # Paginate with 'p'\n    dig txt p0.pb.mdp.im\n    # Gives me the first tweet\n    dig txt p1.pb.mdp.im\n    # Gives me the second tweet\n\n    # Toss in a 'b'(before) with a unix timestamp to help with proper pagination\n    dig txt b1465514642.p1.pb.mdp.im\n\n    # Toss in a 'c'(cachebuster) to prevent caching\n    dig txt c8y7tnpynb0.b1465514642.p0.pb.mdp.im\n\n    # Finally, you can have topics setup in config.toml to help you filter\n    # tweets into relevant groups. For example, lets say we have a 'news' topic\n    # which consists of @cnn, @ap and @nytimes. We just need to add a 't' flag\n    # and group name to the request\n    dig txt c8y7tnpynb0.b1465514642.p0.t.news.pb.mdp.im\n\n### Using the bash script 'fetch.sh'\n\nThis is all automated in [a bash script](https://github.com/mdp/PlaneBoard/blob/master/fetch.sh) to help with fetching a large number of tweets in a timeline\n\n    ./fetch.sh -t -n 20 -h pb.mdp.im news\n    # grabs 20 most recent tweets from the news topic\n\n\n## The nitty gritty details\n\nHow it works in a nutshell:\n\n- All built in Go\n- Tweets are gathered by consuming the Twitter streaming API\n- Tweets are stored in a BoltDB database\n- Inbound queries are parsed and relevant tweets are returned from the database\n\n## License\n\nMIT of course. Do with it as you please.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdp%2Fplaneboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmdp%2Fplaneboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdp%2Fplaneboard/lists"}