<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="http://kivik.io/feed.xml" rel="self" type="application/atom+xml" /><link href="http://kivik.io/" rel="alternate" type="text/html" /><updated>2023-10-26T22:26:02+02:00</updated><id>http://kivik.io/feed.xml</id><title type="html">Kivik</title><subtitle>CouchDB and PouchDB library for Golang and GopherJS
</subtitle><entry><title type="html">Kivik v4.0 is out!</title><link href="http://kivik.io/kivik-v4-released" rel="alternate" type="text/html" title="Kivik v4.0 is out!" /><published>2023-10-26T00:00:00+02:00</published><updated>2023-10-26T00:00:00+02:00</updated><id>http://kivik.io/v4.0-released</id><content type="html" xml:base="http://kivik.io/kivik-v4-released">&lt;p&gt;Three and a half years since the last major release of Kivik, I’m happy to announce the latest major update to &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v4.0.1&quot;&gt;Kivik, version 4.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kivik 4.0 includes a number of breaking changes compared to the 3.x series, as well as a number of other improvements and organizational changes.&lt;/p&gt;

&lt;p&gt;Here are some highlights:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The iterator interface has been improved, particularly when passing multiple queries to a view.&lt;/li&gt;
  &lt;li&gt;The various official Kivik drivers have been integrated in to the main module.&lt;/li&gt;
  &lt;li&gt;Options are now functional options, rather than a plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map[string]interface{}&lt;/code&gt; as before.&lt;/li&gt;
  &lt;li&gt;An effort has been made to make different functions with similar result types more consistent.&lt;/li&gt;
  &lt;li&gt;Kivik now implements the CouchDB replication protocol. This means you can manage your own replications (in contrast to simply asking CouchDB to trigger a replication for you). This is most useful for backups or when bootstrapping your CouchDB instance, as you can now replicate between CouchDB and a filesystem!&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kivik&lt;/code&gt; command line tool has been added, which allows you to interact with CouchDB more easily from the command line. Tired of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt;ing to configure and test CouchDB? Try the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kivik&lt;/code&gt; CLI tool instead!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href=&quot;https://github.com/go-kivik/kivik#changes-from-3x-to-4x&quot;&gt;project README&lt;/a&gt; for a more complete list of breaking changes, especially if you are upgrading from Kivik 3.&lt;/p&gt;

&lt;p&gt;Of course, just because Kivik 4 is out, doesn’t mean I’m out of ideas for improving it. I still have big plans, and will continue to chip away at them as time permits.  A few things I hope to make progress on in the coming months:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Support for &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/450&quot;&gt;full text search&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Continue to flesh out the filesystem and in-memory drivers&lt;/li&gt;
  &lt;li&gt;Improve the replication protocol implementation. The current version works, but doesn’t use all of the efficiency gains made possible with a full implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And of course, I’ll continue to respond to bug reports and feature requests, as I receive them.&lt;/p&gt;

&lt;p&gt;Thanks for using Kivik and CouchDB!&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">Three and a half years since the last major release of Kivik, I’m happy to announce the latest major update to Kivik, version 4.0.</summary></entry><entry><title type="html">Kivik v4.0.0-rc1 released</title><link href="http://kivik.io/kivik-v4rc1" rel="alternate" type="text/html" title="Kivik v4.0.0-rc1 released" /><published>2023-09-26T00:00:00+02:00</published><updated>2023-09-26T00:00:00+02:00</updated><id>http://kivik.io/v4rc1</id><content type="html" xml:base="http://kivik.io/kivik-v4rc1">&lt;p&gt;I’m happy to announce a new major release of Kivik is on the way.  &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/4.0.0-rc1&quot;&gt;v4.0.0-rc1&lt;/a&gt; has been released. Anyone interested is encouraged to test this release, and report any bugs before a final release is published, within a week or two.&lt;/p&gt;

&lt;p&gt;This is a major release, and does represent a breaking change, and includes several improvements as well. Here is a brief overview of the main highlights:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The multiple Kivik repositories have been integrated into the main repo&lt;/li&gt;
  &lt;li&gt;Options are now functional options, rather than a plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map[string]interface{}&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;The API for iterating over query results has been improved and made more consistent across various methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href=&quot;https://github.com/go-kivik/kivik#changes-from-3x-to-4x&quot;&gt;project README&lt;/a&gt; for a more complete list of breaking changes.&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">I’m happy to announce a new major release of Kivik is on the way. v4.0.0-rc1 has been released. Anyone interested is encouraged to test this release, and report any bugs before a final release is published, within a week or two.</summary></entry><entry><title type="html">New kivik CLI tool</title><link href="http://kivik.io/kivik-cli-pre-release" rel="alternate" type="text/html" title="New kivik CLI tool" /><published>2021-04-27T00:00:00+02:00</published><updated>2021-04-27T00:00:00+02:00</updated><id>http://kivik.io/kivik-cli-tool</id><content type="html" xml:base="http://kivik.io/kivik-cli-pre-release">&lt;p&gt;I’m happy to announce a new experimental CLI tool, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kivik&lt;/code&gt;, which is designed to simplify interaction with CouchDB servers.&lt;/p&gt;

