{"id":13436236,"url":"https://github.com/gocircuit/circuit","last_synced_at":"2025-05-15T13:08:34.411Z","repository":{"id":15909661,"uuid":"18651281","full_name":"gocircuit/circuit","owner":"gocircuit","description":"Circuit: Dynamic cloud orchestration http://gocircuit.org","archived":false,"fork":false,"pushed_at":"2023-10-18T05:43:30.000Z","size":4098,"stargazers_count":1985,"open_issues_count":13,"forks_count":154,"subscribers_count":130,"default_branch":"master","last_synced_at":"2025-04-15T05:32:06.788Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gocircuit.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,"governance":null}},"created_at":"2014-04-10T20:46:06.000Z","updated_at":"2025-04-11T10:02:44.000Z","dependencies_parsed_at":"2022-08-07T08:01:23.481Z","dependency_job_id":"107f31d9-3e28-4e20-8deb-907f413174c7","html_url":"https://github.com/gocircuit/circuit","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/gocircuit%2Fcircuit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocircuit%2Fcircuit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocircuit%2Fcircuit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocircuit%2Fcircuit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gocircuit","download_url":"https://codeload.github.com/gocircuit/circuit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254346624,"owners_count":22055808,"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-07-31T03:00:45.762Z","updated_at":"2025-05-15T13:08:29.396Z","avatar_url":"https://github.com/gocircuit.png","language":"Go","funding_links":[],"categories":["Go","Software Packages","软件包","Go Tools","Go 工具","Other Software"],"sub_categories":["Other Software","其他软件","其他软件库和软件包","Contents"],"readme":"# Circuit\n\n[![Build Status](https://drone.io/github.com/gocircuit/circuit/status.png)](https://drone.io/github.com/gocircuit/circuit/latest) [![GoDoc](https://godoc.org/github.com/gocircuit/circuit/client?status.png)](https://godoc.org/github.com/gocircuit/circuit/client)\n\n![Engineering role separation.](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/3.png)\n\n**The CIRCUIT is a new way of thinking. It is deceptively similar to existing software,\nwhile being quite different.**\n\nCircuit is a programmable platform-as-a-service (PaaS) and/or Infrastructure-as-a-Service (IaaS), \nfor management, discovery, synchronization and orchestration of services and \nhosts comprising cloud applications. \n\nCircuit was designed to enable clear, accountable and safe interface between the human engineering\nroles in a technology enterprise, ultimately increasing productivity. Engineering role separation\nin a typical circuit-based architecture is illustrated above.\n\n![A circuit-managed cloud.](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/header.png)\n\nUsers of circuit are\n\n* Operations engineers, who sustain cloud applications at host, process and network level\n* Data scientists, who develop distributed compute pipelines by linking together and distributing third-party utilities\n* Manufacturers of distributed software, who wish to codify installation and maintenance procedures in a standardized\nfashion instead of communicating them through documentation (viz. MySQL)\n\nA few technical features of circuit:\n\n* Single- and multi-datacenter out-of-the-box\n* Authentication and security of system traffic\n* TCP- and UDP multicast-based (similarly to [mDNS](http://en.wikipedia.org/wiki/Multicast_DNS)) internal node discovery\n* Zero-configuration/blind-restart for ease on the host provisioning side\n* Global, point-of-view consistent key/value space, where keys are hierarchical paths and \nvalues are control objects for data, processes, synchronizations, and so on.\n* Consistency guarantees at ultra-high churn rates of physical hosts\n* Command-line and programmatic access to the API\n* Integration with Docker\n\nIn a typical circuit scenario: \n\n* Provisioning engineers ensure newly provisioned\nmachines start the zero-configuration circuit server as a daemon on startup.\n* Operations engineers program start-up as well as dynamic-response \nbehavior via command-line tool or language bindings.\n\nAdoption considerations:\n\n* Small footprint: Circuit daemons leave almost no communication and memory footprint when left idle.\nThis makes circuit ideal for incremental adoption alongside pre-existing architectures\n* Immediate impact: Even short and simple circuit scripts save manual time going forward\n* Knowledge accounting: Circuit scripts can replace textual post-mortem reports with\nexecutable discovery, diagnosis, action and inaction recipes.\n* Circuit servers log all operations in their execution orders, enabling maximum visibility\nduring post-factum debugging and analysis.\n\nProgramming environment:\n\n* Circuit programs (sequences of invocations of the circuit API) are not\ndeclarative (as in Puppet, Chef, etc.). They are effectively imperative\nprograms in the [CSP](http://en.wikipedia.org/wiki/Communicating_sequential_processes) concurrency model,\nwhich allows engineers to encode complex dynamic response behavior, spanning multiple data centers.\n\nFind comparisons to other technologies—like Zookeeper, etcd, CoreOS, raft, Consul, Puppet, Chef, and \nso forth—in [the wiki](https://github.com/gocircuit/circuit/wiki).\n\n## Incomparable but related works\n\n* [Google Cloud Platform](https://github.com/GoogleCloudPlatform) and [Kubernetes](https://github.com/GoogleCloudPlatform/kubernetes)\n* [Hashicorp Consul](https://github.com/hashicorp/consul)\n* [Puppet](http://puppetlabs.com/)\n* [Chef](http://www.getchef.com/solutions/devops/)\n* [Ansible](http://www.ansible.com/home)\n* [CoreOS](https://coreos.com/)\n* [Apache Zookeeper](http://zookeeper.apache.org/)\n* [Polymer (Google)](http://www.polymer-project.org/)\n* [Julia (MIT)](http://julialang.org/)\n* and so on.\n\nNone of these related products sees the cluster as a closed system. In this way,\nthe circuit is different than all. This is explained in precise terms in the next section.\n\n## Integration\n\nThe circuit is a tiny server process which runs instances on a cluster of\nmachines to form an efficient, churn-resilient network, which enables distributed process orchestration\nand synchronization from any one machine.\n\nSome of the target applications of the circuit are:\n\n* Automatic dynamic orchestration of complex compute pipelines, as in numerical computation, for instance\n* Packaging and distribution of universal distributed binaries that can self-organize into complex cloud apps\n* Incremental automation of small and large OPS engineering workflows\n\nDive straight into it with the [Quick Start](https://docs.google.com/presentation/d/1x6ZqTg6AeVHMGh1ug1oqGZ9kYFLoorjRhDlTs7ytj3o/edit?usp=sharing) slide deck.\n\nFor a conceptual introduction to The Circuit, check out the\n[GopherCon 2014 Video](http://confreaks.com/videos/3421-gophercon2014-the-go-circuit-towards-elastic-computation-with-no-failures).\nSince this video was recorded, the API-via-file-system approach was abandoned\nin favor of a simpler command-line tool and a Go client library.\n\nAlso take a look at the [faux animated illustration](https://docs.google.com/presentation/d/1nazPJAmYeIvJam9oiA-6euEz3Bo9flRLqsgRU7QAlr0/edit?usp=sharing)\nof the [Advanced Tutorial: Watchbot with a back channel](https://github.com/gocircuit/circuit/tree/master/tutorial/watchbot-with-chan).\n\nThe circuit is a tool for executing and synchronizing UNIX processes across entire clusters\nby means of a command-line tool and a client library.\n\nThe circuit comes as one binary, which serves the purpose of a server\nand a command-line client.\n\n## Build ##\n\nThe Circuit comprises one small binary. It can be built for Linux and Darwin.\n\nGiven that the [Go Language](http://golang.org) compiler is [installed](http://golang.org/doc/install),\nyou can build and install the circuit binary with one line:\n\n\tgo get github.com/gocircuit/circuit/cmd/circuit\n\n## Run the servers\n\nCircuit servers can be started asynchronously (and in any order) \nusing the command\n\n\tcircuit start -if eth0 -discover 228.8.8.8:7711\n\nThe same command is used for all instances. The `-if` option specifies the\ndesired network interface to bind to, while the `-discover` command \nspecifies a desired IP address of a UDP multicast channel to be used for automatic\nserver-server discover.\n\nThe `-discover` option can be omitted by setting the environment variable\n`CIRCUIT_DISCOVER` to equal the desired multicast address.\n\n### Alternative advanced server startup \n\nTo run the circuit server on the first machine, pick a public IP address and port for it to\nlisten on, and start it like so\n\n\tcircuit start -a 10.0.0.1:11022\n\nThe circuit server will print its own circuit URL on its standard output.\nIt should look like this:\n\n\tcircuit://10.0.0.1:11022/78517/Q56e7a2a0d47a7b5d\n\nCopy it. We will need it to tell the next circuit server to “join” this one\nin a network, i.e. circuit.\n\nLog onto another machine and similarly start a circuit server there, as well.\nThis time, use the `-j` option to tell the new server to join the first one:\n\n\tcircuit start -a 10.0.0.2:11088 -j circuit://10.0.0.1:11022/78517/Q56e7a2a0d47a7b5d\n\nYou now have two mutually-aware circuit servers, running on two different\nhosts in your cluster. \n\n![A circuit system of two hosts.](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/servers.png)\n\nYou can join any number of additional hosts to the circuit environment in a\nsimilar fashion, even billions.  The circuit uses a modern [expander\ngraph](http://en.wikipedia.org/wiki/Expander_graph)-based algorithm for\npresence awareness and ordered communication, which is genuinely distributed;\nIt uses communication and connectivity sparingly, hardly leaving a footprint\nwhen idle.\n\n## Programming metaphor ##\n\nThe purpose of each circuit server is to host a collection of control\nprimitives, called _elements_, on behalf of the user. On each server the\nhosted elements are organized in a hierarchy (similarly to the file system in\nApache Zookeeper), whose nodes are called _anchors_. Anchors (akin to file\nsystem directories) have names and each anchor can host one circuit element or\nbe empty.\n\nThe hierarchies of all servers are logically unified by a global circuit root\nanchor, whose children are the individual circuit server hierarchies. A\ntypical anchor path looks like this\n\n\t/X317c2314a386a9db/hi/charlie\n\nThe first component of the path is the ID of the circuit server hosting the leaf anchor.\n\nExcept for the circuit root anchor (which does not correspond to any\nparticular circuit server), all other anchors can store a _process_ or a\n_channel_ element, at most one, and additionally can have any number of sub-\nanchors. In a way, anchors are like directories that can have any number of\nsubdirectories, but at most one file.\n\nCreating and interacting with circuit elements is the mechanism through which\nthe  user controls and reflects on their distributed application.\nThis can be accomplished by means of the included Go client library, or using\nthe command-line tool embodied in the circuit executable itself.\n\nProcess elements are used to execute, monitor and synchronize OS-level\nprocesses at the hosting circuit server. They allow visibility and control\nover OS processes from any machine in the circuit cluster, regardless\nof the physical location of the underlying OS process.\n\nChannel elements are a synchronization primitive, similar to the channels in Go,\nwhose send and receive sides are accessible from any location in the\ncircuit cluster, while their data structure lives on the circuit server hosting\ntheir anchor.\n\n## Use ##\n\nOnce the circuit servers are started, you can create, observe and control\ncircuit elements (i) interactively—using the circuit binary which doubles as a command-line client—as\nwell as (ii) programmatically—using the circuit Go client package `github.com/gocircuit/circuit/client`.\nIn fact, the circuit command-line tool is simply a front-end for the Go client library.\n\nClients (the tool or your own) _dial into_ a circuit server in order to\ninteract with the entire system. All servers are equal citizens in every respect and,\nin particular, any one can be used as a choice for dial-in.\n\n![Circuit client connected to a server](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/client.png)\n\nThe tool (described in more detail later) is essentially a set of commands that\nallow you to traverse the global hierarchical namespace of circuit elements,\nand interact with them, somewhat similarly to how one uses the Zookeeper\nnamespace.\n\nFor example, to list the entire circuit cluster anchor hierarchy, type in\n\n\tcircuit ls /\n\nSo, you might get something like this in response\n\n\t/X88550014d4c82e4d\n\t/X938fe923bcdef2390\n\nThe two root-level anchors correspond to the two circuit servers.\n\n![Circuit servers correspond to root-level anchors](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/serveranchor.png)\n\n### Pointing the tool to your circuit cluster ###\n\nBefore you can use the `circuit` tool, you need to tell it how to locate\none circuit server for us a _dial-in_ point.\n\nThere are two ways to provide the dial-in server address to the tool:\n\n1. If the circuit servers were started with the `-discover` option or the\n`CIRCUIT_DISCOVER` environment variable, the command-line tool\ncan use the same methods for finding a circuit server. E.g.\n\n\tcircuit ls -discover 228.8.8.8:7711 /...\n\nOr,\n\n\texport CIRCUIT_DISCOVER=228.8.8.8:7711\n\tcircuit ls /...\n\n2. With the command-line option `-d`, like e.g.\n\n\t\tcircuit ls -d circuit://10.0.0.1:11022/78517/Q56e7a2a0d47a7b5d /\n\nOr, equivalently, by setting the environment variable `CIRCUIT` to point to a file\nwhose contents is the desired dial-in address. For example, (in bash):\n\n\t\techo circuit://10.0.0.1:11022/78517/Q56e7a2a0d47a7b5d \u003e ~/.circuit\n\t\texport CIRCUIT=\"~/.circuit\"\n\t\tcircuit ls /\n\nA list of available tool commands is shown on the help screen\n\n\tcircuit help\n\nA more detailed explanation of their meaning and function can be found\nin the documentation of the client package, `github.com/gocircuit/client`.\n\n### Example: Make a process ###\n\nHere are a few examples. To run a new process on some chosen\ncluster machine, first see what machines are available:\n\n\tcircuit ls /...\n\t/X88550014d4c82e4d\n\t/X938fe923bcdef2390\n\nRun a new `ls` process:\n\n\tcircuit mkproc /X88550014d4c82e4d/pippi \u003c\u003c EOF\n\t{\n\t\t\"Path\": \"/bin/ls\", \n\t\t\"Args\":[\"/\"]\n\t}\n\tEOF\n\n![Process elements execute OS processes on behalf of the user](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/mkproc.png)\n\nSee what happened:\n\n\tcircuit peek /X88550014d4c82e4d/pippi\n\nClose the standard input to indicate no intention to write to it:\n\n\tcat /dev/null | circuit stdin /X88550014d4c82e4d/pippi\n\nRead the output (note that the output won't show until you close \nthe standard input first, as shown above):\n\n\tcircuit stdout /X88550014d4c82e4d/pippi\n\nRemove the process element from the anchor hierarchy\n\n\tcircuit scrub /X88550014d4c82e4d/pippi\n\n### Example: Make a docker container ###\n\nMuch like for the case of OS processes, the circuit can create, manage and synchronize [Docker](http://www.docker.com) containers,\nand attach the corresponding _docker elements_ to a path in the anchor file system.\n\nTo allow creation of docker elements, any individual server must be started with the `-docker` switch. For instance:\n\n\tcircuit start -if eth0 -discover 228.8.8.8:7711 -docker\n\nTo create and execute a new docker container, using the tool:\n\n\tcircuit mkdkr /X88550014d4c82e4d/docky \u003c\u003c EOF\n\t{\n\t\t\"Image\": \"ubuntu\",\n\t\t\"Memory\": 1000000000,\n\t\t\"CpuShares\": 3,\n\t\t\"Lxc\": [\"lxc.cgroup.cpuset.cpus = 0,1\"],\n\t\t\"Volume\": [\"/webapp\", \"/src/webapp:/opt/webapp:ro\"],\n\t\t\"Dir\": \"/\",\n\t\t\"Entry\": \"\",\n\t\t\"Env\": [\"PATH=/usr/bin\"],\n\t\t\"Path\": \"/bin/ls\",\n\t\t\"Args\": [\"/\"],\n\t}\n\tEOF\n\nMost of these fields can be omitted analogously to their command-line option counterparts \nof the `docker` command-line tool.\n\n![Docker elements are like processes](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/mkdkr.png)\n\nThe remaining docker element commands are identical to those for processes:\n`stdin`, `stdout`, `stderr`, `peek` and `wait`. In one exception, `peek` will return\na detailed description of the container, derived from `docker inspect`. \n\n### Example: Create a channel ###\n\nAgain, take a look at what servers are available:\n\n\tcircuit ls /...\n\t/X88550014d4c82e4d\n\t/X938fe923bcdef2390\n\nPick one. Say `X88550014d4c82e4d`. Now, \nlet's create a channel on `X88550014d4c82e4d`:\n\n\tcircuit mkchan /X88550014d4c82e4d/this/is/charlie 3\n\nThe last argument of this line is the channel buffer capacity,\nanalogously to the way channels are created in Go.\n\n![Channel elements reside in the memory of a circuit server](https://raw.githubusercontent.com/gocircuit/circuit/master/misc/img/mkchan.png)\n\nVerify the channel was created:\n\n\tcircuit peek /X88550014d4c82e4d/this/is/charlie\n\nThis should print out something like this:\n\n\t{\n\t\t\t\"Cap\": 3,\n\t\t\t\"Closed\": false,\n\t\t\t\"Aborted\": false,\n\t\t\t\"NumSend\": 0,\n\t\t\t\"NumRecv\": 0\n\t}\n\nSending a message to the channel is accomplished with the command\n\n\tcircuit send /X88550014d4c82e4d/this/is/charlie \u003c some_file\n\nThe contents of the message is read out from the standard input of the\ncommand above. This command will block until a receiver is available,\nunless there is free space in the channel buffer for a message.\n\nWhen the command unblocks, it will send any data to the receiver.\nIf there is no receiver, but there is a space in the message buffer,\nthe command will also unblock and consume its standard input (saving\nit for an eventual receiver) but only up to 32K bytes.\n\nReceiving is accomplished with the command\n\n\tcircuit recv /X88550014d4c82e4d/this/is/charlie\n\nThe received message will be produced on the standard output of \nthe command above.\n\n### Example: Make a DNS server element ###\n\nCircuit allows you to create and dynamically configure one or more DNS\nserver elements on any circuit server.\n\nAs before, pick an available circuit server, say `X88550014d4c82e4d`.\nCreate a new DNS server element, like so\n\n\tcircuit mkdns /X88550014d4c82e4d/mydns\n\nThis will start a new DNS server on the host of the given circuit server,\nbinding it to an available port. Alternatively, you can supply an\nIP address argument specifying the bind address, as in\n\n\tcircuit mkdns /X88550014d4c82e4d/mydns 127.0.0.1:7711\n\nEither way, you can always retrieve the address on which the DNS server\nis listening by peeking into the corresponding circuit element:\n\n\tcircuit peek /X88550014d4c82e4d/mydns\n\nThis command will produce an output similar to this\n\n\t{\n\t    \"Address\": \"127.0.0.1:7711\",\n\t    \"Records\": {}\n\t}\n\nOnce the DNS server element has been created, you can add resource records\nto it, one at a time, using\n\n\tcircuit set /X88550014d4c82e4d/mydns \"miek.nl. 3600 IN MX 10 mx.miek.nl.\"\n\nResource records use the canonical syntax, described in various RFCs.\nYou can find a list of such RFCs as well as examples in the DNS Go library\nthat underlies our implementation: `github.com/miekg/dns/dns.go`\n\nAll records, associated with a given name can be removed with a single command:\n\n\tcircuit unset /X88550014d4c82e4d/mydns miek.nl.\n\nThe current set of active records can be retrieved by peeking into the element:\n\n\tcircuit peek /X88550014d4c82e4d/mydns\n\nAssuming that a name has multiple records associated with it, peeking would produce\nan output similar to this one:\n\n\t{\n\t\t\"Address\": \"127.0.0.1:7711\",\n\t\t\"Records\": {\n\t\t\t\"miek.nl.\": [\n\t\t\t\t\"miek.nl.\\t3600\\tIN\\tMX\\t10 mx.miek.nl.\",\n\t\t\t\t\"miek.nl.\\t3600\\tIN\\tMX\\t20 mx2.miek.nl.\"\n\t\t\t]\n\t\t}\n\t}\n\n### Example: Listen on server join and leave announcements ###\n\nThe circuit provides two special element types `@join` and `@leave`, \ncalled _subscriptions_. Their job is to notify you when new\ncircuit servers join the systems or others leave it.\nBoth of them behave like receive-only channels.\n\n\tcircuit mk@join /X88550014d4c82e4d/watch/join\n\tcircuit mk@leave /X88550014d4c82e4d/watch/leave\n\nThe join subscription delivers a new message each time a cicruit server joins\nthe system. The received message holds the anchor path of the new server.\n\n\tcircuit recv /X88550014d4c82e4d/watch/join\n\nSimilarly, the leave subscription delivers a new message each time\na circuit server disappears from the system.\n\n\tcircuit peek /X88550014d4c82e4d/watch/join\n\n## Be creative ##\n\nThe circuit allows for unusual flexibilities in process orchestration.\nTake a look, for instance, at the two “watchbot” tutorials which demonstrate\nhow to implement a semi-resilient self-sustained mechanism within \na cluster. Find the simpler one here\n\n\thttps://github.com/gocircuit/circuit/tree/master/tutorial/watchbot\n\nAnd the more elaborate one, which demonstrate use of channels, here\n\n\thttps://github.com/gocircuit/circuit/tree/master/tutorial/watchbot-with-chan\n\n## Security ##\n\nBy default, circuit servers and clients communicate over plaintext TCP.\nA HMAC-based symmetric authentication, followed by an asymmetric\nRC4 stream cipher is supported.\n\nTo enable encryption, use the `-hmac` command-line option to point\nthe circuit executable to a file containing the private key for your circuit.\nFor instance:\n\n\tcircuit start -a 10.0.0.1 -hmac .hmac\n\nOr, if you are invoking the tool:\n\n\tcircuit ls -hmac .hmac /...\n\nAlternatively, you can set the environment `CIRCUIT_HMAC` to\npoint to the private key file.\n\nTo generate a new private key for your circuit, use the command\n\n\tcircuit keygen\n\n## Networking ##\n\nFrom a networking and protocol standpoint, circuit servers and\nclients are peers: All communications (server-server and server-client)\nuse a common RPC framework which often entails a server\nbeing able to reverse-dial into a client.\n\nFor this reason, circuit clients (the circuit tool or your apps) CANNOT\nbe behind a firewall with respect to the servers they are dialing into.\n\n# Learn more #\n\nAsk questions to [The Circuit User Group](https://groups.google.com/forum/#!forum/gocircuit-user).\n\nThe Go client for writing circuit apps is package\n\n\tgithub.com/gocircuit/circuit/client\n\nThe public interface of this package is self-contained. Other\npackages in the circuit repo are internal.\n\nTutorials can be found within the client package directory\n\n\tgithub.com/gocircuit/circuit/client/tutorial\n\nAdditionally, the circuit binary directory contains the implementation\nof the circuit tool, which is itself built using the client and is another\ncomprehensive example of a circuit app. It can be found in\n\n\tgithub.com/gocircuit/circuit/cmd/circuit\n\nTo stay up to date with new developments, documentation and articles, follow\nThe Circuit Project on Twitter [@gocircuit](https://twitter.com/gocircuit) or\nme [@maymounkov](https://twitter.com/maymounkov).\n\n## Donate with a tweet ##\n\nPlease, tweet about the circuit (mention [@gocircuit](https://twitter.com/gocircuit)).\nTweets are a much appreciated donation and they help us and our sponsors\ngauge the interest in this unconventional idea.\n\n## Sponsors and credits\n\n* [DARPA XDATA](http://www.darpa.mil/Our_Work/I2O/Programs/XDATA.aspx) initiative, 2012–2014\n* [Data Tactics Corp](http://www.data-tactics.com/), 2012-2014\n* [L3](http://www.l-3com.com/), 2014\n* [Tumblr, Inc.](http://tumblr.com), 2012\n\n## Featured\n\n* [DARPA](http://www.darpa.mil) [Open Catalog](http://www.darpa.mil/opencatalog/), Arlington, VA, 2014\n* [GOPHERCON 2014](http://confreaks.com/videos/3421-gophercon2014-the-go-circuit-towards-elastic-computation-with-no-failures) Denver, CO\n* [STRANGELOOP 2013](http://blog.gocircuit.org/strangeloop-2013), St. Louis, MO\n\n## Bibliography\n\n* [Old Circuit website, original white papers and design documents](http://gocircuit-org.appspot.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgocircuit%2Fcircuit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgocircuit%2Fcircuit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgocircuit%2Fcircuit/lists"}