&lt;p&gt;Feel free to grab the most recent binaries from the &lt;a href=&quot;https://github.com/go-kivik/xkivik/releases&quot;&gt;releases&lt;/a&gt; page and try it out, or read the &lt;a href=&quot;https://github.com/go-kivik/xkivik/blob/master/cmd/kivik/README.md&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;While debugging, experimenting with, or administrating CouchDB, I found the repetitive use of long &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; commands to be toilsome. I’ve also found the flexibliyt of tools like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl&lt;/code&gt; to be informative (i.e. supporting both JSON, YAML, and arbitrary output formats). And finally, I have often longed for a simple CouchDB analog to tools like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_dump&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_restore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This tool aims to satisfy all of these itches.&lt;/p&gt;

&lt;h2 id=&quot;key-features&quot;&gt;Key features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Easier to use than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; for interacting with CouchDB&lt;/li&gt;
  &lt;li&gt;Supports both JSON and YAML inputs&lt;/li&gt;
  &lt;li&gt;Supports JSON, YAML, and custom template outpus&lt;/li&gt;
  &lt;li&gt;Allows replication between filesystem directories and CouchDB servers&lt;/li&gt;
  &lt;li&gt;Supports retrys, to easily detect when a server becomes available&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;development-status&quot;&gt;Development status&lt;/h2&gt;

&lt;p&gt;While I believe the features most likely to be useful are implemented, some features are still completely unimplemented (see the &lt;a href=&quot;TODO.md&quot;&gt;TODO list&lt;/a&gt;). There are also likely bugs, as well as inconsistencies. &lt;a href=&quot;https://github.com/go-kivik/xkivik/issues&quot;&gt;Bug reports&lt;/a&gt; are very welcome!&lt;/p&gt;

&lt;p&gt;All feedback is welcome!&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">I’m happy to announce a new experimental CLI tool, kivik, which is designed to simplify interaction with CouchDB servers.</summary></entry><entry><title type="html">Kivik v3.2.0 released with cluster membership support</title><link href="http://kivik.io/v3_2-released" rel="alternate" type="text/html" title="Kivik v3.2.0 released with cluster membership support" /><published>2020-07-10T00:00:00+02:00</published><updated>2020-07-10T00:00:00+02:00</updated><id>http://kivik.io/v3.2-released</id><content type="html" xml:base="http://kivik.io/v3_2-released">&lt;p&gt;Today, Kivik 3.2.0 was tagged and released.  This release adds a single minor
feature: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Membership()&lt;/code&gt; method, which allows access to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/_membership&lt;/code&gt;
endpoint on CouchDB 2.x and newer.&lt;/p&gt;

&lt;p&gt;I needed this for a project at work, where we need to programmatically query all
nodes in cluster.&lt;/p&gt;

&lt;p&gt;I initially opted not to include this in Kivik, as it felt more like a
system-administration task, but my mind was changed when I needed it in
production.&lt;/p&gt;

&lt;p&gt;The packages affected by this update:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;kivik&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v3.2.0&quot;&gt;v3.2.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;couchdb&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/couchdb/releases/tag/v3.2.0&quot;&gt;v3.2.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kivikmock&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivikmock/releases/tag/v3.2.0&quot;&gt;v3.2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">v3.2.0 supports the /_membership endpoint</summary></entry><entry><title type="html">Kivik v3.1.0 released with partitioned queries</title><link href="http://kivik.io/v3_1-released" rel="alternate" type="text/html" title="Kivik v3.1.0 released with partitioned queries" /><published>2020-05-02T00:00:00+02:00</published><updated>2020-05-02T00:00:00+02:00</updated><id>http://kivik.io/v3.1-released</id><content type="html" xml:base="http://kivik.io/v3_1-released">&lt;p&gt;Today, Kivik 3.1.0 is finally tagged and released.  This release adds two major
features, and punts on a third:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Partitioned queries, as introduced with &lt;a href=&quot;https://docs.couchdb.org/en/latest/whatsnew/3.0.html&quot;&gt;CouchDB 3.0&lt;/a&gt; are now possible.&lt;/p&gt;

    &lt;p&gt;This did require a small breaking change, as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Find()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Explain()&lt;/code&gt;,
 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CreateIndex()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetIndexes()&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DeleteIndex()&lt;/code&gt; now take optional
 (variadic) options. For normal usage, no change is necessary, but if you’ve
 defined an interface with these methods, or otherwise depend on the exact
 function signature, your code may need to be updated to use this new
 version.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Kivik and the CouchDB driver now support sending &lt;a href=&quot;https://docs.couchdb.org/en/stable/api/ddoc/views.html#sending-multiple-queries-to-a-view&quot;&gt;multiple queries to a view
with a single request&lt;/a&gt;.
Although this feature has existed in some form or another for ages (since at
least version 1.7–the oldest I tested), I had never added support to Kivik.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And finally, I have decided to punt on one additional major feature added to
CouchDB 3.0: &lt;a href=&quot;https://docs.couchdb.org/en/master/ddocs/search.html&quot;&gt;full text search&lt;/a&gt;.
The reason this isn’t covered in this release is simply that I don’t have a
convenient way to test it. The official distribution cannot be deployed in a
simple Docker container, so setting up a local test environment would be
non-trivial, and automated testing would be very difficult.&lt;/p&gt;

&lt;p&gt;Having said that, I would welcome a pull request, if you have the means to add
and test this functionality.&lt;/p&gt;

&lt;p&gt;The packages affected by this update:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;kivik&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v3.1.0&quot;&gt;v3.1.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;couchdb&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/couchdb/releases/tag/v3.1.0&quot;&gt;v3.1.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kivikmock&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivikmock/releases/tag/v3.1.0&quot;&gt;v3.1.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kiviktest&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kiviktest/releases/tag/v3.1.0&quot;&gt;v3.1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pouchdb&lt;/code&gt; driver is unaffected by these changes, and remains at v3.0.x for
now.&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">v3.1.0 supports new CouchDB 3 features</summary></entry><entry><title type="html">Upcoming Kivik changes for CouchDB 3.x</title><link href="http://kivik.io/kivik-support-couchdb3" rel="alternate" type="text/html" title="Upcoming Kivik changes for CouchDB 3.x" /><published>2020-02-29T00:00:00+01:00</published><updated>2020-02-29T00:00:00+01:00</updated><id>http://kivik.io/couchdb3</id><content type="html" xml:base="http://kivik.io/kivik-support-couchdb3">&lt;p&gt;Earlier this week CouchDB 3.0.0 was &lt;a href=&quot;https://blog.couchdb.org/2020/02/26/3-0/&quot;&gt;released&lt;/a&gt;! This represents a big step forward, with several exciting new features.&lt;/p&gt;

&lt;h2 id=&quot;good-news-and-bad-news&quot;&gt;Good news and bad news&lt;/h2&gt;

&lt;p&gt;The good news for Kivik users is that the Kivik 3.0.0 integration test suite passes with flying colors against CouchDB 3.0.0, with no changes at all. This means that if you’re using Kivik 3.x (or 2.x) and choose to upgrade your CouchDB installation to 3.0.0, you won’t need to make any changes to your client code.&lt;/p&gt;

&lt;p&gt;The bad news, though, is that none of the new API endpoints of CouchDB 3.0.0 are yet supported by Kivik. But I aim to remedy that quickly with a release of Kivik 3.1.0. Any features of CouchDB 3.0.0 that do not require API endpoint changes &lt;em&gt;should&lt;/em&gt; work automatically with Kivik, though they have not been explicitly tested. If you discover something is not working, please &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/new&quot;&gt;report a bug&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;upcoming-changes-to-kivik&quot;&gt;Upcoming changes to Kivik&lt;/h2&gt;

&lt;p&gt;Here is a high-level outline of the new features in CouchDB, and plans for inclusion in Kivik. Your feedback is welcome, to help shape these new features of Kivik (please comment freely on the linked GitHub issues).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.couchdb.org/en/stable/api/ddoc/views.html#api-ddoc-view-multiple-queries&quot;&gt;Multiple query requests&lt;/a&gt; – &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/447&quot;&gt;Kivik issue #447&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;Kivik currently has four view methods: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocs()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDocs()&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DesignDocs()&lt;/code&gt;. Duplicating all of these to include multi-query variants seems like a heavy API change, for what is likely to be a rarely-used feature. For this reason, the two options I’m most seriously considering at the moment are:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocs()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDocs()&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DesignDocs()&lt;/code&gt;, making it possible to query these views via &lt;a href=&quot;https://pkg.go.dev/github.com/go-kivik/kivik/v3?tab=doc#DB.Query&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query()&lt;/code&gt;&lt;/a&gt; (possibly by specifying an empty &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddoc&lt;/code&gt; argument, and passing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_all_docs&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_local&lt;/code&gt;, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_design&lt;/code&gt;, respectively, as the view name).  Then adding a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Queries()&lt;/code&gt; method will seem natural.&lt;/li&gt;
      &lt;li&gt;Adding the same functionality as above, but keeping at least &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocs()&lt;/code&gt;, and possibly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalDocs()&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DesignDocs()&lt;/code&gt; as simple convenience functions. This seems attractive, given that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocs()&lt;/code&gt; is one of the most commonly used methods in Kivik code I have seen.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Please leave your opinion, or alternate suggestions, on the &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/447&quot;&gt;Kivik issue&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.couchdb.org/en/stable/api/partitioned-dbs.html#db-partition-partition&quot;&gt;Partitioned queries&lt;/a&gt; – &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/448&quot;&gt;Kivik issue #448&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;The semantics of new partitioned queries are identical to the existing view queries, they just require one additional URL component: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_partition/{partition}&lt;/code&gt;.  Three possible approaches come to mind:&lt;/p&gt;

    &lt;ol&gt;
      &lt;li&gt;Create new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Partition&lt;/code&gt; variants of each query metho. e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocsPartition&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QueryPartition&lt;/code&gt;, etc.&lt;/li&gt;
      &lt;li&gt;Accept the partition as part of the view ID. e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query(ctx, &quot;ddoc&quot;, &quot;_partition/123/view&quot;)&lt;/code&gt; This will only work with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query()&lt;/code&gt;, but in conjunction with the proposed changes to support multiple query requests, this could work.&lt;/li&gt;
      &lt;li&gt;Accepting a partition option. e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDocs(kivik.Options{&quot;_partition&quot;:&quot;123})&lt;/code&gt;&lt;/li&gt;
    &lt;/ol&gt;

    &lt;p&gt;I am leaning toward the third option. I believe it has two compelling advantages:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;It doesn’t clutter the Kivik API with any new methods.&lt;/li&gt;
      &lt;li&gt;It would be 100% backward compatible with the current API.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;And one minor disadvantage:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Using an option to change the fundamental behavior of a query seems a bit icky. But it’s not entirely &lt;a href=&quot;https://pkg.go.dev/github.com/go-kivik/couchdb/v3?tab=doc#hdr-Options&quot;&gt;without precedent&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;I believe the most natural way to implement this would be by adding a new constant to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;couchdb&lt;/code&gt; driver package:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  // Partition specifies the name of a partition, and causes a partition-bound query.
  Partition = &quot;kivik:partition&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.couchdb.org/en/stable/api/ddoc/search.html&quot;&gt;Full Text Search&lt;/a&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/450&quot;&gt;Kivik issue #450&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;I believe this will be pretty straight forward. I intend to add three new methods:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Search()&lt;/code&gt;, the analog to &lt;a href=&quot;https://pkg.go.dev/github.com/go-kivik/kivik/v3?tab=doc#DB.Query&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Query()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://pkg.go.dev/github.com/go-kivik/kivik/v3?tab=doc#DB.Find&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Find()&lt;/code&gt;&lt;/a&gt;, will be used to perform search queries.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SearchInfo()&lt;/code&gt; will be used for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_search_info&lt;/code&gt; endpoint&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SearchAnalyze&lt;/code&gt; will be the analog to &lt;a href=&quot;https://pkg.go.dev/github.com/go-kivik/kivik/v3?tab=doc#DB.Explain&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Explain&lt;/code&gt;&lt;/a&gt; for mango queries.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And finally, a couple of new features I probably won’t be implementing in Kivik, because they are primarily used for maintenance, and thus the value of a Go SDK seems dubious. But if you feel otherwise, please let me know by commenting on the appropriate issue in GitHub, and I will be happy to re-consider.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.couchdb.org/en/stable/api/server/common.html#api-server-name&quot;&gt;Node queries&lt;/a&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/452&quot;&gt;Kivik issue #452&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.couchdb.org/en/stable/cluster/sharding.html#cluster-sharding-splitting-shards&quot;&gt;Resharding&lt;/a&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/449&quot;&gt;Kivik issue #449&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sums up the upcoming changes for Kivik 3.1.0. Depending on time, and the complexity of implementing the multi-query requests, I anticipate having a release ready by mid-April.&lt;/p&gt;

&lt;p&gt;Opinions, comments, and of course, pull requests, are welcome from all!&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">Kivik 3.0 works with CouchDB 3, but still lacks support for new features.</summary></entry><entry><title type="html">Kivik v3.0.0 released</title><link href="http://kivik.io/v3-released" rel="alternate" type="text/html" title="Kivik v3.0.0 released" /><published>2020-02-16T00:00:00+01:00</published><updated>2020-02-16T00:00:00+01:00</updated><id>http://kivik.io/v3-released</id><content type="html" xml:base="http://kivik.io/v3-released">&lt;p&gt;Today, Kivik 3.0.0 is finally tagged and stable, with only one minor bug fix since the final pre-release announced in December.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;kivik&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v3.0.0&quot;&gt;v3.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;couchdb&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/couchdb/releases/tag/v3.0.0&quot;&gt;v3.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pouchdb&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/pouchdb/releases/tag/v3.0.0&quot;&gt;v3.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kivikmock&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivikmock/releases/tag/v3.0.0&quot;&gt;v3.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kiviktest&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kiviktest/releases/tag/v3.0.0&quot;&gt;v3.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kivik v3.0.0 is functionally identical to v2.0.0. The only difference is that it has been configured to support Go modules. As such, Go 1.9 and 1.10 are no longer supported, as they do not support Go modules. See the &lt;a href=&quot;http://kivik.io/v2-released&quot;&gt;v2 release notes&lt;/a&gt; for a list of changes from v1.&lt;/p&gt;

&lt;p&gt;For any projects compiled with GopherJS, the new dependence on Go modules means a little extra effort is needed.  I have detailed this in a brief tutorial on &lt;a href=&quot;https://jhall.io/posts/gopherjs-with-modules/&quot;&gt;Using GopherJS with Go Modules&lt;/a&gt;.&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">v3.0.0 is finally here</summary></entry><entry><title type="html">Kivik v2.0.0 released</title><link href="http://kivik.io/v2-released" rel="alternate" type="text/html" title="Kivik v2.0.0 released" /><published>2020-02-09T00:00:00+01:00</published><updated>2020-02-09T00:00:00+01:00</updated><id>http://kivik.io/v2-released</id><content type="html" xml:base="http://kivik.io/v2-released">&lt;p&gt;Today, Kivik 2.0.0 is finally tagged and stable, with only one minor bug fix since the final pre-release announced in December.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;kivik&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v2.0.0&quot;&gt;v2.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;couchdb&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/couchdb/releases/tag/v2.0.0&quot;&gt;v2.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pouchdb&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/pouchdb/releases/tag/v2.0.0&quot;&gt;v2.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kivikmock&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivikmock/releases/tag/v2.0.0&quot;&gt;v2.0.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kiviktest&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kiviktest/releases/tag/v2.0.0&quot;&gt;v2.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Highlights for this release are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;An improved API.&lt;/li&gt;
  &lt;li&gt;Support for many newer features of CouchDB, such as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_local_docs&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_design_docs&lt;/code&gt;,, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_ping&lt;/code&gt; endpoints.&lt;/li&gt;
  &lt;li&gt;Extended support for existing features of CouchDB, such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_bulk_get&lt;/code&gt;, multi-part get requests, improved support for replication features, etc.&lt;/li&gt;
  &lt;li&gt;A number of bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more extensive (but by no means exhaustive) list of changes follows.&lt;/p&gt;

&lt;h3 id=&quot;breaking-changes&quot;&gt;Breaking changes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#New&quot;&gt;New()&lt;/a&gt; no longer takes a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;context.Context&lt;/code&gt; argument.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Rows.Key&quot;&gt;Rows.Key()&lt;/a&gt; now returns the raw JSON for the key, rather than unquoting it.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kivik.Method*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kivik.Status*&lt;/code&gt; constants were removed. Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.Method*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.Status*&lt;/code&gt; instead.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.DB&quot;&gt;Client.DB()&lt;/a&gt; now defers errors until the next method call.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.Get&quot;&gt;DB.Get()&lt;/a&gt; now defers errors until the next method call.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.DBUpdates&quot;&gt;Client.DBUpdates()&lt;/a&gt; now takes a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;context.Context&lt;/code&gt; argument.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.BulkDocs&quot;&gt;DB.BulkDocs()&lt;/a&gt; now takes a slice of documents, rather than an empty interface.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.GetAttachmentMeta&quot;&gt;DB.GetAttachmentMeta()&lt;/a&gt; no longer takes a rev argument, which was redundant with options.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Attachment&quot;&gt;Attachment&lt;/a&gt; type is completely re-designed.&lt;/li&gt;
  &lt;li&gt;Replaced the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DB.Rev()&lt;/code&gt; method with &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.GetMeta&quot;&gt;DB.GetMeta()&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;additions&quot;&gt;Additions:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.Err&quot;&gt;DB.Err()&lt;/a&gt; method to explicitly check a deferred error.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Attachment&quot;&gt;Attachment&lt;/a&gt; type now includes the RevPos and Digest fields, needed for replication.&lt;/li&gt;
  &lt;li&gt;Kivik-generated errors now provide the &lt;a href=&quot;https://golang.org/pkg/errors/#Unwrap&quot;&gt;Unwrap&lt;/a&gt; method, introduced in Go 1.13.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.RevsDiff&quot;&gt;DB.RevsDiff()&lt;/a&gt; method, needed for replication.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.Config&quot;&gt;Client.Config()&lt;/a&gt;, &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.ConfigSection&quot;&gt;Client.ConfigSection()&lt;/a&gt;, &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.ConfigValue&quot;&gt;Client.ConfigValue()&lt;/a&gt;, &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.SetConfigValue&quot;&gt;Client.SetConfigValue()&lt;/a&gt;, and &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.DeleteConfigKey&quot;&gt;Client.DeleteConfigKey()&lt;/a&gt; methods, to manage server configuration.&lt;/li&gt;
  &lt;li&gt;Changes feed now reports the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Changes.ETag&quot;&gt;ETag&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.Close&quot;&gt;Client.Close()&lt;/a&gt; and &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.Close&quot;&gt;DB.Close()&lt;/a&gt; methods.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.ClusterSetup&quot;&gt;Client.ClusterSetup()&lt;/a&gt; and &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.ClusterStatus&quot;&gt;Client.ClusterStatus()&lt;/a&gt; methods.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.Ping&quot;&gt;Client.Ping()&lt;/a&gt; method.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.BulkGet&quot;&gt;DB.BulkGet()&lt;/a&gt; method.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.LocalDocs&quot;&gt;DB.LocalDocs()&lt;/a&gt; and &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.DesignDocs&quot;&gt;DB.DesignDocs()&lt;/a&gt; methods.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#DB.Purge&quot;&gt;DB.Purge()&lt;/a&gt; method.&lt;/li&gt;
  &lt;li&gt;Added the &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#Client.DBsStats&quot;&gt;Client.DBsStats()&lt;/a&gt; method.&lt;/li&gt;
  &lt;li&gt;Added the experimental &lt;a href=&quot;https://https://pkg.go.dev/github.com/go-kivik/kivik/v3#AttachmentsIterator&quot;&gt;AttachmentsIterator&lt;/a&gt; type, for use with multi-part get requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kivik 3.0.0 should follow very shortly (within hours or days), and will be identical to Kivik 2.0.0, except that it will be configured for use with &lt;a href=&quot;https://github.com/golang/go/wiki/Modules&quot;&gt;Go modules&lt;/a&gt;.&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">v2.0.0 is finally here</summary></entry><entry><title type="html">(Probably) final 2.0.0 pre-release, and v3 announcement</title><link href="http://kivik.io/final-v2-prerelease" rel="alternate" type="text/html" title="(Probably) final 2.0.0 pre-release, and v3 announcement" /><published>2019-12-16T00:00:00+01:00</published><updated>2019-12-16T00:00:00+01:00</updated><id>http://kivik.io/final-v2-prerelease</id><content type="html" xml:base="http://kivik.io/final-v2-prerelease">&lt;p&gt;Today I tagged what I expect to be the final pre-release of all core Kivik packages:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;kivik&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/kivik/releases/tag/v2.0.0-pre3&quot;&gt;v2.0.0-pre3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;couchdb&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/couchdb/releases/tag/v2.0.0-pre4&quot;&gt;v2.0.0-pre4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pouchdb&lt;/strong&gt; – &lt;a href=&quot;https://github.com/go-kivik/pouchdb/releases/tag/v2.0.0-pre3&quot;&gt;v2.0.0-pre3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kivikmock&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kivikmock/releases/tag/v2.0.0-pre3&quot;&gt;v2.0.0-pre3&lt;/a&gt; (unchanged)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;kiviktest&lt;/strong&gt; - &lt;a href=&quot;https://github.com/go-kivik/kiviktest/releases/tag/v2.0.0-pre4&quot;&gt;v2.0.0-pre4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I expect to tag the final &lt;strong&gt;v2.0.0&lt;/strong&gt; version within a couple of weeks, unless bug reports come in.&lt;/p&gt;

&lt;p&gt;Here I would also like to announce that at roughly the same time, I intend to release &lt;strong&gt;v3.0.0&lt;/strong&gt;. v3.0.0 will be identical to v2.0.0, except that it will support &lt;a href=&quot;https://github.com/golang/go/wiki/Modules&quot;&gt;Go modules&lt;/a&gt;.  I could make that change along with the &lt;strong&gt;v2.0.0&lt;/strong&gt; release, but this could stand to break anyone using a v2.0.0 pre-release, and although that wouldn’t strictly violate the compatibility guarantee, since these are, after all, pre-releases, I believe it will be the smoothest upgrade path. And version numbers are free, after all!&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">v2.0.0 (and v3.0.0) is almost here</summary></entry><entry><title type="html">The Future of Kivik</title><link href="http://kivik.io/vision" rel="alternate" type="text/html" title="The Future of Kivik" /><published>2019-07-10T00:00:00+02:00</published><updated>2019-07-10T00:00:00+02:00</updated><id>http://kivik.io/vision</id><content type="html" xml:base="http://kivik.io/vision">&lt;p&gt;With a stable release of Kivik 2.0 coming soon, it seemed like a good time to
share my vision of the Kivik future. This also comes after a brief conversation
with a small number of would-be open-source contributors, looking for guidance
in contributing to the project. I feel the first step toward that goal is to
explain my vision of the future.&lt;/p&gt;

&lt;p&gt;Some of what I will discuss here was already mentioned &lt;a href=&quot;http://kivik.io/announcing-kivik-couchdb-pouchdb-golang&quot;&gt;back in 2017&lt;/a&gt;
when Kivik was first announced. But as one would expect over 2.5 years, it has
become more specific, and some things have changed–not least of all, the
current state of Kivik.&lt;/p&gt;

&lt;h3 id=&quot;modular-design&quot;&gt;Modular design&lt;/h3&gt;

&lt;p&gt;From the beginning, I’ve had the idea of making Kivik a modular project. This is
probably most apparent in the way that drivers are interchangeable, but this
modularity can extend to consumers of Kivik, as well.&lt;/p&gt;

&lt;figure&gt;
&lt;img alt=&quot;Kivik's modular design&quot; src=&quot;/img/kivik-diagram.png&quot; sizes=&quot;(max-width: 90%) 100vw, 90%&quot; style=&quot;display: block; margin-left: auto; margin-right: auto; width: 90%;&quot; /&gt;
&lt;figcaption&gt;✅ = Exists or possible today&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In the end, my vision is that Kivik may provide a sort of swiss army knife for
building CouchDB tools and applications. A few possible applications for Kivik,
once this goal is reached, could include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The ability to build apps in Go/GopherJS, which use CouchDB for database
storage. This is possible today.&lt;/li&gt;
  &lt;li&gt;Easily bootstrap CouchDB instnaces. Historically we have had a number of
ad-hoc tools to do this, including &lt;a href=&quot;https://github.com/couchapp/couchapp&quot;&gt;couchapp&lt;/a&gt;
and others. None have felt very feature rich or well maintained to me (if I’m
wrong, please let me know!)&lt;/li&gt;
  &lt;li&gt;Run an in-memory database for testing purposes. With the addition of an HTTP
server for Kivik, the application being tested doesn’t even need to be written
in Go.&lt;/li&gt;
  &lt;li&gt;Dump files from CouchDB to your local disk as JSON or YAML files&lt;/li&gt;
  &lt;li&gt;A nice command-line tool to interact with CouchDB from the console, or in
shell scripts.&lt;/li&gt;
  &lt;li&gt;Build a custom HTTP proxy in Go, to handle authentication or other custom
logic.&lt;/li&gt;
  &lt;li&gt;And maybe even eventually, with additional backend stores, maybe even put a
CouchDB façade on top of MySQL, S3, or DynamoDB, for applications with low
performance requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the chart above, I hope it is apparent how these outcomes, and likely many
others, should be possible.  But there is a lot to be done, so where to start?&lt;/p&gt;

&lt;h4 id=&quot;tooling&quot;&gt;Tooling&lt;/h4&gt;

&lt;p&gt;&lt;img alt=&quot;Tools&quot; src=&quot;/img/tools.png&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; height=&quot;248&quot; width=&quot;300&quot; style=&quot;float: right;&quot; /&gt;
The priority for me lately, has been to focus on tooling. I recently finished
the &lt;a href=&quot;https://github.com/go-kivik/kivikmock&quot;&gt;kivikmock&lt;/a&gt; library to facilitate
testing, which has been a big boost to productivity (no longer relying on a
Docker install of CouchDB for all tests).&lt;/p&gt;

&lt;p&gt;I’ve also recently added the bare essentials to the &lt;a href=&quot;https://github.com/go-kivik/fsdb&quot;&gt;fsdb&lt;/a&gt;
driver to allow replicating from an on-disk collection of JSON/YAML files to
a live CouchDB server. This has made bootstraping new databases many times
easier for me. But there’s much room for improvement.&lt;/p&gt;

&lt;p&gt;My next mid-term goal is to build a command-line tool which provides a simple
interface to CouchDB and the Filesystem driver. I actually began an experimental
version of this project &lt;a href=&quot;https://github.com/go-kivik/kouch&quot;&gt;here&lt;/a&gt;, but after
initial learnings, intend to start from scratch.&lt;/p&gt;

&lt;p&gt;Initial project goals include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The ability to easily GET and PUT individual documents and attachments.&lt;/li&gt;
  &lt;li&gt;The ability to easily query views&lt;/li&gt;
  &lt;li&gt;The ability to read and set security objects&lt;/li&gt;
  &lt;li&gt;The ability to configure server parameters&lt;/li&gt;
  &lt;li&gt;The ability to dump a database via replication to the filesystem&lt;/li&gt;
  &lt;li&gt;The ability to bootstrap a database, via replication from the filesystem&lt;/li&gt;
  &lt;li&gt;The ability to consume and produce JSON and YAML, translating to JSON when
sending to CouchDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideally, the tool should make any manual interaction with CouchDB easier than it
presently is with cURL, and also add the option to replicate to/from the
filesystem.  Naturally, this means the Filesystem driver needs to be fleshed out.&lt;/p&gt;

&lt;h4 id=&quot;http-server&quot;&gt;HTTP Server&lt;/h4&gt;

&lt;p&gt;A longer-term goal is to build a fully-capable HTTP server driven by Kivik. Some
basic functionality along these lines already exists in the &lt;a href=&quot;https://github.com/go-kivik/kivikd&quot;&gt;kivikd&lt;/a&gt; package, but it’s far from complete.&lt;/p&gt;

&lt;p&gt;Once the Filesystem driver is complete, adding a full HTTP server in front will
make it possible to run a stand-alone Kivik server, which could stand in for a
CouchDB server for testing or light-weight loads. I find this prospect
especially exciting once the Memory driver is complete, as it would allow any
developer, in any language, to run a small, self-contained memory-only CouchDB
instance for testing, either on their local machine, or in a CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;This also has long-term possibilities with the addition of future storage
backends for Kivik. Suppose a DynamoDB backend is written, then certain small
apps might be able to take advantage of CouchDB’s replication protocol, but
using AWS-managed infrastructure, rather than managing their own CouchDB
installation.&lt;/p&gt;

&lt;h4 id=&quot;other-possibilities&quot;&gt;Other Possibilities&lt;/h4&gt;

&lt;p&gt;The logical implications of a modular system like Kivik I think are broad. No
doubt there are possible applications I have not considered. Rather than
documenting all possible use cases, I think the prudent course is to focus on
the areas with the greatest possible benefit in the short-term.&lt;/p&gt;

&lt;h3 id=&quot;help-wanted&quot;&gt;Help Wanted&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;Tools&quot; src=&quot;/img/helpwanted.png&quot; sizes=&quot;(max-width: 251px) 100vw, 251px&quot; height=&quot;160&quot; width=&quot;251&quot; style=&quot;float: left;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Up to now, this has been driven by my own needs for testing and tooling, and
I have been the primary contributor.&lt;/p&gt;

&lt;p&gt;But now I’d love to get some greater community involvement, particularly in
choosing the area of focus.&lt;/p&gt;

&lt;p&gt;If this project intrigues you, here are some areas where some help could go a
long way:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Discussion&lt;/strong&gt; No coding necessary! If you are a current user of Kivik, or
find the future of Kivik promising, your input can help shape the direction.
The CLI needs to be designed, and direction on the next features needs to be
decided. You can weigh in!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt; I’ve tried to keep things fully documented, but there’s
plenty of room for additional documentation, especially with regard to code
samples on the wiki.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Coding&lt;/strong&gt; If you’re a Go coder, and think this project sounds interesting,
your help could be very valuable in bringing this vision to reality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get involved, you can &lt;a href=&quot;https://github.com/go-kivik/kivik/issues/new&quot;&gt;submit an issue&lt;/a&gt;
or stop by the &lt;a href=&quot;https://gophers.slack.com/messages/kivik/&quot;&gt;#kivik channel on Gophers Slack&lt;/a&gt;.&lt;/p&gt;</content><author><name>Jonathan Hall</name></author><summary type="html">My vision is that Kivik may provide a sort of swiss army knife for building CouchDB tools and applications.</summary></entry></feed>