github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/CHANGELOG.md (about)

     1  <a name="v0.10.0"></a>
     2  # [v0.10.0](https://github.com/qri-io/qri/compare/v0.9.13...v) (2021-05-04)
     3  
     4  Welcome to the long awaited `0.10.0` Qri release! We've focused on usability and bug fixes, specifically surrounding massive improvements to saving a dataset, the  HTTP API, and the `lib` package interface. We've got a few new features (step-based transform execution, change reports over the api, progress bars on save, and a new component: Stats) and you should see an obvious change based on the speed, reliability, and usability in Qri, especially when saving a new version of a dataset.
     5  
     6  ## Massive Improvements to Save performance
     7  We've drastically improved the reliability and scalability of saving a dataset on Qri. Qri uses a bounded block of memory while saving, meaning it will only consume roughly a MAX of 150MB of memory while saving, regardless of how large your dataset is. This means the max size of dataset you can save is no longer tied to your available memory.
     8  
     9  We've had to change some underlying functionality to get the scalability we want, to that end we no longer calculate `Structure.Checksum`, we no longer calculate commit messages for datasets over a certain size, and we no longer store all the error values found when validating the body of a dataset.
    10  
    11  ## API Overhaul
    12  Our biggest change has been a complete overhaul of our API.
    13  
    14  We wanted to make our API easier to work with by making it more consistent across endpoints. After a great deal of review & discussion, this overhaul introduces an RPC-style centric API that expects JSON `POST` requests, plus a few `GET` requests we're calling "sugar" endpoints.
    15  
    16  The RPC part of our api is an HTTP pass-through to our lib methods. This makes working with qri over HTTP the _same_ as working with Qri as a library. We've spent a lot of time building & organizing qri's `lib` interface, and now all of that same functionality is exposed over HTTP. The intended audience for the RPC API are folks who want to automate qri across process boundaries, and still have very fine grained control. Think "command line over HTTP".
    17  
    18  At the same time, however, we didn't want to lose a number of important-to-have endpoints, like being able to `GET` a dataset body via just a URL string, so we've moved all of these into a "sugar" API, and made lots of room to grow. We'll continue to add convenience-oriented endpoints that make it easy to work with Qri. The "sugar" API will be oriented to users who are prioritizing fetching data from Qri to use elsewhere.
    19  
    20  We also noticed how quickly our open api spec fell out of date, so we decided to start generating our spec using the code itself. Take a look at our [open api spec](https://github.com/qri-io/qri/blob/master/api/open_api_3.yaml), for a full list of supported JSON endpoints.
    21  
    22  Here is our full API spec, supported in this release:
    23  
    24  ## API Spec
    25  
    26  ### Sugar
    27  
    28  The purpose of the API package is to expose the lib.RPC api *and* add syntatic sugar for mapping RESTful HTTP requests to lib method calls
    29  
    30  | endpoint                                                       | HTTP methods    | Lib Method Name                  |
    31  | -------------------------------------------------------------- | --------------- | -------------------------------- |
    32  | "/"                                                            | GET             | api.HealthCheckHandler           |
    33  | "/health"                                                      | GET             | api.HealthCheckHandler           |
    34  | "/qfs/ipfs/{path:.*}"                                          | GET             | qfs.Get                          |
    35  | "/webui"                                                       | GET             | api.WebuiHandler                 |
    36  | /ds/get/{username}/{name}                                      | GET             | api.GetHandler                   |
    37  | /ds/get/{username}/{name}/at/{path}                            | GET             | api.GetHandler                   |
    38  | /ds/get/{username}/{name}/at/{path}/{component}                | GET             | api.GetHandler                   |
    39  | /ds/get/{username}/{name}/at/{path}/body.csv                   | GET             | api.GetHandler                   |
    40  
    41  
    42  ### RPC
    43  
    44  The purpose of the lib package is to expose a uniform interface for interacting with a qri instance
    45  
    46  | endpoint                                 | Return Type         | Lib Method Name                  |
    47  | ---------------------------------------- | ------------------- | -------------------------------- |
    48  |                                          |                     |                                  |
    49  | Aggregate Endpoints                      |                     |                                  |
    50  | "/list"                                  | []VersionInfo       | collection.List?                 |
    51  | "/sql"                                   | [][]any             | sql.Exec                         |
    52  | "/diff"                                  | Diff                | diff.Diff                        |
    53  | "/changes"                               | ChangeReport        | diff.Changes                     |
    54  |                                          |                     |                                  |
    55  | Access Endpoints                         |                     |                                  |
    56  | "/access/token"                          | JSON Web Token      | access.Token                     |
    57  |                                          |                     |                                  |
    58  | Automation Endpoints                     |                     |                                  |
    59  | "/auto/apply"                            | ApplyResult         | automation.apply                 |
    60  |                                          |                     |                                  |
    61  | Dataset Endpoints                        |                     |                                  |
    62  | "/ds/componentstatus"                    | []Status            | dataset.ComponentStatus          |
    63  | "/ds/get                                 | GetResult           | dataset.Get                      |
    64  | "/ds/activity"                           | []VersionInfo       | dataset.History                  |
    65  | "/ds/rename"                             | VersionInfo         | dataset.Rename                   |
    66  | "/ds/save"                               | dataset.Dataset     | dataset.Save                     |
    67  | "/ds/pull"                               | dataset.Dataset     | dataset.Pull                     |
    68  | "/ds/push"                               | DSRef               | dataset.Push                     |
    69  | "/ds/render"                             | []byte              | dataset.Render                   |
    70  | "/ds/remove"                             | RemoveResponse      | dataset.Remove                   |
    71  | "/ds/validate"                           | ValidateRes         | dataset.Validate                 |
    72  | "/ds/unpack"                             | Dataset             | dataset.Unpack                   |
    73  | "/ds/manifest"                           | Manifest            | dataset.Manifest                 |
    74  | "/ds/manifestmissing"                    | Manifest            | dataset.ManifestMissing          |
    75  | "/ds/daginfo"                            | DagInfo             | dataset.DagInfo	            |
    76  |                                          |                     |                                  |
    77  | Peer Endpoints                           |                     |                                  |
    78  | "/peer"                                  | Profile             | peer.Info                        |
    79  | "/peer/connect"                          | Profile             | peer.Connect                     |
    80  | "/peer/disconnect"                       | Profile             | peer.Disconnect                  |
    81  | "/peer/list"                             | []Profile           | peer.Profiles                    |
    82  |                                          |                     |                                  |
    83  | Profile Endpoints                        |                     |                                  |
    84  | "/profile"                               | Profile             | profile.GetProfile               |
    85  | "/profile/set"                           | Profile             | profile.SetProfile               |
    86  | "/profile/photo"                         | Profile             | profile.ProfilePhoto             |
    87  | "/profile/poster"                        | Profile             | profile.PosterPhoto              |
    88  |                                          |                     |                                  |
    89  | Remote Endpoints                         |                     |                                  |
    90  | "/remote/feeds"                          | Feed                | remote.Feeds                     |
    91  | "/remote/preview"                        | Dataset             | remote.Preview                   |
    92  | "/remote/remove"                         |  -                  | remote.Remove                    |
    93  | "/remote/registry/profile/new"           | Profile             | registry.CreateProfile           |
    94  | "/remote/registry/profile/prove"         | Profile             | registry.ProveProfile            |
    95  | "/remote/search"                         | SearchResult        | remote.Search                    |
    96  |                                          |                     |                                  |
    97  |                                          |                     |                                  |
    98  | Working Directory Endpoints              |                     |                                  |
    99  | "/wd/status"                             | []StatusItem        | fsi.Status                       |
   100  | "/wd/init"                               | DSRef               | fsi.Init                         |
   101  | "/wd/caninitworkdir"                     | --                  | fsi.CanInitworkdir               |
   102  | "/wd/checkout"                           | --                  | fsi.Checkout                     |
   103  | "/wd/restore"                            | --                  | fsi.Restore                      |
   104  | "/wd/write"                              | []StatusItem        | fsi.Write                        |
   105  | "/wd/createlink"                         | VersionInfo         | fsi.CreateLink                   |
   106  | "/wd/unlink"                             | string              | fsi.Unlink                       |
   107  | "/wd/ensureref"                          | --                  | fsi.EnsureRefNotLinked           |
   108  |                                          |                     |                                  |
   109  
   110  ## Redesigned lib interface
   111  In general, we've streamlined the core functionality and reconciled input params in the `lib` package (which contain the methods and params that power both the api and cmd), so that no matter how you are accessing functionality in qri, whether using `lib` as a package,  using the HTTP API, or using the command line, you can expect consistent inputs and–more importantly–consistent behavior. We're also utilizing our new `dispatch` pattern to replace our old rpc client with the _same_ JSON HTTP API exposed to users. That way all our API's, HTTP or otherwise have the same expectations. If something is broke in one place, it is broken in all places, consequently, when it is fixed in one place it will be fixed in all places!
   112  
   113  These changes will also help us in our upcoming challenges to refine expand the notion of identity inside of Qri.
   114  
   115  ## Stats Component!
   116  We've added a new component: Stats! Stats is a component that contains statistical metadata about the body of a dataset. Stats are now automatically calculated and saved with each new version.
   117  
   118  Its purpose is to provide an "at a glance" summary of a dataset, calculating statistics on columns (ok, on "compound data types", but it's much easier to think about column stats). In order to remain fast for very large dataset sizes, we have opted to calculate the stats using probabilistic structures. Stats are an important part of change reports, and allow you to get a sense of what is different in a dataset body without having to examine that body line by line. 
   119  
   120  For earlier versions that don't have stats calculated, we've added a `qri stats` command that will calculate the new stats component for you.
   121  
   122  ## Other features:
   123  ### Change report over API
   124  We've added an endpoint to get the change report via the api: `/changes`, laying the groundwork for future User Interfaces that can report on changes between versions.
   125  
   126  ### Access and Oauth
   127  We're working towards making qri-core able to handle multiple users on the same node (AKA multi-tenancy). In preparation for multi-tenancy, we are adding support for generating JSON web tokens (JWTs) that will help ensure identity on the network. You can generate an access token via the cmd using the `qri access` command, or over the api using the `/access/token` endpoint.
   128  
   129  ### Apply Command
   130  You can now use the `qri apply` command to "dry run" and de-bug transforms! Use the `--file` flag to apply a new `transform.star` file, use a dataset reference to re-run an already existing transform on an already existing dataset, or use both to apply a new tranform to an already existing dataset. The resulting dataset is output to the terminal. To run the transform and save the results as a new commit, use the `--apply` flag in the `qri save` command.
   131  
   132  ### Progress bars
   133  Qri has been fine tuned to handle larger datasets faster. Regardless of how fast your dataset is saving, we want to be able to track any progress. Now, when saving a new dataset or a new version of a dataset, the command line will show you a progress bar.
   134  
   135  ### `qri version`
   136  To help with debugging, the `qri version` command now comes chock full of details, including the qri version, the build time, and the git summary. (developers: you need to use `make build` now instead of `go build`!)
   137  
   138  ### dependancy updates:
   139  We've also released updated to our dependencies: [dag](https://github.com/qri-io/dag/releases/tag/v0.2.2), [qfs](https://github.com/qri-io/qfs/releases/tag/v0.6.0), [deepdiff](https://github.com/qri-io/deepdiff/releases/tag/v0.2.1), [dataset](https://github.com/qri-io/dataset/releases/tag/v0.3.0). Take a look at those release notes to learn about other bug fixes and stability enhancements that Qri is inheriting.
   140  
   141  ### BREAKING CHANGES
   142  * **api:** complete API overhaul. Check out the full api spec for all changes(https://github.com/qri-io/qri/issues/1731)
   143  
   144  ### Bug Fixes
   145  
   146  * **api:** `handleRefRoutes` should refer to `username` rather than ([644f706](https://github.com/qri-io/qri/commit/644f706))
   147  * **api:** Allow OPTIONS header so that CORS is available ([e067500](https://github.com/qri-io/qri/commit/e067500))
   148  * **api:** denyRPC only affects RPC, HTTP can still be used ([b6298ce](https://github.com/qri-io/qri/commit/b6298ce))
   149  * **api:** Fix unmarshal bug in api test ([0234f30](https://github.com/qri-io/qri/commit/0234f30))
   150  * **api:** fix vet error ([afbe53e](https://github.com/qri-io/qri/commit/afbe53e))
   151  * **api:** handle OPTIONS requests on refRoute handlers ([395d5ae](https://github.com/qri-io/qri/commit/395d5ae))
   152  * **api:** health & root endpoints use middleware, which handles OPTIONS ([5f421eb](https://github.com/qri-io/qri/commit/5f421eb))
   153  * **apply:** bad API endpoint for apply over HTTP ([c5cc840](https://github.com/qri-io/qri/commit/c5cc840))
   154  * **base.ListDatasets:** support -1 limit to list all datasets ([bd2f831](https://github.com/qri-io/qri/commit/bd2f831))
   155  * **base.SaveDataset:** move logbook write operation back down from lib ([a00f1b8](https://github.com/qri-io/qri/commit/a00f1b8))
   156  * **changes:** "left" side of report should be the previous path ([32b46ff](https://github.com/qri-io/qri/commit/32b46ff))
   157  * **changes:** column renames are properly handled now ([c306e41](https://github.com/qri-io/qri/commit/c306e41))
   158  * **cmd:** nil pointer dereference in `PrintProgressBarsOnEvents` ([b0a2ec0](https://github.com/qri-io/qri/commit/b0a2ec0))
   159  * **dispatch:** Add default source resolver to Attributes ([e074bf4](https://github.com/qri-io/qri/commit/e074bf4))
   160  * **dispatch:** Calls that return only 1 value can work across RPC ([ceefeaa](https://github.com/qri-io/qri/commit/ceefeaa))
   161  * **dispatch:** Comments clarifying Methods and Attributes ([33222c6](https://github.com/qri-io/qri/commit/33222c6))
   162  * **dispatch:** Dispatch for transform. Transformer instead of Service ([24562c5](https://github.com/qri-io/qri/commit/24562c5))
   163  * **dispatch:** Fix code style and get tests passing ([4cdb3f5](https://github.com/qri-io/qri/commit/4cdb3f5))
   164  * **dispatch:** Fix for fsi plumbing commands, to work over http ([8070537](https://github.com/qri-io/qri/commit/8070537))
   165  * **dispatch:** MethodSet interface to get name for dispatch ([9b73d4b](https://github.com/qri-io/qri/commit/9b73d4b))
   166  * **dispatch:** send source over wire and cleanup attr definitions ([8a2ddf8](https://github.com/qri-io/qri/commit/8a2ddf8))
   167  * **dispatch:** Use dispatcher interface for DatasetMethods ([201edda](https://github.com/qri-io/qri/commit/201edda))
   168  * **dispatch:** When registering, compare methods to impl ([c004812](https://github.com/qri-io/qri/commit/c004812))
   169  * **dsfs:** fix adjustments to meta prior to commit message generation ([365cbb9](https://github.com/qri-io/qri/commit/365cbb9))
   170  * **dsfs:** LoadDataset using the mux filesystem. Error if nil ([75215be](https://github.com/qri-io/qri/commit/75215be))
   171  * **dsfs:** remove dataset field computing deadlock ([ef615a9](https://github.com/qri-io/qri/commit/ef615a9))
   172  * **dsfs:** set script paths before generating commit messages ([8174996](https://github.com/qri-io/qri/commit/8174996))
   173  * **fill:** Map keys are case-insensitive, handle maps recursively ([ab27f1b](https://github.com/qri-io/qri/commit/ab27f1b))
   174  * **fsi:** fsi.ReadDir sets the '/fsi' path prefix ([3d64468](https://github.com/qri-io/qri/commit/3d64468))
   175  * **http:** expect json requests to decode, if the body is not empty ([c50ea28](https://github.com/qri-io/qri/commit/c50ea28))
   176  * **http:** fix httpClient error checking ([6f4567e](https://github.com/qri-io/qri/commit/6f4567e))
   177  * **init:** TargetDir for init, can be absolute, is created if needed ([55c9ff6](https://github.com/qri-io/qri/commit/55c9ff6))
   178  * **key:** fix local keystore key.ID encoding, require ID match keys ([a469b6e](https://github.com/qri-io/qri/commit/a469b6e))
   179  * **lib:** Align input params across all lib methods ([7ba26b6](https://github.com/qri-io/qri/commit/7ba26b6))
   180  * **lib:** don't ignore serialization errors when getting full datasets ([64abb7e](https://github.com/qri-io/qri/commit/64abb7e))
   181  * **lib:** Improve context passing and visibility of internal structs ([8f6509b](https://github.com/qri-io/qri/commit/8f6509b))
   182  * **list:** List datasets even if some refs have bad profileIDs ([11b6763](https://github.com/qri-io/qri/commit/11b6763))
   183  * **load:** Fix spec test to exercise LoadDataset ([f978ec7](https://github.com/qri-io/qri/commit/f978ec7))
   184  * **logbook:** commit timestamps overwrite run timestamps in logs ([2ab44d0](https://github.com/qri-io/qri/commit/2ab44d0))
   185  * **logbook:** Logsync validates that ref has correct profileID ([153c4b9](https://github.com/qri-io/qri/commit/153c4b9))
   186  * **logbook:** remove 'stranded' log histories on new dataset creation ([2412a40](https://github.com/qri-io/qri/commit/2412a40))
   187  * **mux:** allow api mux override ([eccdf9b](https://github.com/qri-io/qri/commit/eccdf9b))
   188  * **oas:** add open api spec tests to CI and makefile ([e91b50b](https://github.com/qri-io/qri/commit/e91b50b))
   189  * **p2p:** dag `MissingManifest` sigfaults if there is a nil manifest ([04ec5b2](https://github.com/qri-io/qri/commit/04ec5b2))
   190  * **p2p:** qri bootstrap addrs config migration ([0680097](https://github.com/qri-io/qri/commit/0680097))
   191  * **prove:** Prove command updates local logbook as needed ([b09a2eb](https://github.com/qri-io/qri/commit/b09a2eb))
   192  * **prove:** Store the original KeyID on config.profile ([88214a4](https://github.com/qri-io/qri/commit/88214a4))
   193  * **pull:** Pull uses network resolver. Fixes integration test. ([d049958](https://github.com/qri-io/qri/commit/d049958))
   194  * **remote:** always send progress completion on client push/pull events ([afcb2f8](https://github.com/qri-io/qri/commit/afcb2f8))
   195  * **repo:** Don't use blank path for new repo in tests ([1ec8e74](https://github.com/qri-io/qri/commit/1ec8e74))
   196  * **routes:** skip over endpoints that are DenyHTTP ([ee7d882](https://github.com/qri-io/qri/commit/ee7d882))
   197  * **rpc:** unregister dataset methods ([6a2b213](https://github.com/qri-io/qri/commit/6a2b213))
   198  * **run:** fix unixnano -> *time.Time conversion, clean up transform logging ([c903657](https://github.com/qri-io/qri/commit/c903657))
   199  * **save:** Remove dry-run, recall, return-body from save path ([fac37da](https://github.com/qri-io/qri/commit/fac37da))
   200  * **search:** Dispatch for search ([8570abf](https://github.com/qri-io/qri/commit/8570abf))
   201  * **sql:** Fix sql command for arm build ([#1783](https://github.com/qri-io/qri/issues/1783)) ([2ae1541](https://github.com/qri-io/qri/commit/2ae1541))
   202  * **sql:** Fix sql command for other 32-bit platforms ([704d9fb](https://github.com/qri-io/qri/commit/704d9fb))
   203  * **startf/ds.set_body:** infer structure when ds.set_body is called ([a8a3492](https://github.com/qri-io/qri/commit/a8a3492))
   204  * **stats:** close accumulator to finalize output ([1b7f4f1](https://github.com/qri-io/qri/commit/1b7f4f1))
   205  * **test:** fix api tests to consume refstr ([e03ef3a](https://github.com/qri-io/qri/commit/e03ef3a))
   206  * **token:** `claim` now includes `ProfileID` ([8dd40e4](https://github.com/qri-io/qri/commit/8dd40e4))
   207  * **transform:** don't duplicate transform steps on save ([8ace963](https://github.com/qri-io/qri/commit/8ace963))
   208  * **transform:** don't write to out streams when nil, use updated preview.Create ([28651cb](https://github.com/qri-io/qri/commit/28651cb))
   209  * **version:** add warning when built with 'go install' ([1063a71](https://github.com/qri-io/qri/commit/1063a71))
   210  
   211  
   212  ### Features
   213  
   214  * **api:** change report API ([ca16f3c](https://github.com/qri-io/qri/commit/ca16f3c))
   215  * **api:** GiveAPIServer attachs all routes to api ([ea2d4ad](https://github.com/qri-io/qri/commit/ea2d4ad))
   216  * **api:** read oauth tokens to request context ([f024b26](https://github.com/qri-io/qri/commit/f024b26))
   217  * **apply:** Apply command, and --apply flag for save ([c01a4bf](https://github.com/qri-io/qri/commit/c01a4bf))
   218  * **bus:** Subscribe to all, or by ID. "Type" -> "Topic" ([cc139bc](https://github.com/qri-io/qri/commit/cc139bc))
   219  * **cmd:** add access command ([1c56680](https://github.com/qri-io/qri/commit/1c56680))
   220  * **dispatch:** Abs paths on inputs to dispatch methods ([a19efcc](https://github.com/qri-io/qri/commit/a19efcc))
   221  * **dispatch:** Dispatch func can return 1-3 values, 2 being Cursor ([304f7c5](https://github.com/qri-io/qri/commit/304f7c5))
   222  * **dispatch:** Method attributes contain http endpoint and verb ([0036cb7](https://github.com/qri-io/qri/commit/0036cb7))
   223  * **dsfs:** compute & store stats component at save time ([3ff3b75](https://github.com/qri-io/qri/commit/3ff3b75))
   224  * **httpClient:** introducing an httpClient ([#1629](https://github.com/qri-io/qri/issues/1629)) ([8ecde53](https://github.com/qri-io/qri/commit/8ecde53))
   225  * **keystore:** keystore implmenetation ([#1602](https://github.com/qri-io/qri/issues/1602)) ([205165a](https://github.com/qri-io/qri/commit/205165a))
   226  * **lib:** attach active user to scope ([608540a](https://github.com/qri-io/qri/commit/608540a))
   227  * **lib:** Create Auth tokens using inst.Access() ([3be7af2](https://github.com/qri-io/qri/commit/3be7af2))
   228  * **lib:** Dispatch methods call, used by FSI ([afaf06d](https://github.com/qri-io/qri/commit/afaf06d))
   229  * **list:** Add ProfileID restriction option to List ([774fa06](https://github.com/qri-io/qri/commit/774fa06))
   230  * **logbook:** add methods for writing transform run ops ([7d0cb91](https://github.com/qri-io/qri/commit/7d0cb91))
   231  * **profile:** ResolveProfile replaces CanonicalizeProfile ([7bd848b](https://github.com/qri-io/qri/commit/7bd848b))
   232  * **prove:** Prove a new keypair for an account, set original profileID ([6effbea](https://github.com/qri-io/qri/commit/6effbea))
   233  * **run:** run package defines state of a transform run ([8e69e5e](https://github.com/qri-io/qri/commit/8e69e5e))
   234  * **save:** emit save events. Print progress bars on save ([3c979ed](https://github.com/qri-io/qri/commit/3c979ed))
   235  * **save:** recall transform on empty --apply, write run operations ([3949be9](https://github.com/qri-io/qri/commit/3949be9))
   236  * **save:** support custom timestamps on commit ([e8c18fa](https://github.com/qri-io/qri/commit/e8c18fa))
   237  * **sql:** Disable sql command on 32-bit arm to fix compilation ([190b5cb](https://github.com/qri-io/qri/commit/190b5cb))
   238  * **stats:** overhaul stats service interface, implement os stats cache ([2128a0c](https://github.com/qri-io/qri/commit/2128a0c))
   239  * **stats:** stats based on sketch/probabalistic data structures ([f6191c8](https://github.com/qri-io/qri/commit/f6191c8))
   240  * **transform:** Add runID to transform. Publish some events. ([5ceac77](https://github.com/qri-io/qri/commit/5ceac77))
   241  * **transform:** emit DatasetPreview event after startf transform step ([28bb8b0](https://github.com/qri-io/qri/commit/28bb8b0))
   242  * **validate:** Parameters to methods will Validate automatically ([7bb1515](https://github.com/qri-io/qri/commit/7bb1515))
   243  * **version:** add details reported by "qri version" ([e6a0a67](https://github.com/qri-io/qri/commit/e6a0a67))
   244  * **vesrion:** add json format output for version command ([ad4dcc7](https://github.com/qri-io/qri/commit/ad4dcc7))
   245  * **websocket:** publish dataset save events to websocket event connections ([378e922](https://github.com/qri-io/qri/commit/378e922))
   246  
   247  
   248  ### Performance Improvements
   249  
   250  * **dsfs:** don't calculate commit descriptions if title and message are set ([f5ec420](https://github.com/qri-io/qri/commit/f5ec420))
   251  * **save:** improve save performance, using bounded memory ([7699f02](https://github.com/qri-io/qri/commit/7699f02))
   252  
   253  
   254  
   255  <a name="v0.9.13"></a>
   256  # [v0.9.13](https://github.com/qri-io/qri/compare/v0.9.12...v0.9.13) (2020-10-12)
   257  
   258  Patch v0.9.13 brings improvments to the `validate` command, and lays the groundwork for OAuth within qri core.
   259  
   260  ### Better Validate command output
   261  Here's a [demo](https://asciinema.org/a/360495)! `qri validate` gets a little smarter this release, printing a cleaner, more readable list of human errors, and now has flags to output validation error data in JSON and CSV formats.
   262  
   263  ### Bug Fixes
   264  
   265  * **`Validate`:** allow validation of FSI dataset w/ no history ([a212dba](https://github.com/qri-io/qri/commit/a212dba499ee35b02c5a21509487a9787e74de9b))
   266  * **api:** Fix api test for health check by ignoring version number ([f0b7518](https://github.com/qri-io/qri/commit/f0b751823e00cba4353b877f13eec62a4335a7ee))
   267  * **api:** Get with body.csv suffix implies all=true ([ed95ce1](https://github.com/qri-io/qri/commit/ed95ce1f615f2e4b7b798af2ea6f425297290520))
   268  * **connect:** only run `DoSetup` if there is not an existing repo ([3642aef](https://github.com/qri-io/qri/commit/3642aefad2a0000ae5d1c90c45ad363c53f2db98)), closes [#1553](https://github.com/qri-io/qri/issues/1553)
   269  * **event bus:** encoded fields use lower-case names in JSON ([a14f28f](https://github.com/qri-io/qri/commit/a14f28f5647b54041c2790a55d77e06125a08d90))
   270  * **lib:** Wrap returned errors in lib/datasets ([64b2890](https://github.com/qri-io/qri/commit/64b28900657fe74e9733b569667c0adc26a950d0))
   271  * **remote:** be more lenient with `ResolveRef` error when trying to remove a dataset ([7ecbc83](https://github.com/qri-io/qri/commit/7ecbc8350f198bb349f704fb92e4c367f120969c))
   272  * **sql:** Truncate unexpected columns during join ([72ec2c4](https://github.com/qri-io/qri/commit/72ec2c4d92024e1d4822ff500cf2b44d610b4f9c))
   273  * **validate:** Don't swallow details about validate body read errors ([e5fdd8e](https://github.com/qri-io/qri/commit/e5fdd8e97a8ac4861aa856a9da08114134370be2))
   274  * **watchfs:** `WatchAllFSIPaths` needs to call `watchPaths` ([58acace](https://github.com/qri-io/qri/commit/58acacef824679b0a36f87093e2a15bb04213a76)), closes [#1554](https://github.com/qri-io/qri/issues/1554)
   275  
   276  
   277  ### Features
   278  
   279  * **access:** token creation now supports arbitrary claims ([6d1c4a0](https://github.com/qri-io/qri/commit/6d1c4a0664ac316d570ad0691c545366765d21ee))
   280  * **access:** TokenSource & TokenStore interfaces, implementations ([2006c4f](https://github.com/qri-io/qri/commit/2006c4fbc439baae948b8f8849cb119d566d9674))
   281  * **progress:** enable websocket push pull events ([47bb395](https://github.com/qri-io/qri/commit/47bb395155236573ed8013d3758059dee87d3c37))
   282  * **validate:** tabular output of validation errors on CLI, configure out format ([cee5919](https://github.com/qri-io/qri/commit/cee59191a396c0d6330f56298b39ece403a1ebe5))
   283  
   284  
   285  
   286  # [v0.9.12](https://github.com/qri-io/qri/compare/v0.9.11...v) (2020-09-10)
   287  
   288  Patch release 0.9.12 features a number of fixes to various qri features, most aimed at improving general quality-of-life of the tool, and some others that lay the groundwork for future changes.
   289  
   290  ## HTTP API Changes
   291  Changed the qri api so that the `/get` endpoint gets dataset heads and bodies. `/body` still exists but is now deprecated.
   292  
   293  ## P2P and Collaboration
   294  A new way to resolve peers and references on the p2p network.
   295  The start of access control added to our remote communication API.
   296  Remotes serve a simple web ui.
   297  
   298  ## General polish
   299  Fix ref resolution with divergent logbook user data.
   300  Working directories allow case-insensitive filenames.
   301  Improve sql support so that dataset names don't need an explicit table alias.
   302  The `get` command can fetch datasets from cloud.
   303  
   304  ### Bug Fixes
   305  
   306  * **api:** Accept header can be used to download just body bytes ([ed7aaf4](https://github.com/qri-io/qri/commit/ed7aaf474f74f090f432cdc0bae32bfa03877af8))
   307  * **api:** Additional comments for api/datasets functions ([0883afa](https://github.com/qri-io/qri/commit/0883afad1b8addc09518dcc3af29d850d93159be))
   308  * **api:** Preview endpoint can handle IPFS paths ([c404756](https://github.com/qri-io/qri/commit/c40475675786d7a830ef6ab8e1ce877b6b870b4c))
   309  * **cmd:** fix context passing error in test runner ([f76de25](https://github.com/qri-io/qri/commit/f76de25603a9fd616f1cc083663efd1782188d89))
   310  * **fsi:** component filenames are case-insensitive ([9cc6f0e](https://github.com/qri-io/qri/commit/9cc6f0ef44ebda74910380461f517ac89b33e6fb)), closes [#1509](https://github.com/qri-io/qri/issues/1509)
   311  * **get:** get command auto-fetches ([db88c6c](https://github.com/qri-io/qri/commit/db88c6c2911bb385bc5a7443e38b34be1bc1f195))
   312  * **lib:** `oldRemoteClientExisted` causing waitgroup panic ([e2e23fb](https://github.com/qri-io/qri/commit/e2e23fb4b87ea20e2cb445a552b9330eae526812))
   313  * **lib:** bring the node `Offline` when shutting down the instance ([12a9614](https://github.com/qri-io/qri/commit/12a9614fa76ea42da8608e63ddeb989d6b1d2361))
   314  * **lib:** explicitly shutdown `remoteClient` on `inst.Shutdown()` ([8154dc3](https://github.com/qri-io/qri/commit/8154dc3c323919dbb0e3bcbccfc426e5862b82d0))
   315  * **logbook:** Switch merge to use ProfileID, not UserCreateID ([e5c39d8](https://github.com/qri-io/qri/commit/e5c39d849bae9f14a82bd097a3d28bbd8bb4b0ce))
   316  * **remote:** Remote MockClient adds IPFS blocks ([267a073](https://github.com/qri-io/qri/commit/267a073c6138d47380920f2d3ba464be05e54e45))
   317  * **resolve:** Resolve refs after merging logbook by profileID ([be76f29](https://github.com/qri-io/qri/commit/be76f29698add4dc68accf3c713ad44eba5e64f7))
   318  
   319  
   320  ### Features
   321  
   322  * **access:** access defines a policy grammer for access control ([63172c7](https://github.com/qri-io/qri/commit/63172c779a314215bdcb4a10df5f6dbd4cc8e11d))
   323  * **api:** qri can serve a simple webui ([3db8daa](https://github.com/qri-io/qri/commit/3db8daa45383c0b15a81badbb6d23b55e9b2f489))
   324  * **lib:** pass remote options when creating `NewInstance` ([d2b8b8f](https://github.com/qri-io/qri/commit/d2b8b8fb45de0003808a43035d91db410fddd877))
   325  * **pull:** set pulling source with remote flag on CLI & API ([0dc9890](https://github.com/qri-io/qri/commit/0dc9890b53f31bb6043312ae34e95a6f632335ce))
   326  
   327  
   328  
   329  <a name="v0.9.11"></a>
   330  # [v0.9.11](https://github.com/qri-io/qri/compare/v0.9.10...v0.9.11) (2020-08-10)
   331  
   332  This patch release addresses a critical error in `qri setup`, and removes overly-verbose output when running `qri connect`.
   333  
   334  ### Bug Fixes
   335  
   336  * **lib:** don't panic when resolving without a registry ([2708801](https://github.com/qri-io/qri/commit/2708801))
   337  * **p2p:** some clean up around `qri peers connect` and `upgradeToQriConnection` ([#1489](https://github.com/qri-io/qri/issues/1489)) ([b7bb076](https://github.com/qri-io/qri/commit/b7bb076))
   338  * **setup:** Fix prompt, add a test for --anonymous ([3b2c58a](https://github.com/qri-io/qri/commit/3b2c58a))
   339  * **setup:** Fix setup, add many unit tests ([b88d084](https://github.com/qri-io/qri/commit/b88d084))
   340  
   341  
   342  
   343  <a name="v0.9.10"></a>
   344  # [v0.9.10](https://github.com/qri-io/qri/compare/v0.9.9...v0.9.10) (2020-07-27)
   345  
   346  For this release we focused on clarity, reliability, major fixes, and communication (both between qri and the user, and the different working components of qri as well). The bulk of the changes surround the rename of `publish` and `add` to `push` and `pull`, as well as making the commands more reliable, flexible, and transparent.
   347  
   348  ### `push` is the new `publish` 
   349  
   350  Although qri defaults to publishing datasets to our [qri.cloud](https://qri.cloud) website (if you haven't checked it out recently, it's gone through a major facelift & has new features like dataset issues and vastly improved search!), we still give users tools to create their own services that can host data for others. We call these _remotes_ (qri.cloud is technically a very large, very reliable remote). However, we needed a better way to keep track of where a dataset has been "published", and also allow datasets to be published to different locations. 
   351  
   352  We weren't able to correctly convey, "hey this dataset has been published to remote A but not remote B", by using a simple boolean published/unpublished paradigm. We also are working toward a system, where you can push to a _peer_ remote or make your dataset _private_ even though it has been sent to live at a public location.
   353  
   354  In all these cases, the name `publish` wasn't cutting it, and was confusing users. 
   355  
   356  After debating a few new titles in [RFC0030](https://github.com/qri-io/rfcs/blob/master/text/0030-replace_publish_clone_with_push_pull.md), we settled on `push`. It properly conveys what is happening: you are pushing the dataset from your node to a location that will accept and store it. Qri keeps track of where it has been pushed, so it can be pushed to multiple locations.
   357  
   358  It also helps that `git` has a `push` command, that fulfills a similar function in software version control, so using the verb `push` in this way has precident. We've also clarified the command help text: only one version of a dataset is pushed at a time.
   359  
   360  ### `pull` is the new `add`
   361  We decided that, for clarity, if we are renaming `qri publish ` to `qri pull`, we should rename it's mirrored action, `qri add` to `qri pull`. Now it's clear: to send a dataset to another source use `qri push`, to get a dataset from another source use `qri pull`!
   362  
   363  ### use `get` instead of `export`
   364  `qri export` has been removed. Use `qri get --format zip me/my_dataset` instead. We want more folks to play with `get`, it's a far more powerful version of export, and we had too many folks miss out on `get` because they found `export` first, and it didn't meet their expectations.
   365  
   366  ### major fix: pushing & pulling historical versions
   367  `qri push` without a specified version will still default to pushing the _latest version_ and `qri pull` without a specified version will still default to pulling _every version_ of the dataset that is available. However, we've added the ability to push or pull a dataset at _specific versions_ by specifying the dataset version's _path_! You can see a list of a dataset's versions and each version's path by using the `qri log` command.
   368  
   369  In the past this would error:
   370  
   371  ```
   372  $ qri publish me/dataset@/ipfs/SpecificVersion
   373  ```
   374  
   375  With the new push command, this will now work:
   376  
   377  ```
   378  $ qri push me/dataset@/ipfs/SpecificVersion
   379  ```
   380  
   381  You can use this to push old versions to a remote, same with `pull`!
   382  
   383  ### events, websockets & progress
   384  We needed a better way for the different internal qri processes to coordinate. So we beefed up our events and piped the stream of events to a websocket. Now, one qri process can subscribe and get notified about important events that occur in another process. This is also great for users because we can use those events to communicate more information when resource intensive or time consuming actions are running! Check our our progress bars when you `push` and `pull`!
   385  
   386  The websocket event API is still a work in progress, but it's a great way to build dynamic functionality on top of qri, using the same events qri uses internally to power things like progress bars and inter-subsystem communication.
   387  
   388  ### other important changes
   389  
   390  - sql now properly handles dashes in dataset names
   391  - migrations now work on machines across multiple mounts. We fixed a bug that was causing the migration to fail. This was most prevalent on Linux.
   392  - the global `--no-prompt` flag will disable all interactive prompts, but now falls back on defaults for each interaction.
   393  - a global `--migrate` flag will auto-run a migration check before continuing with the given command
   394  - the default when we ask the user to run a migration is now `"No"`. In order to auto-run a migration you need the `--migrate` flag, (_not_ the `--no-prompt` flag, but they can both be use together for "run all migrations and don't bother me")
   395  - the `remove` now takes the duties of the `--unpublish` flag. run `qri remove --all --remote=registry me/dataset` instead of `qri publish --unpublish me/dataset`. More verbose? Yes. But you're deleting stuff, so it should be a think-before-you-hit-enter type thing.
   396  - We've made some breaking changes to our API, they're listed below in the YELLY CAPS TEXT below detailing breaking changes
   397  
   398  ### Bug Fixes
   399  
   400  * **cmd:** re-work migration execution ([3bd14f5](https://github.com/qri-io/qri/commit/3bd14f5))
   401  * **docker:** qri must be built from go 1.14 or higher ([99b267e](https://github.com/qri-io/qri/commit/99b267e))
   402  * **json:** Fix typo in json serialization for dataset listing ([151fcb1](https://github.com/qri-io/qri/commit/151fcb1))
   403  * **linux:** migration fix for copying on cross link device ([cd47426](https://github.com/qri-io/qri/commit/cd47426))
   404  * **logbook:** write timestamps on push & delete operations ([079c759](https://github.com/qri-io/qri/commit/079c759))
   405  * **logsync:** remove errorneous error check on logsync delete reqs ([1670305](https://github.com/qri-io/qri/commit/1670305))
   406  * **print:** Write directory to stdout if not using a terminal ([3575349](https://github.com/qri-io/qri/commit/3575349))
   407  * **sql:** properly handle dashes in dataset names ([dbe472c](https://github.com/qri-io/qri/commit/dbe472c))
   408  * **windows:** Fix Windows test build by removing file permissions ([b020767](https://github.com/qri-io/qri/commit/b020767))
   409  * **zip:** Add get format=zip to the root handler ([6c0a00d](https://github.com/qri-io/qri/commit/6c0a00d))
   410  
   411  
   412  ### Code Refactoring
   413  
   414  * **api:** watchfs sends over event bus, websocket API is an event stream ([3cc9949](https://github.com/qri-io/qri/commit/3cc9949))
   415  * **clone:** rename clone to pull, use dsrefs in remote, peerIDs in ResolveRef ([51f432d](https://github.com/qri-io/qri/commit/51f432d))
   416  
   417  
   418  ### Features
   419  
   420  * **dsref:** add Complete method on dsref.Ref ([6bffa72](https://github.com/qri-io/qri/commit/6bffa72))
   421  * **event:** add p2p events to `events` and event bus to `QriNode` ([#1440](https://github.com/qri-io/qri/issues/1440)) ([c444288](https://github.com/qri-io/qri/commit/c444288))
   422  * **lib:** `OptNoBootstrap` option func for `NewInstance` ([#1436](https://github.com/qri-io/qri/issues/1436)) ([9530c62](https://github.com/qri-io/qri/commit/9530c62))
   423  * **lib:** add OptEventHandler for subscribing to events move WS to instance ([889c175](https://github.com/qri-io/qri/commit/889c175))
   424  * **preview:** preview subcommand ([3303428](https://github.com/qri-io/qri/commit/3303428))
   425  * **push, remove:** publish -> push rename, remove --remote flag, better docs ([c70c04d](https://github.com/qri-io/qri/commit/c70c04d))
   426  * **remote:** redo remote client interface, write client events, progress bars ([01b88fc](https://github.com/qri-io/qri/commit/01b88fc))
   427  
   428  
   429  ### BREAKING CHANGES
   430  
   431  * **push, remove:** * HTTP API: /publish endpoint is now /push
   432  * HTTP API: /unpublish is now /remove?remote=registry
   433  * HTTP API: /add is now /pull
   434  * **clone:** * all remote hooks pass dsref.Ref instead of reporef.DatasetRef arguments
   435  * ResolveRef spec now requires public key ID be set as part of reference resolution
   436  * **api:** websocket JSON messages have changed. They're now _always_ an object with "type" and
   437  "data" keys.
   438  
   439  
   440  
   441  <a name="v0.9.9"></a>
   442  # [v0.9.9](https://github.com/qri-io/qri/compare/v0.9.8...v0.9.9) (2020-07-01)
   443  
   444  Welcome to Qri 0.9.9! We've got a lot of internal changes that speed up the work you do on Qri everyday, as well as a bunch of new features, and key bug fixes!
   445  
   446  ## Config Overhaul
   447  We've taken a hard look at our config and wanted to make sure that, not only was every field being used, but also that this config could serve us well as we progress down our roadmap and create future features. 
   448  
   449  To that effect, we removed many unused fields, switched to using multiaddresses for all network configuration (replacing any `port` fields), formalized the hierarchy of different configuration sources, and added a new `Filesystems` field. 
   450  
   451  This new `Filesystems` field allows users to choose the supported filesystems on which they want Qri to store their data. For example, in the future, when we support s3 storage, this `Filesystems` field is where the user can go to configure the path to the storage, if it's the default save location, etc. More immediately however, exposing the `Filesystems` configuration also allows folks to point to a non-default location for their IPFS storage. This leads directly to our next change: moving the default IPFS repo location.
   452  
   453  ## Migration
   454  One big change we've been working on behind the scenes is upgrading our IPFS dependency. IPFS recently released version 0.6.0, and that's the version we are now relying on! This was a very important upgrade, as users relying on older versions of IPFS (below 0.5.0) would not be seen by the larger IPFS network. 
   455  
   456  We also wanted to move the Qri associated IPFS node off the default `IPFS_PATH` and into a location that advertises a bit more that this is the IPFS node we rely on. And since our new configuration allows users to explicitly set the path to the IPFS repo, if a user prefers to point their repo to the old location, we can still accommodate that. By default, the IPFS node that Qri relies on will now live on the `QRI_PATH`.
   457  
   458  Migrations can be rough, so we took the time to ensure that upgrading to the newest version of IPFS, adjusting the Qri config, and moving the IPFS repo onto the `QRI_PATH` would go off without a hitch!
   459  
   460  ## JSON schema
   461  Qri now relies on a newer draft (draft2019_09) of JSON Schema. Our golang implementation of `jsonschema` now has better support for the spec, equal or better performance depending on the keyword, and the option to extend using your own keywords.
   462  
   463  ## Removed `Update`
   464  This was a real kill-your-darlings situation! The functionality of `update` - scheduling and running `qri saves` - can be done more reliably using other schedulers/taskmanagers. Our upcoming roadmap expands many Qri features, and we realized we couldn't justify the planning/engineering time to ensure `update` was up to our standards. Rather then letting this feature weigh us down, we realized it would be better to remove `update` and instead point users to docs on how to schedule updates. One day we may revisit updates as a plugin or wrapper.
   465  
   466  ## Merkledag error
   467  Some users were getting `Merkledag not found` errors when trying to add some popular datasets from Qri Cloud (for example `nyc-transit-data/turnstile_daily_counts_2019`). This should no longer be the case!
   468  
   469  ## Specific Command Line Features/Changes
   470  - `qri save` - use the `--drop` flag to remove a component from that dataset version
   471  - `qri log` - use the `--local` flag to only get the logs of the dataset that are storied locally
   472              - use the `--pull` flag to only get the logs of the dataset from the network (explicitly not local)
   473              - use the `--remote` flag to specify a remote off of which you want to grab that dataset's log. This defaults to the qri cloud registry
   474  - `qri get` - use the `-- zip` flag to export a zip of the dataset
   475  
   476  ## Specific API Features/Changes
   477  - `/fetch` - removed, use `/history?pull=true` 
   478  - `/history` - use the `local=true` param to only get the logs of a dataset that are stored locally
   479               - use the `pull=true` param to get the logs of a dataset from the network only (explicitly not local)
   480               - use the `remote=REMOTE_NAME` to specify a remote off of which you want to grab that dataset's log. This defaults to the qri cloud registry
   481  
   482  ### Bug Fixes
   483  
   484  * **AddDataset:** preserve original path after `ResolveHeadRef` ([ff87926](https://github.com/qri-io/qri/commit/ff87926))
   485  * **dsfs:** Ensure name and peername are not written to IPFS ([654ed64](https://github.com/qri-io/qri/commit/654ed64))
   486  * **dsref:** Change char to character in dsref.parse errors ([83882b0](https://github.com/qri-io/qri/commit/83882b0))
   487  * **dsref:** Improve dsref parse error messages ([2f97a4e](https://github.com/qri-io/qri/commit/2f97a4e))
   488  * **get:** Quick fix to ignore merkledag errors ([14dd03e](https://github.com/qri-io/qri/commit/14dd03e))
   489  * **init:** Derive dataset name from directory base, not whole path ([8dec66b](https://github.com/qri-io/qri/commit/8dec66b))
   490  * **init:** Multiple fixes to init, save, dscache ([a21cc31](https://github.com/qri-io/qri/commit/a21cc31))
   491  * **lib:** rpc calls need to reference renamed struct `PeerMethods` ([4ef8122](https://github.com/qri-io/qri/commit/4ef8122))
   492  * **lib.Get:** add FSIPath when ref.Path is prefixed with "/fsi" ([74fbe4c](https://github.com/qri-io/qri/commit/74fbe4c))
   493  * **logbook:** enforce single-author permissions on write methods ([b8cd838](https://github.com/qri-io/qri/commit/b8cd838))
   494  * **logbook:** Only a single Logbook method, owner check in logsync ([c741ef0](https://github.com/qri-io/qri/commit/c741ef0))
   495  * **logbook:** use sync.Once for rollback functions ([a59725d](https://github.com/qri-io/qri/commit/a59725d))
   496  * **migrate:** don't copy entire home directory if IPFS_PATH isn't set ([393473b](https://github.com/qri-io/qri/commit/393473b))
   497  * **migrate:** wait for repo to shut down after migration ([7aad0c3](https://github.com/qri-io/qri/commit/7aad0c3))
   498  * **naming:** Handle names with upper-case characters ([d7138a1](https://github.com/qri-io/qri/commit/d7138a1))
   499  * **regClient:** ResolveRef now returns registry address ([c2cdf6a](https://github.com/qri-io/qri/commit/c2cdf6a))
   500  * **remove:** When removing foreign dataset, remove the log ([978def4](https://github.com/qri-io/qri/commit/978def4))
   501  * **repo:** Construct temp repo using correct path ([2b1518f](https://github.com/qri-io/qri/commit/2b1518f))
   502  * **rpc:** shut down gracefully after completed RPC call ([044a16a](https://github.com/qri-io/qri/commit/044a16a))
   503  * **windows:** Don't detect terminal type ([92f0613](https://github.com/qri-io/qri/commit/92f0613))
   504  * simplify issue templates ([11c4d57](https://github.com/qri-io/qri/commit/11c4d57)), closes [#1394](https://github.com/qri-io/qri/issues/1394)
   505  * **temp_repo:** cancel context on LoadDataset method ([894134e](https://github.com/qri-io/qri/commit/894134e))
   506  * correct issue template path ([eced3b5](https://github.com/qri-io/qri/commit/eced3b5)), closes [#1362](https://github.com/qri-io/qri/issues/1362)
   507  * **save:** Save change detection with readme works correctly ([df3975e](https://github.com/qri-io/qri/commit/df3975e))
   508  
   509  
   510  ### chore
   511  
   512  * remove update command, subsystem, api ([8b55243](https://github.com/qri-io/qri/commit/8b55243))
   513  
   514  
   515  ### Code Refactoring
   516  
   517  * **save:** remove publish flag from save ([dc8737b](https://github.com/qri-io/qri/commit/dc8737b))
   518  
   519  
   520  ### Features
   521  
   522  * **`lib`, `cmd`:** add wait group and done channel to `lib.Instance` and `cmd.QriOptions` ([69d6021](https://github.com/qri-io/qri/commit/69d6021))
   523  * **cmd:** add migrate flag to connect command ([4a465a9](https://github.com/qri-io/qri/commit/4a465a9))
   524  * **dscache:** Dscache used for fsi init and checkout ([3b47d1d](https://github.com/qri-io/qri/commit/3b47d1d))
   525  * **dscache:** Remove operations update the dscache if it exists ([3212add](https://github.com/qri-io/qri/commit/3212add))
   526  * **dsref:** ParseLoadResolve turns strings into datasets ([0283fc0](https://github.com/qri-io/qri/commit/0283fc0))
   527  * **dsref.Resolve:** add source multiaddr return value ([dec83f9](https://github.com/qri-io/qri/commit/dec83f9))
   528  * **export:** Rewrite zip creation so it closely resembles fsi ([25fc08c](https://github.com/qri-io/qri/commit/25fc08c))
   529  * **export:** With no filename, write zip bytes to stdout or API ([880ee63](https://github.com/qri-io/qri/commit/880ee63))
   530  * **logbook:** write push & pull operations, logbook diagnostic method ([8d1b6c9](https://github.com/qri-io/qri/commit/8d1b6c9))
   531  * **migrate:** remove qri-only IPFS repo on config migration ([d13511c](https://github.com/qri-io/qri/commit/d13511c))
   532  * **migration:** OneToTwo basic implementation ([4159a25](https://github.com/qri-io/qri/commit/4159a25))
   533  * **RefResolver:** introduce RefResolver interface, use in DatasetRequests.Get ([d5ddc8f](https://github.com/qri-io/qri/commit/d5ddc8f))
   534  * **regClient:** add initial registry client resolver ([3092c75](https://github.com/qri-io/qri/commit/3092c75))
   535  * **save:** add --drop flag to remove dataset components when saving ([63a2808](https://github.com/qri-io/qri/commit/63a2808))
   536  * **zip:** Cmd options for `get --format zip`, initID in WriteZip ([bc3b318](https://github.com/qri-io/qri/commit/bc3b318))
   537  
   538  
   539  ### BREAKING CHANGES
   540  
   541  * update command and all api endpoints are removed
   542  * removed `/fetch` endpoint - use `/history` instead. `local=true` param ensure that the logbook data is only what you have locally in your logbook
   543  
   544  
   545  <a name="0.9.8"></a>
   546  # [0.9.8](https://github.com/qri-io/qri/compare/v0.9.7...v0.9.8) (2020-04-20)
   547  
   548  0.9.8 is a quick patch release to fix export for a few users who have been having trouble getting certain datasets out of qri.
   549  
   550  ### Fixed Export
   551  This patch release fixes a problem that was causing some datasets to not export properly while running `qri connect`.
   552  
   553  ### Naming rules
   554  This patch also clarifies what characters are allowed in a dataset name and a peername. From now on a legal dataset name and username must:
   555  * consist of only lowercase letters, numbers 0-9, the hyphen "-", and the underscore "_".
   556  * start with a letter
   557  
   558  Length limits vary between usernames and dataset names, but qri now enforces these rules more consistently. Existing dataset names that violate these rules will continue to work, but will be forced to rename in a future version. New datasets with names that don't match these rules cannot be created.
   559  
   560  ### Bug Fixes
   561  
   562  * **checkout:** checkout fails early if link exists ([b8f697f](https://github.com/qri-io/qri/commit/b8f697f))
   563  * **cmd:** checkout supports specifying a directory ([3406c8a](https://github.com/qri-io/qri/commit/3406c8a))
   564  * **cmd:** completion supports config, structure and peer args, added workdir ([#1268](https://github.com/qri-io/qri/issues/1268)) ([ef62c71](https://github.com/qri-io/qri/commit/ef62c71))
   565  * **cmd:** tty should auto disable color for windows ([abf678d](https://github.com/qri-io/qri/commit/abf678d))
   566  * **export:** handle ok-case of bad viz while connected ([1bb2463](https://github.com/qri-io/qri/commit/1bb2463))
   567  * **log:** Timeout log retrieval so it won't hang ([14d885a](https://github.com/qri-io/qri/commit/14d885a))
   568  * **parse:** Allow hyphens in usernames and dataset names ([c3b616a](https://github.com/qri-io/qri/commit/c3b616a))
   569  * **setup:** Detect colors during init, which fixes setup ([278241c](https://github.com/qri-io/qri/commit/278241c))
   570  * **setup:** Don't crash when running `qri setup` ([e0202f4](https://github.com/qri-io/qri/commit/e0202f4))
   571  
   572  
   573  ### Features
   574  
   575  * **name:** Generate valid dataset names, use in multiple places ([45502dc](https://github.com/qri-io/qri/commit/45502dc))
   576  * **save:** File hint, from --file or --body flags, informs commit message ([10403f5](https://github.com/qri-io/qri/commit/10403f5))
   577  
   578  
   579  
   580  <a name="0.9.7"></a>
   581  # [0.9.7](https://github.com/qri-io/qri/compare/v0.9.6...v0.9.7) (2020-04-07)
   582  
   583  aka `midnight_blue_sloughi`
   584  
   585  Qri CLI v0.9.7 is **huge**. This release adds SQL support, turning Qri into an ever-growing database of open datasets.
   586  
   587  If that wasn't enough, we've added tab completion, nicer automatic commit messages, unified our command descriptions, and fixed a whole slew of bugs!
   588  
   589  ## 📊 Run SQL on datasets
   590  
   591  Experimental support for SQL is here! Landing this feature brings qri full circle to the [original whitepaper](http://qri.io/papers/deterministic-querying) we published in 2017. 
   592  
   593  We want to live in a world where you can `SELECT * FROM any_qri_dataset`, and we're delighted to say that day is here. 
   594  
   595  We have plans to improve & build upon this crucial feature, and are marking it as experimental while we flesh out our SQL implemetation. We'll drop the "experimental" flag when we support a healthy subset of the SQL spec.
   596  
   597  We've been talking about SQL a bunch in our community calls:
   598  * [🎦 introducing SQL support](https://youtu.be/_kvwuZbnyV4?t=2030) 
   599  * [🎦 qri as a global SQL database](https://youtu.be/U6FoBaO0tYM?t=1612)
   600  * [🎦 SQL errors & prepping datasets for querying](https://youtu.be/D5zUIS_v0iY?t=242)
   601  
   602  
   603  ## 🚗🏁 Autocomplete 
   604  
   605  The name says it all. after following the instructions on `qri generate --help`, type `qri get`, then press tab, and _voilá_, your list of datasets appears for the choosing. This makes working with datasets much easier, requiring you to remember and type less. [🎦 Here's](https://youtu.be/ROkxdM2pRgY?t=145) a demo from our community call.
   606  
   607  
   608  ## 🤝📓 Friendlier Automatic Commit Messages
   609  
   610  For a long time Qri has automatically generated commit messages for you if one isn't suppied by analyzing what's changed between versions. This release makes titles that look like this:
   611  
   612  ```
   613  updated structure, viz, and transform
   614  ```
   615  
   616  and adds detailed messages that look like this:
   617  ```
   618  structure:
   619      updated schema.items.items.63.title
   620  viz:
   621      updated scriptPath
   622  transform:
   623      updated resources./ipfs/QmfQu6qBS3iJEE3ohUnhejb7vh5KwcS5j4pvNxZMi717pU.path
   624      added scriptBytes
   625      updated syntaxVersion
   626  ```
   627  
   628  These automatic messages form a nice textual description of what's changed from version to version. Qri will automatically add these if you don't provide `--title` and/or `--message` values to `qri save`.
   629  
   630  ## 📙 Uniform CLI help
   631  
   632  Finally, a big shout out to one of our biggest open source contributions to date! @Mr0Grog not only contributed a massive cleanup of our command line help text, they also wrote a [style guide](https://github.com/qri-io/qri/blob/master/DEVELOPERS.md#cli-help-style) based on the existing help text for others to follow in the future!
   633  
   634  ### Bug Fixes
   635  
   636  * **base:** permission for files generated on init ([14816f2](https://github.com/qri-io/qri/commit/14816f2))
   637  * **cmd:** added the email flag to 'registry prove' as it required ([#1200](https://github.com/qri-io/qri/issues/1200)) ([996f3de](https://github.com/qri-io/qri/commit/996f3de))
   638  * **cmd:** autocomplete failed to handle search ([#1257](https://github.com/qri-io/qri/issues/1257)) ([e48001d](https://github.com/qri-io/qri/commit/e48001d))
   639  * **cmd:** pass node when not making online request for peers ([#1234](https://github.com/qri-io/qri/issues/1234)) ([2cc7aff](https://github.com/qri-io/qri/commit/2cc7aff))
   640  * **cmd:** properly utilize --no-color and --no-prompt ([ff5bdeb](https://github.com/qri-io/qri/commit/ff5bdeb))
   641  * **cmd:** qri list should match against peername and dataset name ([eb38505](https://github.com/qri-io/qri/commit/eb38505))
   642  * **cmd:** restrict number of args in fsi commands ([4c8e42c](https://github.com/qri-io/qri/commit/4c8e42c))
   643  * **cmd:** signup should provide feedback on success ([855ff8f](https://github.com/qri-io/qri/commit/855ff8f))
   644  * **cmd:** stats command works with an FSI directory ([f6696c1](https://github.com/qri-io/qri/commit/f6696c1)), closes [#1186](https://github.com/qri-io/qri/issues/1186)
   645  * **dry-run:** dry-runs must never add to the refstore ([d1b71c2](https://github.com/qri-io/qri/commit/d1b71c2))
   646  * **dsfs:** fix dag structure, defend against bad DAGs ([73d0f98](https://github.com/qri-io/qri/commit/73d0f98))
   647  * **export:** export even if dag contains missing viz referernce ([44c696d](https://github.com/qri-io/qri/commit/44c696d)), closes [#1161](https://github.com/qri-io/qri/issues/1161)
   648  * **fetch:** fetch should return DatasetLogItems ([#1221](https://github.com/qri-io/qri/issues/1221)) ([842aef5](https://github.com/qri-io/qri/commit/842aef5))
   649  * **fsi:** qri remove --all --force should not fail on low value files ([#1203](https://github.com/qri-io/qri/issues/1203)) ([398e0ac](https://github.com/qri-io/qri/commit/398e0ac))
   650  * **get:** Get with a path will ignore fsi, to get old versions ([2125edd](https://github.com/qri-io/qri/commit/2125edd))
   651  * **profileID:** Properly decode example profileID for tests that use it ([4f55c6c](https://github.com/qri-io/qri/commit/4f55c6c))
   652  * **registry:** Prompt for password without echoing it to terminal ([3906b49](https://github.com/qri-io/qri/commit/3906b49))
   653  * **rpc:** registered json.RawMessage for gob encoding ([#1232](https://github.com/qri-io/qri/issues/1232)) ([0832292](https://github.com/qri-io/qri/commit/0832292))
   654  * **save:** Cannot save new datasets if name contains upper-case characters ([ff68b40](https://github.com/qri-io/qri/commit/ff68b40))
   655  * **save:** If body is too large to diff, compare checksums ([37dc5c7](https://github.com/qri-io/qri/commit/37dc5c7))
   656  * **save:** Inferred name must start with a letter ([86ddca3](https://github.com/qri-io/qri/commit/86ddca3))
   657  * **search:** change type from interface to dataset so rpc can serialize ([#1226](https://github.com/qri-io/qri/issues/1226)) ([ebadaec](https://github.com/qri-io/qri/commit/ebadaec))
   658  * **startf:** script print statements print to stderr ([3b3d6b8](https://github.com/qri-io/qri/commit/3b3d6b8))
   659  * **transform:** Re-open transform after friendly, so it writes to cafs ([6f30ae5](https://github.com/qri-io/qri/commit/6f30ae5))
   660  * **unlink:** Fsi unlink handles more edge-cases, acts more sane. ([945b853](https://github.com/qri-io/qri/commit/945b853))
   661  * **update:** Change default port for update service ([6500a91](https://github.com/qri-io/qri/commit/6500a91))
   662  * **watchfs:** Methods need a mutex to avoid concurrent writes ([2cebeff](https://github.com/qri-io/qri/commit/2cebeff))
   663  * **whatchanged:** Hide command so it doesn't show up in help ([2ea1441](https://github.com/qri-io/qri/commit/2ea1441))
   664  
   665  
   666  ### Features
   667  
   668  * **api:** add SQL endpoint ([4f5be38](https://github.com/qri-io/qri/commit/4f5be38))
   669  * **cmd:** added command to generate basic cmd autocompletion scripts ([#1240](https://github.com/qri-io/qri/issues/1240)) ([0845289](https://github.com/qri-io/qri/commit/0845289))
   670  * **cmd:** remove `--blank` option from `export` ([47f8c70](https://github.com/qri-io/qri/commit/47f8c70))
   671  * **dscache:** Dscache can be used for get command ([144ad50](https://github.com/qri-io/qri/commit/144ad50))
   672  * **save:** Friendly commit messages by analyzing head, body, and transform ([eb91b27](https://github.com/qri-io/qri/commit/eb91b27))
   673  * **showcommit:** Split cmd status-at-version into showcommit. ([9dd444e](https://github.com/qri-io/qri/commit/9dd444e))
   674  * **sql:** run SQL SELECT queries on datasets ([7a6d8ae](https://github.com/qri-io/qri/commit/7a6d8ae))
   675  
   676  
   677  ### BREAKING CHANGES
   678  
   679  * **cmd:** `qri export --blank` has been removed. (You can still `qri export peer/some_dataset`.)
   680  
   681  
   682  
   683  # [v0.9.6](https://github.com/qri-io/qri/compare/v0.9.5...v0.9.6) (2020-03-05)
   684  
   685  This patch release fixes a number of small bugs, mainly in support of our Desktop app, and continues infrastructural improvements in preparation for larger feature releases. These include: our improved diff experience, significantly better filesystem integration, and a new method of dataset name resolution that better handles changes across a peer network.
   686  
   687  ### Bug Fixes
   688  
   689  * **cmd/list:** show username with no datasets to list ([a7cbde6](https://github.com/qri-io/qri/commit/a7cbde674b4eab23ea8b566c7c96f08f0353f220))
   690  * **history:** Include the foreign field in history requests ([52c5cc1](https://github.com/qri-io/qri/commit/52c5cc1e9bb4978cee156a6f583afc3be9709773))
   691  
   692  
   693  ### Features
   694  
   695  * **diff:** show context in diffs ([6d6abb2](https://github.com/qri-io/qri/commit/6d6abb279745810668bf40edfe3b4fc622c0d545))
   696  * **dscache:** Fill dscache when saving, using func pointer in logbook. ([438fd03](https://github.com/qri-io/qri/commit/438fd039dd308a8ff072fb32bed3fcc2ddb74aca))
   697  
   698  
   699  
   700  <a name="v0.9.5"></a>
   701  # [v0.9.5](https://github.com/qri-io/qri/compare/v0.9.4...v0.9.5) (2020-02-27)
   702  
   703  This patch release is focused on a number of API refactors, and sets the stage for a new subsystem we're working on called dscache. It's a small release, but should help stabilize communication between peer remotes & the registry.
   704  
   705  
   706  ### Bug Fixes
   707  
   708  * **api:** inline script bytes for get requests ([4d4794f](https://github.com/qri-io/qri/commit/4d4794f))
   709  * **cli:** remove extraneous logging from `qri registry prove` ([de640a2](https://github.com/qri-io/qri/commit/de640a2)), closes [#1096](https://github.com/qri-io/qri/issues/1096)
   710  * **cmd:** refSelect always writes to stderr ([b88eb0c](https://github.com/qri-io/qri/commit/b88eb0c))
   711  * **dry-run:** fix logbook conflict with dry-run ([4c051b6](https://github.com/qri-io/qri/commit/4c051b6))
   712  * **dscache:** A few dscache improvements ([a7c7d36](https://github.com/qri-io/qri/commit/a7c7d36))
   713  * **dscache:** Add refs in dsref that logbook is missing. More tests. ([2ddd3b6](https://github.com/qri-io/qri/commit/2ddd3b6))
   714  * **dscache:** Alphabetize refs in the dscache. Add tests. ([8f4943c](https://github.com/qri-io/qri/commit/8f4943c))
   715  * **dsref:** Parse dsref from strings. Use for rename and init. ([338e700](https://github.com/qri-io/qri/commit/338e700))
   716  * **lint:** Fix style problems, event name change ([2f90119](https://github.com/qri-io/qri/commit/2f90119))
   717  * **logbook:** addChild should not create duplicate children ([9a41b6b](https://github.com/qri-io/qri/commit/9a41b6b))
   718  * **logbook:** always provide a privateKey to logbook ([ae68ccc](https://github.com/qri-io/qri/commit/ae68ccc))
   719  * **logbook:** use AddChild so oplogs set ancestry ([be633b9](https://github.com/qri-io/qri/commit/be633b9))
   720  * **p2p:** add local to p2ptest muxer ([4937997](https://github.com/qri-io/qri/commit/4937997))
   721  * **profileID:** Disambiguate profileID construction to avoid subtle bugs ([a41d41a](https://github.com/qri-io/qri/commit/a41d41a))
   722  * **publish:** Use Refselect for publish, so FSI works. Use dsref, add tests. ([68dfff3](https://github.com/qri-io/qri/commit/68dfff3))
   723  * **regclient:** update to new search endpoint, fix response ds.Name ([d3fbce4](https://github.com/qri-io/qri/commit/d3fbce4))
   724  * **registry:** fix inaccurate tests covered by catch-all-200 response regserver handler ([1d30975](https://github.com/qri-io/qri/commit/1d30975))
   725  * **remote:** fetching logs populates VersionInfo.Foreign ([e50cd19](https://github.com/qri-io/qri/commit/e50cd19))
   726  * **remote:** Handle error in order to avoid nil pointer ([4a88b52](https://github.com/qri-io/qri/commit/4a88b52))
   727  * **remove:** RemoveEntireDataset is better at cleaning up broken states ([efaf600](https://github.com/qri-io/qri/commit/efaf600))
   728  * **temp registry:** make configuration not interrupt common config ([b618472](https://github.com/qri-io/qri/commit/b618472))
   729  
   730  
   731  ### Features
   732  
   733  * **api:** support for dynamic dataset readme rendering ([ef06599](https://github.com/qri-io/qri/commit/ef06599))
   734  * **dscache:** Dscache holds info about datasets based upon logbook ([28811d7](https://github.com/qri-io/qri/commit/28811d7))
   735  * **dscache:** Dscache will get updated by save, if it exists in the repo ([21c5ca7](https://github.com/qri-io/qri/commit/21c5ca7))
   736  * **dscache:** Fill dataset details, filter when listing ([e460a7c](https://github.com/qri-io/qri/commit/e460a7c))
   737  * **event:** package event implements an event bus ([6068f88](https://github.com/qri-io/qri/commit/6068f88))
   738  * **event:** When a folder is checked out, add it to watchfs ([7536221](https://github.com/qri-io/qri/commit/7536221))
   739  * **feed:** add feed methods to lib backed by registry ([53e6eb3](https://github.com/qri-io/qri/commit/53e6eb3))
   740  * **registry:** add preview support to registry fetching ([19f12bd](https://github.com/qri-io/qri/commit/19f12bd))
   741  * **remote:** add FeedsPreCheck and PreviewPreCheck hooks ([97fb2be](https://github.com/qri-io/qri/commit/97fb2be))
   742  * **remote:** ephemeral log fetching with remoteClient.FetchLogs ([1651def](https://github.com/qri-io/qri/commit/1651def))
   743  * **remote:** remote client signs HTTP feed and preview requests ([a742faa](https://github.com/qri-io/qri/commit/a742faa))
   744  * **watchfs:** Watched filesystem folders send dataset names as well ([f7c7bfb](https://github.com/qri-io/qri/commit/f7c7bfb))
   745  
   746  
   747  
   748  # [v0.9.4](https://github.com/qri-io/qri/compare/v0.9.3...v0.9.4) (2020-01-21)
   749  
   750  This patch release fixes a number of FSI (file system integration) issues and infrastructure changes that will improve Desktop. These include the restoration of the validate command, handling certain changes to the file system done outside of qri, improved logging, and Windows bug fixes.
   751  
   752  ### Bug Fixes
   753  
   754  * **fsi:** Remove references that have no path and no working directory. ([f04981b](https://github.com/qri-io/qri/commit/f04981bd8dbd5f2c42aa18bf95b80e00d4bbd8e7))
   755  * **log:** Add --log-all flag to enable logging everywhere ([c3c30b1](https://github.com/qri-io/qri/commit/c3c30b1b91d87b8f2aff54ee5f8e8a4a82d8a118))
   756  * **ref:** CanonicalizeDatasetRef sets fsipath even if ref is full. ([2973bfa](https://github.com/qri-io/qri/commit/2973bfaae85b0f1c492f62ba7602f2e25cc27fce))
   757  * **registry:** update peername and dsrefs on registry signup name change ([8bc151c](https://github.com/qri-io/qri/commit/8bc151c434fc09863d2754a2ab3d027a67314214))
   758  * **remove:** Remove foreign datasets while connected, don't hang ([a93470b](https://github.com/qri-io/qri/commit/a93470b958a57b230e28c72721fc8b5c1498616f))
   759  * **test:** API tests are stable and pass even when version changes ([2c401e5](https://github.com/qri-io/qri/commit/2c401e5d1af63a74f1f15e70ca3272c04c9b206d))
   760  * **validate:** Allow either --structure or --schema flag. Add cmd/ tests ([6978113](https://github.com/qri-io/qri/commit/69781137253218d047cfb21750e4f26cfa8a2787))
   761  * **validate:** Improve validate so it works with FSI ([07cde33](https://github.com/qri-io/qri/commit/07cde335259b8248fb68fab2ad5fead4ecc6e048))
   762  * **windows:** Fix "Access is defined." error on Windows when renaming. ([0d11744](https://github.com/qri-io/qri/commit/0d11744e045a3e1abc07868910e9c98acab29f04))
   763  
   764  
   765  ### Features
   766  
   767  * **doggo:** Setup flag that only creates a nick and displays it ([a75e2d0](https://github.com/qri-io/qri/commit/a75e2d0885c3ecaac9785d73c72b6e0d1d05ffea))
   768  * **logbook:** add WriteAuthorRename method to logbook ([d4ac19c](https://github.com/qri-io/qri/commit/d4ac19c6c66eaebe1b377f24996627c8054194c7))
   769  * **websocket:** Open websocket server, watch filesystem for events. ([1d8e022](https://github.com/qri-io/qri/commit/1d8e022b4bd858d8cba0ee723175772b6daf7ec6))
   770  
   771  
   772  
   773  # [v0.9.3](https://github.com/qri-io/qri/compare/v0.9.2...v0.9.3) (2019-12-12)
   774  
   775  This patch release includes bug fixes and improvements around the working directory, in particular doing better with removing datasets, and generating automatic commit messages. There are also some small feature changes that are mostly laying the groundwork for future features.
   776  
   777  ### Bug Fixes
   778  
   779  * **cmd:** Clean tmp directories in command output, to simplify tests ([d302828](https://github.com/qri-io/qri/commit/d302828fb4be078919d911974190b1e174ba77b4))
   780  * **diff:** Diff with no history returns a reasonable error message ([35207ba](https://github.com/qri-io/qri/commit/35207bae758e4b8e039eff4769eb6f1eec9d1856))
   781  * **fsi:** FSI should use detected schema for reading body ([9fed513](https://github.com/qri-io/qri/commit/9fed513ff893dd0886b592265c6c961dfa37977a))
   782  * **fsi:** When working directory is moved or deleted, update FSI Path ([3c4153b](https://github.com/qri-io/qri/commit/3c4153b1b8ce4b5bb1b847c1bf3dc75828ef6d0c))
   783  * **remove:** Improve error message when removing a dirty dataset ([21adb9b](https://github.com/qri-io/qri/commit/21adb9b20af5d84c9b8d379cb5e23c667b8e5d3c))
   784  * **remove:** Remove works on foreign datasets, even if logbook missing ([fe4598a](https://github.com/qri-io/qri/commit/fe4598abaa9f4427f05ae8a046e9dcc1fc9a318e))
   785  * **search:** Run TestSearchRun in a tmp directory ([633185e](https://github.com/qri-io/qri/commit/633185e59f5df15e1b900ecd4586666e5dad50de))
   786  
   787  
   788  ### Features
   789  
   790  * **friendly:** Friendly generator for commit title and message ([29aa674](https://github.com/qri-io/qri/commit/29aa6740b6be494d4ba224ff56e89373bb1324a6))
   791  * **lib:** add OptLogbook to provide custom logbook ([31667b7](https://github.com/qri-io/qri/commit/31667b7c84051b8283f26102777c81e854ac7c93))
   792  * **oplog:** add Logstore & PersonalLogstore interfaces ([0d7f7a5](https://github.com/qri-io/qri/commit/0d7f7a5c94d673498a8ad6ecb51d44578bd87701))
   793  * **refs:** `qri list --raw` will display raw reference data ([d848f46](https://github.com/qri-io/qri/commit/d848f46d24cef35f218cc14e3f7d4c955d0c3377))
   794  * **save:** Flag --new for save ensures that we're saving a new dataset ([22db718](https://github.com/qri-io/qri/commit/22db71875192dae7cccb8e30401c646c6554f66f))
   795  
   796  
   797  
   798  # [v0.9.2](https://github.com/qri-io/qri/compare/v0.9.1...v0.9.2) (2019-11-18)
   799  
   800  In this patch release we're fixing a bunch of tiny bugs centered around removing datasets, and adding methods for column statistics
   801  
   802  ## 📊 Get to know your data with stats
   803  This release adds support for stats calculation. The easiest way to see stats is to `get` 'em:
   804  
   805  ```
   806  $ qri get stats me/dataset
   807  
   808  # getting stats also works in an FSI-linked directory
   809  # so you can drop the dataset reference & just type:
   810  $ cd /path/to/linked/dataset/directory
   811  $ qri get stats
   812  ```
   813  
   814  In both cases you'll get a JSON document of stats, with one stat aggregating each column in your datsaet. The type of stat created depends on the data type being aggregated. Here's the table of stats calculated so far:
   815  
   816  | column data type | stat type  | notes                                                                |
   817  | ---------------- | ---------- | -------------------------------------------------------------------- |
   818  | string           | string     | Calculates a term frequency If there are fewer than 10,000 unique values, fequencies that only occur once aren't listed in frequency map and instead increment a "unique" count. |
   819  | number           | numeric    | Calculates a 10-bucket histogram, as well as min, max, mean, median. |
   820  | boolean          | boolean    | Calculates a true / false / other count                              |
   821  | null             | null       | counts the number of null values                                     |
   822  
   823  
   824  
   825  ### Bug Fixes
   826  
   827  * **api:** Remove force flag for api ([2acf8d8](https://github.com/qri-io/qri/commit/2acf8d8))
   828  * **fsi:** Cleanup quote usage, name return values ([1fa2f2b](https://github.com/qri-io/qri/commit/1fa2f2b))
   829  * **fsi status:** use byte comparison for transform equality test ([73c02a5](https://github.com/qri-io/qri/commit/73c02a5))
   830  * **init:** Can init linked datasets with json format ([a679155](https://github.com/qri-io/qri/commit/a679155))
   831  * **init:** If init has errors, rollback changes ([bc3eb42](https://github.com/qri-io/qri/commit/bc3eb42))
   832  * **ls:** Don't crash when `list` runs over RPC ([7eedc5d](https://github.com/qri-io/qri/commit/7eedc5d))
   833  * **readme:** Can save a readme component using --file flag ([714c470](https://github.com/qri-io/qri/commit/714c470))
   834  * **remove:** Can remove a dataset if its working directory is missing ([9a5b4d8](https://github.com/qri-io/qri/commit/9a5b4d8))
   835  * **remove:** Comments, cleanups, improve tests for remove ([4c1a8c1](https://github.com/qri-io/qri/commit/4c1a8c1))
   836  * **remove:** Fix multiple problems with remove ([67f5ad5](https://github.com/qri-io/qri/commit/67f5ad5)), closes [#1000](https://github.com/qri-io/qri/issues/1000)
   837  * **remove:** Force flag always removes files. Remove directory too. ([e89a2f6](https://github.com/qri-io/qri/commit/e89a2f6))
   838  * **rename:** Allow rename for dataset with no history. Update .qri-ref ([ebcb676](https://github.com/qri-io/qri/commit/ebcb676))
   839  * **rename:** Simplify some conditionals around renames ([965d78d](https://github.com/qri-io/qri/commit/965d78d))
   840  * **stats:** `int` was not capturing all integer options, add `int32` or `int64` ([e00791f](https://github.com/qri-io/qri/commit/e00791f))
   841  * **stats:** fix numeric median calculation ([24d29b3](https://github.com/qri-io/qri/commit/24d29b3))
   842  * **stats:** gets stats with no structure ([a2046d6](https://github.com/qri-io/qri/commit/a2046d6))
   843  * **stats/cache:** stats must have a cache struct, even if empty ([70279d4](https://github.com/qri-io/qri/commit/70279d4))
   844  * **windows:** Set the .qri repo as hidden on Windows. ([599b977](https://github.com/qri-io/qri/commit/599b977))
   845  
   846  
   847  ### Features
   848  
   849  * **`qri stats`:** add stats cmd! outputs unformated json stats ([422ad72](https://github.com/qri-io/qri/commit/422ad72))
   850  * **api.StatsHandler:** add handler and tests for `/stats/` endpoint! ([a103758](https://github.com/qri-io/qri/commit/a103758))
   851  * **config:** add `Stats` config options to the config ([ba85eac](https://github.com/qri-io/qri/commit/ba85eac))
   852  * **fsi transform:** skeletal support for transform scripts via FSI ([98e0cfc](https://github.com/qri-io/qri/commit/98e0cfc))
   853  * **lib:** add `stats.Cache` to the lib instance as `stats` ([a8646f4](https://github.com/qri-io/qri/commit/a8646f4))
   854  * **lib.Stats:** add `lib.Stats` func and tests! ([1210e91](https://github.com/qri-io/qri/commit/1210e91))
   855  * **stats:** add histogram, mean, meadian to numeric stat ([937d145](https://github.com/qri-io/qri/commit/937d145))
   856  * **stats:** introduce stats subsystem ([5dd0ae1](https://github.com/qri-io/qri/commit/5dd0ae1))
   857  
   858  
   859  
   860  # [0.9.1](https://github.com/qri-io/qri/compare/v0.9.0...v0.9.1) (2019-11-05)
   861  
   862  This release brings first-class support for Readmes, adds a bunch of stability, and sets the table for exciting collaboration features in the future.
   863  
   864  ### 📄 Qri now supports readme!
   865  This release brings support for a new dataset component, readmes! Following in a long tradition of readme's in the world of software. Readme's are [markdown](https://daringfireball.net/projects/markdown/) documents for explaining your dataset in human terms.
   866  
   867  The easiest way to create a readme is by creating a file called `readme.md` in an FSI-linked directory. Qri will pick up on the file & add it to your dataset. You can see what the rendered HTML version looks like by running `qri render` in an FSI-linked directory.
   868  
   869  In the future, we're excited to build out the feature set readme's offer, and think they're a better long-term fit for us than the generic notion of our existing `viz` component. Readme's differ from viz by not allowing generic script inclusion, which allows us to present them in a safer sandbox-like environment. This fits well with our story around transform scripts and the general expectation that scripts Qri interacts with will come with a safer execution properties. 
   870  
   871  With this release, support for readme's in [qri.cloud](https://qri.cloud) and [desktop](https://qri.io/desktop) is right around the corner.
   872  
   873  Happy note taking!
   874  
   875  ### 📘 Introducing Logbook
   876  
   877  **[video!](https://youtu.be/WBshhfYv740?t=206)**
   878  
   879  Until now qri has used stored datasets as it's source of history. Qri keeps commit information in the dataset itself, and creates a log of datasets by having each dataset reference the one before it. Keeping commits in history has a number of advantages:
   880  * all datasets are attributed to the user that made them
   881  * all datasets have an accurate creation timestamp
   882  * all datasets include any notes the author made at the time
   883  * all of these these details are _part of the dataset_, and move with it.
   884  
   885  We've gone a long way with this simplistic apporoach, but using datasets as the only source of history has one major limitation: _the history of a dataset is tied to the data itself_. This means you can't uncover the full history of a dataset unless you have _all_ versions of a dataset _stored locally_. Logbook fixes that problem.
   886  
   887  Logbook is a _coordination tool_ for talking about who did what, without having to move around the data itself. This means Qri can tell you meaningful things about dataset versions you don't have. This will make syncing faster, and forms the basis for _collaboration_. 
   888  
   889  To make use of logbook, all you have to do is... nothing! Logbook is a transparent service that overlays onto traditional Qri commands. You'll see some new details in commands like `qri log` and a few new plumbing commands like `qri fetch` and `qri logbook`, but this feature adds no new requirements to the Qri workflow.
   890  
   891  We're most excited about what logbook allows us to do (collaboration!), and can't wait to ship features that will show the benefit of logbook. More fun soon!
   892  
   893  ### 🏗 Stability Improvements
   894  As always, we're working on stabilizing & improving the way Qri works. We've this release we've focused on bringing stability to three major areas
   895  * filesystem integration (FSI)
   896  * remotes
   897  * diff
   898  
   899  ### Bug Fixes
   900  
   901  * **diff:** Diff implemented using Component interface ([ed88d67](https://github.com/qri-io/qri/commit/ed88d67))
   902  * **fill:** Support setting int64 ([d6dea9a](https://github.com/qri-io/qri/commit/d6dea9a))
   903  * **fsi:** Can get body even if no structure exists. Infer it. ([4cf8132](https://github.com/qri-io/qri/commit/4cf8132))
   904  * **fsi:** Don't output schema for default csv, many related fixes ([9f2c1e9](https://github.com/qri-io/qri/commit/9f2c1e9))
   905  * **fsi:** Rebase this so it works with new component functionality ([e3ba68a](https://github.com/qri-io/qri/commit/e3ba68a))
   906  * **fsi:** Schema is no longer treated as a top-level component ([e8f22c5](https://github.com/qri-io/qri/commit/e8f22c5))
   907  * **fsi init:** fix init writing the wrong dataset name ([0bc6d62](https://github.com/qri-io/qri/commit/0bc6d62))
   908  * **init:** add basic `structure.json` on `init` ([a6f423b](https://github.com/qri-io/qri/commit/a6f423b))
   909  * **log:** fix history being created in reverse order ([c706ef4](https://github.com/qri-io/qri/commit/c706ef4))
   910  * **log:** fix log construction from history, add test ([0567ae9](https://github.com/qri-io/qri/commit/0567ae9))
   911  * **logbook:** logbook cleanup ([525ac78](https://github.com/qri-io/qri/commit/525ac78))
   912  * **publish:** Can only publish / unpublish a head reference ([f834621](https://github.com/qri-io/qri/commit/f834621))
   913  * **readme:** Add readme to dsref, fix style of yaml import ([0f286ef](https://github.com/qri-io/qri/commit/0f286ef))
   914  * **remote:** disambiguate AuthorID & AuthorPubKey use in logsync ([8e95fe1](https://github.com/qri-io/qri/commit/8e95fe1))
   915  * **remote:** remove dataset ([3c38191](https://github.com/qri-io/qri/commit/3c38191))
   916  * **remove:** don't fail if remove encounters an issue traversing qfs history ([f842273](https://github.com/qri-io/qri/commit/f842273)), closes [#989](https://github.com/qri-io/qri/issues/989)
   917  * **rpc:** fix logbook --raw over RPC ([48708b6](https://github.com/qri-io/qri/commit/48708b6))
   918  * incorporate PR feedback fixes ([0970fa0](https://github.com/qri-io/qri/commit/0970fa0))
   919  
   920  
   921  ### Features
   922  
   923  * **api:** add /fetch endpoint ([5637f90](https://github.com/qri-io/qri/commit/5637f90))
   924  * **fetch:** fetch pulls logs via logsync ([0f3f2af](https://github.com/qri-io/qri/commit/0f3f2af))
   925  * **log:** add Local field to DatasetLogItem ([f127167](https://github.com/qri-io/qri/commit/f127167))
   926  * **log:** add sizes to log, fix logbook version pagination ([5ab0c0a](https://github.com/qri-io/qri/commit/5ab0c0a))
   927  * **log:** use logbook to show versions ([1c38865](https://github.com/qri-io/qri/commit/1c38865))
   928  * **logbook:** add lib methods & plumbing commands for logbook ([6a9ae8f](https://github.com/qri-io/qri/commit/6a9ae8f))
   929  * **logbook:** add logbook inspection structs & methods ([dd4fb36](https://github.com/qri-io/qri/commit/dd4fb36))
   930  * **logbook:** construct logs from dataset histories ([0a3de84](https://github.com/qri-io/qri/commit/0a3de84))
   931  * **logbook:** log merge combines two logs ([8a3b006](https://github.com/qri-io/qri/commit/8a3b006))
   932  * **logsync:** add p2p logsync handler ([1b0f1c2](https://github.com/qri-io/qri/commit/1b0f1c2))
   933  * **logsync:** syncronize logs over HTTP ([1feb242](https://github.com/qri-io/qri/commit/1feb242))
   934  * **oplog:** `InitOpHash` returns the encoded hash of the initial op of a log ([4898375](https://github.com/qri-io/qri/commit/4898375))
   935  * **readme:** Readme component, prepare for removing viz ([d567a32](https://github.com/qri-io/qri/commit/d567a32))
   936  * **readme:** Render readme component as html ([21c274e](https://github.com/qri-io/qri/commit/21c274e))
   937  * **remote:** add logsync hooks ([70077bd](https://github.com/qri-io/qri/commit/70077bd))
   938  * **remote:** adding logsync to remote ([12fddad](https://github.com/qri-io/qri/commit/12fddad))
   939  * **remote:** embed log hook oplogs in hook context ([412852d](https://github.com/qri-io/qri/commit/412852d))
   940  * **remote:** populate LogPushFinalCheck dataset reference ([a768023](https://github.com/qri-io/qri/commit/a768023))
   941  * **remote:** push & pull logs on publish & add ([16c7b4e](https://github.com/qri-io/qri/commit/16c7b4e))
   942  * **VerifySigParams:** adds `VerifySigParams` & refactors all signature logic ([2c9e3f8](https://github.com/qri-io/qri/commit/2c9e3f8))
   943  
   944  
   945  ### Tests
   946  
   947  * **api:** update API tests to reflect breaking change to log ([1b6be4f](https://github.com/qri-io/qri/commit/1b6be4f))
   948  
   949  
   950  ### BREAKING CHANGES
   951  
   952  * **api:** log commands and api endpoint return a different data structure now
   953  
   954  
   955  
   956  # [0.9.0](https://github.com/qri-io/qri/compare/v0.9.0-alpha...v0.9.0) (2019-09-26)
   957  
   958  0.9.0 makes Qri work like Git! 
   959  
   960  # :open_file_folder: File System Integration [(RFC0025)](https://github.com/qri-io/rfcs/blob/master/text/0025-filesystem-integration.md)
   961  This release brings a few new commands into qri. If you're a [git](https://git-scm.com) user, these will look familiar:
   962  
   963  ```
   964  init        initialize a dataset directory
   965  checkout    checkout creates a linked directory and writes dataset files to that directory
   966  status      Show status of working directory
   967  restore     restore returns part or all of a dataset to a previous state
   968  ```
   969  
   970  You can now interact with a versioned dataset in similar way you would a git repository. Now creating new versions is as simple as `cd`ing to a linked directory and typing `qri save`.
   971  
   972  After a lot of thought & research, we've come to believe that using the filesystem as an interface is a great way to interact with versioned data. Git has been doing this for some time, and we've put thought & care into bringing the aspects of git that work well in this context. 
   973  
   974  Running the new `qri init` command will create an _FSI-linked directory_. A new datset will be created in your qri repo, and a hidden file called `.qri-ref` will be created in the folder you've initialized within. When you're linked directory you no longer need to type the name of a dataset to interact with it. `qri get body peername/dataset_name` is just `qri get body` when you're in an FSI-linked directory. You can see which datasets are linked when you `qri list`, it'll show the folder it's linked to.
   975  
   976  Unlike git, qri doesn't track _all_ files in a linked folder. Instead it only looks for specific filenames to map to dataset components:
   977  
   978  | component | possible filename                                   |
   979  | --------- | ----------------------------------------------------|
   980  | body      | `body.csv`, `body.json`, `body.xlsx`, `body.cbor`   |
   981  | meta      | `meta.json`, `meta.yaml`                            |
   982  | schema    | `schema.json`, `schema.yaml`                        |
   983  
   984  We'll be following up with support for transform and viz components shortly. It's still possible to create datasets that _don't_ have a link to the filesystem, and indeed this is still the better way to go for large datasets.
   985  
   986  File system integration opens up a whole bunch of opportunities for integration with other tools by dropping back to a common interface: files. Now you can use whatever software you'd like to edit dataset files, and by writing back to that folder with one of these name you're ready to version from the get go. command like `qri status` make it easy to keep track of where you are in your work, and `qri restore` makes it easy to "reset to head".
   987  
   988  
   989  # :desktop_computer: [Qri Desktop](https://github.com/qri-io/desktop)
   990  This is the first qri release that will be bundled into Qri Desktop, our brand new project for working with datasets. Qri desktop puts a face on qri, We'll be cutting a release of qri desktop shortly. Check it out!
   991  
   992  # :cloud: qri.cloud as a new default registry
   993  
   994  This release also puts a bunch of work into the registry. We've made the job of a registry smaller, moving much of the behaviour of dataset syncing into _remotes_, which any peer can now become. At the same time, we're hard at work building qri.cloud, our new hosted service for dataset management and collaboration. If you're coming from a prior version of qri, run the following to swich to the new registry:
   995  
   996  ```
   997  qri config set registry.location https://registry.qri.cloud
   998  ```
   999  
  1000  Now when you `qri publish`, it'll go to qri.cloud. _Lots_ of exciting things coming for qri cloud in the next few months.
  1001  
  1002  
  1003  
  1004  ### Bug Fixes
  1005  
  1006  * **add:** need to re-initialize add when connecting ([767d2ad](https://github.com/qri-io/qri/commit/767d2ad))
  1007  * **api:** remove files field is 'files', not 'delete' ([3017723](https://github.com/qri-io/qri/commit/3017723))
  1008  * **fsi:** Add relative directory to fsi body path. Parse body for status. ([4284b5e](https://github.com/qri-io/qri/commit/4284b5e))
  1009  * **fsi:** Init does not output a schema.json ([45b770c](https://github.com/qri-io/qri/commit/45b770c))
  1010  * **fsi:** Keep detected schema when body exists without a schema ([3ecdbbe](https://github.com/qri-io/qri/commit/3ecdbbe))
  1011  * **fsi unlink:** unlink command removes .qri-ref file ([0e6a8fd](https://github.com/qri-io/qri/commit/0e6a8fd))
  1012  * **fsi.DeleteFiles:** attempt to remove files, even on early return ([711f733](https://github.com/qri-io/qri/commit/711f733))
  1013  * **remove:** removing a dataset with no history should work ([f0ba1a1](https://github.com/qri-io/qri/commit/f0ba1a1))
  1014  * **search:** update to new registry api search result format ([1ac83bf](https://github.com/qri-io/qri/commit/1ac83bf))
  1015  * **test:** Handle test flakiness by forcing column type to be a string ([1880b17](https://github.com/qri-io/qri/commit/1880b17))
  1016  
  1017  
  1018  ### Features
  1019  
  1020  * **add:** add link flag to lib.Add, CLI, API ([61984f6](https://github.com/qri-io/qri/commit/61984f6))
  1021  * **fsi:** add fsimethods.Write to write directly to the linked filesystem ([65cdb12](https://github.com/qri-io/qri/commit/65cdb12))
  1022  * **fsi:** Api can set directory to create for init ([90e2115](https://github.com/qri-io/qri/commit/90e2115))
  1023  * **fsi:** Init can take a directory name to create for linking ([d62b816](https://github.com/qri-io/qri/commit/d62b816))
  1024  * **fsi:** Init may take a --source-body-path to create body file ([20517d9](https://github.com/qri-io/qri/commit/20517d9))
  1025  * **log:** book encryption methods, move book into log pkg ([47e8fbd](https://github.com/qri-io/qri/commit/47e8fbd))
  1026  * **log:** flatbuffer encoding code & test work ([b88d899](https://github.com/qri-io/qri/commit/b88d899))
  1027  * **log:** flatbuffer work, shuffling names, added signatures ([4545d66](https://github.com/qri-io/qri/commit/4545d66))
  1028  * **log:** initial CRDT dataset log proof of concept ([eaf4b94](https://github.com/qri-io/qri/commit/eaf4b94))
  1029  * **logbook:** add primitive method for getting log bytes ([9a736c2](https://github.com/qri-io/qri/commit/9a736c2))
  1030  * **logbook:** frame out API, unexport a bunch of stuff ([fac0bc7](https://github.com/qri-io/qri/commit/fac0bc7))
  1031  * **logbook:** initial example test passing ([5deea01](https://github.com/qri-io/qri/commit/5deea01))
  1032  * **mock registry:** add support for mock registry config ([7b7b98b](https://github.com/qri-io/qri/commit/7b7b98b))
  1033  * **registry:** add signup & prove subcommands ([8262c6d](https://github.com/qri-io/qri/commit/8262c6d))
  1034  * **remove:** add files and unlink flags to remove ([4c5a924](https://github.com/qri-io/qri/commit/4c5a924))
  1035  * **windows:** Set .qri-ref as hidden in Windows ([6d71d48](https://github.com/qri-io/qri/commit/6d71d48))
  1036  
  1037  
  1038  
  1039  # [0.9.0-alpha](https://github.com/qri-io/qri/compare/v0.8.2...v0.9.0-alpha) (2019-09-04)
  1040  
  1041  # Preparing for 0.9.0
  1042  We're not quite ready to put the seal-of-approval on 0.9.0, but it's been more than a few months since we cut a release. This alpha-edition splits the difference while we prepare for a full & proper 0.9.0. The forthcoming big ticket item will be _File System Integration_ [(RFC0025)](https://github.com/qri-io/rfcs/blob/master/text/0025-filesystem-integration.md), which dramatically simplifies the story around integrating with a version-controlled dataset.
  1043  
  1044  So while this isn't a proper release, the changelog gives a feel for just how much work is included this go-round. More soon!
  1045  
  1046  ### Bug Fixes
  1047  
  1048  * **api:** body requests honor full references ([335d2a4](https://github.com/qri-io/qri/commit/335d2a4))
  1049  * **api:** lowercase StatusItem when serialized to JSON ([e1790c9](https://github.com/qri-io/qri/commit/e1790c9))
  1050  * **api:** report proper publish status on dataset get ([2242fb7](https://github.com/qri-io/qri/commit/2242fb7))
  1051  * **api:** support stored status requests to /dsstatus ([880a7a3](https://github.com/qri-io/qri/commit/880a7a3))
  1052  * **api status, body, get:** fsi=true endpoints should not care if there is no history ([0c7649f](https://github.com/qri-io/qri/commit/0c7649f))
  1053  * **cfg:** Better error messages when validating config ([6ee7355](https://github.com/qri-io/qri/commit/6ee7355))
  1054  * **checkout:** absolutize FSI link creation paths ([64c3b41](https://github.com/qri-io/qri/commit/64c3b41))
  1055  * **cmd:** print export info using o.Out ([3bfec29](https://github.com/qri-io/qri/commit/3bfec29))
  1056  * **config:** change default registry location to https://registry.qri.cloud ([7d2248a](https://github.com/qri-io/qri/commit/7d2248a))
  1057  * **config:** relax repo config validation, make rpc work ([0d16d32](https://github.com/qri-io/qri/commit/0d16d32))
  1058  * **connect:** Handle error gracefully when already connected ([4770bde](https://github.com/qri-io/qri/commit/4770bde))
  1059  * **diff:** Better error when diffing a dataset with only 1 version ([0a90ab9](https://github.com/qri-io/qri/commit/0a90ab9))
  1060  * **diff:** Diff works for linked working directories ([d352e44](https://github.com/qri-io/qri/commit/d352e44))
  1061  * **ds:** Update dataset gomod, fix tests for change that omits errCount ([a99727b](https://github.com/qri-io/qri/commit/a99727b))
  1062  * **fill:** Error message consistency ([3b5470b](https://github.com/qri-io/qri/commit/3b5470b))
  1063  * **fsi:** body.csv files, set structure.format, don't crash in save ([1d83254](https://github.com/qri-io/qri/commit/1d83254))
  1064  * **fsi:** canonicalize alias before fetching ([073c640](https://github.com/qri-io/qri/commit/073c640))
  1065  * **fsi:** Cleanup error handling and some if statements ([2feb0ab](https://github.com/qri-io/qri/commit/2feb0ab))
  1066  * **fsi:** Ensure api does not send 500s for datasets without history ([6193c5f](https://github.com/qri-io/qri/commit/6193c5f))
  1067  * **fsi:** Marshal timestamps consistently to fix tests ([4733d9d](https://github.com/qri-io/qri/commit/4733d9d))
  1068  * **fsi:** Multiple bug fixes, unit tests. ([f483d95](https://github.com/qri-io/qri/commit/f483d95))
  1069  * **fsi:** Proper handling for fsi status with null datasets ([29606ea](https://github.com/qri-io/qri/commit/29606ea))
  1070  * **fsi:** serialize link json to lowerCamelCase ([9b8bb8d](https://github.com/qri-io/qri/commit/9b8bb8d))
  1071  * **fsi save:** fix fsi not accepting values from API ([8fca975](https://github.com/qri-io/qri/commit/8fca975))
  1072  * **lib:** profileMethods need to persist their changes ([ab4296a](https://github.com/qri-io/qri/commit/ab4296a))
  1073  * **publish:** sync refstore publication flag to remote publication ([a969b9a](https://github.com/qri-io/qri/commit/a969b9a))
  1074  * **regclient.Profile:** Profile struct has field formatting details when marshalling to json ([e3f0238](https://github.com/qri-io/qri/commit/e3f0238))
  1075  * **registry:** update repo profile on successful registration ([fcdfc05](https://github.com/qri-io/qri/commit/fcdfc05))
  1076  * **repo:** Error for accessing datasets with no history ([aa4dbb6](https://github.com/qri-io/qri/commit/aa4dbb6))
  1077  * **restore:** Restore will delete components that didn’t exist in previous version ([7f64f85](https://github.com/qri-io/qri/commit/7f64f85))
  1078  * **status:** Parse errors should also be shown for schema ([271b837](https://github.com/qri-io/qri/commit/271b837))
  1079  * **status:** Status displays parse errors, instead of bailing out ([6e5cde7](https://github.com/qri-io/qri/commit/6e5cde7))
  1080  * **unlinked status:** show status on unlinked datasets ([e7f561b](https://github.com/qri-io/qri/commit/e7f561b))
  1081  * **use:** Fix `qri get` with no args bug. Bump version. ([aaf295e](https://github.com/qri-io/qri/commit/aaf295e))
  1082  * **use:** Move `use` up to cmd/ from lib/. Delete select from repo/ ([8286730](https://github.com/qri-io/qri/commit/8286730))
  1083  * **validate:** Validate works with FSI. Various FSI cleanups. ([64c1ce1](https://github.com/qri-io/qri/commit/64c1ce1))
  1084  
  1085  
  1086  ### Features
  1087  
  1088  * **api:** add checkout endpoint ([18980f9](https://github.com/qri-io/qri/commit/18980f9))
  1089  * **api:** add fsilinks endpoint for debugging fsi ([f319452](https://github.com/qri-io/qri/commit/f319452))
  1090  * **api:** init fsi endpoint ([7613302](https://github.com/qri-io/qri/commit/7613302))
  1091  * **api.FSI:** initial FSI api methods ([63e57a3](https://github.com/qri-io/qri/commit/63e57a3))
  1092  * **checkout:** Checkout creates a linked directory from the repo ([be4d3eb](https://github.com/qri-io/qri/commit/be4d3eb))
  1093  * **cmd:** add fsi plumbing subcommand ([4d12de8](https://github.com/qri-io/qri/commit/4d12de8))
  1094  * **fsi:** add fsi body api handler ([ea7069c](https://github.com/qri-io/qri/commit/ea7069c))
  1095  * **fsi:** add save via fsi endpoint ([7ed6439](https://github.com/qri-io/qri/commit/7ed6439))
  1096  * **fsi:** link flatbuffer serialization ([71e9ff8](https://github.com/qri-io/qri/commit/71e9ff8))
  1097  * **fsi:** Package fsi defines qri file system integration ([0214d2f](https://github.com/qri-io/qri/commit/0214d2f))
  1098  * **fsi:** read fsi-linked dataset ([74705ac](https://github.com/qri-io/qri/commit/74705ac))
  1099  * **fsi:** Remove GetDatasetRefString, use RefSelect everywhere ([4b1edc6](https://github.com/qri-io/qri/commit/4b1edc6))
  1100  * **init:** qri init binds a directory to a dataset selection ([8e5a203](https://github.com/qri-io/qri/commit/8e5a203))
  1101  * **ipfs_http:** support for ipfs_http store ([aaf7d0a](https://github.com/qri-io/qri/commit/aaf7d0a))
  1102  * **lib:** add extra options to make NewInstance work in test settings ([b67dcff](https://github.com/qri-io/qri/commit/b67dcff))
  1103  * **qri-ref:** Cleanup return values, use varName package ([d3b8688](https://github.com/qri-io/qri/commit/d3b8688))
  1104  * **qri-ref:** Commands to link a working directory to a dataset ([93c50c2](https://github.com/qri-io/qri/commit/93c50c2))
  1105  * **registry:** sync local profile details on successful signup ([d184f98](https://github.com/qri-io/qri/commit/d184f98))
  1106  * **remote:** add support for ref removes ([e2a6d3a](https://github.com/qri-io/qri/commit/e2a6d3a))
  1107  * **replace-save dataset:** support dataset save without patching from prior verion ([9906727](https://github.com/qri-io/qri/commit/9906727))
  1108  * **restore:** Add api for restore. Test for checkout and restore apis. ([d1d9670](https://github.com/qri-io/qri/commit/d1d9670))
  1109  * **restore:** Restore command for restoring component files in FSI ([620d95d](https://github.com/qri-io/qri/commit/620d95d))
  1110  * **status:** add initial status check func ([e3eb1c1](https://github.com/qri-io/qri/commit/e3eb1c1))
  1111  * **status:** FSI status include file mtime. Requires flag for cmdline. ([2ccffd6](https://github.com/qri-io/qri/commit/2ccffd6))
  1112  * **status:** report removed files in qri status ([e5c7fde](https://github.com/qri-io/qri/commit/e5c7fde))
  1113  * **status:** Status at a specific dataset version, historical changes ([cbc108c](https://github.com/qri-io/qri/commit/cbc108c))
  1114  * **status:** Status UI. RefSelect to simplify handling references in cmd ([21f547a](https://github.com/qri-io/qri/commit/21f547a))
  1115  * **unpublish:** support both publish & unpublish, expand remote behaviour ([f23f467](https://github.com/qri-io/qri/commit/f23f467))
  1116  
  1117  
  1118  
  1119  # [0.8.2](https://github.com/qri-io/qri/compare/v0.8.1...v0.8.2) (2019-06-25)
  1120  
  1121  
  1122  Version 0.8.2 is a patch release that improves qri's command-line client in numerous small ways
  1123  
  1124  ## Webapp
  1125  * Multiple problems were fixed around webapp fetching, saving, and pinning. The general end-user experience was also improved by allowing the frontend to show an interstitial screen while the backend was fetching the webapp.
  1126  
  1127  ## Stdout / stderr usage
  1128  * Many related issues around stdout and stderr usage were fixed, such as missing endlines being added, and prompts meant to always be seen were moved to stderr.
  1129  
  1130  ## Misc
  1131  * `qri get` gained a flag `--pretty` to pretty-print json.
  1132  * `qri save` with the strict flag set will produce an error if it fails to validate
  1133  * `qri add` can use a full reference to specify which version to add
  1134  
  1135  
  1136  ### Bug Fixes
  1137  
  1138  * **add:** add specific versions of a dataset using the full reference ([4b1e562](https://github.com/qri-io/qri/commit/4b1e562))
  1139  * **config:** `config.Copy()` copies over the path ([2fd3420](https://github.com/qri-io/qri/commit/2fd3420))
  1140  * **secrets:** Write secrets warning to stderr instead of stdout ([b43a4b7](https://github.com/qri-io/qri/commit/b43a4b7))
  1141  * **unpublish:** Add endline when printing message ([#810](https://github.com/qri-io/qri/issues/810)) ([0ced201](https://github.com/qri-io/qri/commit/0ced201))
  1142  * **validate:** Allow validate to run when connected ([#808](https://github.com/qri-io/qri/issues/808)) ([dedc0c5](https://github.com/qri-io/qri/commit/dedc0c5))
  1143  * **webapp:** resolve webapp path before passing path to the handler ([f38dcf4](https://github.com/qri-io/qri/commit/f38dcf4))
  1144  * **webapp loading:** pin webapp from dweb, send temporary script if loading ([4fb2921](https://github.com/qri-io/qri/commit/4fb2921))
  1145  
  1146  
  1147  ### Code Refactoring
  1148  
  1149  * **cmd:** remove ephemeral `qri connect` flags ([8620aa0](https://github.com/qri-io/qri/commit/8620aa0))
  1150  
  1151  
  1152  ### Features
  1153  
  1154  * **pretty:** Pretty flag for get command ([b6f579b](https://github.com/qri-io/qri/commit/b6f579b))
  1155  
  1156  
  1157  ### BREAKING CHANGES
  1158  
  1159  * **cmd:** removes:
  1160  
  1161  `--disconnect-after`
  1162  `--disable-api`
  1163  `--disable-rpc`
  1164  `--disable-webapp`
  1165  `--disable-p2p`
  1166  `--read-only`
  1167  `--remote-mode`
  1168  
  1169  These can be configured instead by using the `qri config` command
  1170  
  1171  Removing these temporary flags let's us better reason about the state of the config at any time, as well as helps us be confident that at any time we are not saving over our config with false information.
  1172  
  1173  
  1174  
  1175  <a name="v0.8.1"></a>
  1176  # [v0.8.1](https://github.com/qri-io/qri/compare/v0.8.0...v) (2019-06-11)
  1177  
  1178  This patch release fixes a small-but-critical bug that prevented `qri setup` from working. A few other fixes & bumps made it in, but the main goal was restoring `qri setup` so folks can, you know, set qri up.
  1179  
  1180  ### Bug Fixes
  1181  
  1182  * **config:** lib.NewInstance option func must check for nil pointers ([69537ce](https://github.com/qri-io/qri/commit/69537ce))
  1183  * **lib/diff:** adjust deepdiff.Diff params ([62a13eb](https://github.com/qri-io/qri/commit/62a13eb))
  1184  * **setup:** load plugins before attempting to setup IPFS ([#795](https://github.com/qri-io/qri/issues/795)) ([69c5fda](https://github.com/qri-io/qri/commit/69c5fda))
  1185  * **startf:** bump version number to 0.8.1 ([e27466a](https://github.com/qri-io/qri/commit/e27466a))
  1186  
  1187  
  1188  ### Features
  1189  
  1190  * **diff:** return source data in diff response ([d3eae83](https://github.com/qri-io/qri/commit/d3eae83))
  1191  * **diff:** return source data in diff response ([d1d2da5](https://github.com/qri-io/qri/commit/d1d2da5))
  1192  
  1193  
  1194  
  1195  <a name="0.8.0"></a>
  1196  # [0.8.0](https://github.com/qri-io/qri/compare/v0.7.3...v0.8.0) (2019-06-05)
  1197  
  1198  Version 0.8.0 is our best-effort to close out the first set of public features.
  1199  
  1200  ## Automatic Updates ([RFC0024](https://github.com/qri-io/rfcs/blob/master/text/0024-scheduled-updates.md))
  1201  Qri can now keep your data up to date for you.  0.8.0 overhauls `qri update` into a service that schedules & runs updates in the background on your computer. Qri runs datasets and maintains a log of changes.
  1202  
  1203  ### schedule shell scripts
  1204  Scheduling datasets that have starlark transforms is the ideal workflow in terms of portability, but a new set of use cases open by adding the capacity to schedule & execute shell scripts within the same cron environment. 
  1205  
  1206  ## Starlark changes
  1207  We've made two major changes, and one small API-breaking change. Bad news first:
  1208  
  1209  ### `ds.set_body` has different optional arguments
  1210  `ds.set_body(csv_string, raw=True, data_format="csv")` is now `ds.set_body(csv_string, parse_as="csv")`. We think think this makes more sense, and that the previous API was confusing enough that we needed to completely deprecate it. Any prior transform scripts that used `raw` or `data_format` arguments will need to update.
  1211  
  1212  ### new beautiful soup-like HTML package
  1213  Our `html` package is difficult to use, and we plan to deprecate it in a future release. In it's place we've introduced `bsoup`, a new package that implements parts of the [beautiful soup 4 api](https://www.crummy.com/software/BeautifulSoup/bs4). It's _much_ easier use, and will be familiar to anyone coming from the world of python.
  1214  
  1215  
  1216  ### the "ds" passed to a transform is now the previous dataset version
  1217  The `ds` that's passed to is now the existing dataset, awaiting transformation. For technical reasons, `ds` used to be a blank dataset. In this version we've addressed those issues, which makes examining the current state a dataset possible without any extra `load_dataset` work. This  makes things like append-only datasets a one-liner:
  1218  
  1219  ```python
  1220  def transform(ds,ctx):
  1221    ds.set_body(ds.get_body().append(["new row"]))
  1222  ```
  1223  
  1224  ### CLI uses '$PAGER' on POSIX systems
  1225  Lots of Qri output is, well, long, so we now check for the presence of the `$PAGER` environment variable and use it to show "scrolling" data where appropriate. While we're at it we've cleaned up  output to make things a little more readable. Windows should be unaffected by this change. If you ever want to _avoid_ pagination, I find the easiest way to do so is by piping to `cat`. For example:
  1226  ```
  1227  $ qri ls | cat
  1228  ```
  1229  Happy paging!
  1230  
  1231  ### Switch to go modules
  1232  Our project has now switched entirely to using go modules. In the process we've deprecated `gx`, the distributed package manager we formerly used to fetch qri dependencies. This should dramatically simplify the process of building Qri from source by bringing dependency management into alignment with idiomatic go practices.
  1233  
  1234  ### Dataset Strict mode
  1235  `dataset.structure` has a new boolean field: `strict`. If `strict` is `true`, a dataset _must_ pass validation against the specified schema in order to save. When a dataset Dataset is in strict mode, Qri can assume that all data in the body is valid. Being able to make this assumption will allow us to provide additional functionality and performance speedups in the future. If your dataset has no errors, be sure to set `strict` to `true`.
  1236  
  1237  
  1238  
  1239  ### Bug Fixes
  1240  
  1241  * **`doesCommandExist`:** fix to `exec.Command` ([4319db3](https://github.com/qri-io/qri/commit/4319db3))
  1242  * **`printToPager`:** different syntax needed for different systems ([86644a0](https://github.com/qri-io/qri/commit/86644a0))
  1243  * **api/export:** `/export/` api endpoint now sends data! ([7718b26](https://github.com/qri-io/qri/commit/7718b26))
  1244  * **api/list:** fix/add pagination for api `/list` endpoint ([6187c09](https://github.com/qri-io/qri/commit/6187c09))
  1245  * **base:** cron dataset command shouldn't use quotes in args ([d0568dc](https://github.com/qri-io/qri/commit/d0568dc))
  1246  * **base.DatasetLog:** fix limit and offset logic ([f7b042d](https://github.com/qri-io/qri/commit/f7b042d))
  1247  * **base.ListDataset:** add offset and limit to base.ListDataset ([dab742a](https://github.com/qri-io/qri/commit/dab742a))
  1248  * **base/log:** fix error that didn't check if PreviousPath exists before loading it ([748e58b](https://github.com/qri-io/qri/commit/748e58b))
  1249  * **canonicalize:** Correct peername when profileID matches ([affc3c3](https://github.com/qri-io/qri/commit/affc3c3))
  1250  * **cmd:** don't use FgWhite, breaks light-colored termimals ([32b8793](https://github.com/qri-io/qri/commit/32b8793))
  1251  * **cmd:** listing page 2 starts numbering at the offset ([b37d186](https://github.com/qri-io/qri/commit/b37d186))
  1252  * **cmd/get:** must catch `DatasetRequest` error ([f200acc](https://github.com/qri-io/qri/commit/f200acc))
  1253  * **config:** Check err when parsing config to avoid segfault ([f88e6e6](https://github.com/qri-io/qri/commit/f88e6e6))
  1254  * **config:** fix api.Copy not copying all fields ([4f30f9f](https://github.com/qri-io/qri/commit/4f30f9f))
  1255  * **config:** make setter actually write file ([12230e3](https://github.com/qri-io/qri/commit/12230e3))
  1256  * **connect:** use lib.NewInstance with qri connect ([3fc3de4](https://github.com/qri-io/qri/commit/3fc3de4))
  1257  * **cron:** connect cron to log file, actually run returned command in lib ([41c9366](https://github.com/qri-io/qri/commit/41c9366))
  1258  * **docs:** Building on windows, rpi, and brew install instructions ([8953591](https://github.com/qri-io/qri/commit/8953591))
  1259  * **events:** event PeerIDs serialize properly to strings ([7f4a23e](https://github.com/qri-io/qri/commit/7f4a23e))
  1260  * **fill.Struct:** If present, use field tag as the field name ([432da1d](https://github.com/qri-io/qri/commit/432da1d))
  1261  * **linux:** Ignore errors from setting rlimit, needs root on linux ([02108a9](https://github.com/qri-io/qri/commit/02108a9))
  1262  * **list:** qri list new command-line interface ([daf2b70](https://github.com/qri-io/qri/commit/daf2b70))
  1263  * **Makefile:** Require go version 1.11 ([0cc2f9b](https://github.com/qri-io/qri/commit/0cc2f9b))
  1264  * **p2p:** Improve comment for IPFSCoreAPI accessor ([aec34c5](https://github.com/qri-io/qri/commit/aec34c5))
  1265  * **p2p:** pass missing context to ipfsfs.GoOnline ([43a4b2e](https://github.com/qri-io/qri/commit/43a4b2e))
  1266  * **peers:** add default limit to peers, fix test ([fe8f6d8](https://github.com/qri-io/qri/commit/fe8f6d8))
  1267  * **ref:** CanonicalizeProfile just handles renames all the time ([be1736b](https://github.com/qri-io/qri/commit/be1736b))
  1268  * **render:** supply default 'html' format if none exists ([2b82b41](https://github.com/qri-io/qri/commit/2b82b41))
  1269  * **repo/test:** fix rebase mistake, func should be named `NewTestRepoWithHistory` ([a39a6ae](https://github.com/qri-io/qri/commit/a39a6ae))
  1270  * **transform:** Pass prev dataset to ExecScript ([6ff666c](https://github.com/qri-io/qri/commit/6ff666c))
  1271  * **update:** fix update run missing type assignment, absolutize paths ([11ec50c](https://github.com/qri-io/qri/commit/11ec50c))
  1272  * **vet:** fix go vet error ([8f46850](https://github.com/qri-io/qri/commit/8f46850))
  1273  * plumb context into network methods ([fb036e3](https://github.com/qri-io/qri/commit/fb036e3))
  1274  
  1275  
  1276  ### Code Refactoring
  1277  
  1278  * **cmd:** change `limit` and `offset` flags to `page` and `page-size` ([62d5da8](https://github.com/qri-io/qri/commit/62d5da8))
  1279  * **lib.AbsPath:** deprecate lib.AbsPath, use qfs.AbsPath ([112362a](https://github.com/qri-io/qri/commit/112362a))
  1280  
  1281  
  1282  ### Features
  1283  
  1284  * **/list/:** add `term` param to `/list/` api, for local dataset search ([f66f857](https://github.com/qri-io/qri/commit/f66f857))
  1285  * **api:** add update endpoints ([f5f2024](https://github.com/qri-io/qri/commit/f5f2024))
  1286  * **base/fill:** Overhaul error handling ([1deb967](https://github.com/qri-io/qri/commit/1deb967))
  1287  * **cmd:** add --repo and --ipfs-path flags ([1711f30](https://github.com/qri-io/qri/commit/1711f30))
  1288  * **cmd:** overhaul update command ([4218a28](https://github.com/qri-io/qri/commit/4218a28))
  1289  * **config:** add update configuration details ([5786d68](https://github.com/qri-io/qri/commit/5786d68))
  1290  * **cron:** add cron package for scheduling dataset updates ([7b38164](https://github.com/qri-io/qri/commit/7b38164))
  1291  * **cron:** add flatbuffer HTTP api server & client ([50388e5](https://github.com/qri-io/qri/commit/50388e5))
  1292  * **cron:** add incrementing job.RunNumber, refactor job field names ([5f6b403](https://github.com/qri-io/qri/commit/5f6b403))
  1293  * **cron:** store dataset SaveParams as job options ([df629a7](https://github.com/qri-io/qri/commit/df629a7))
  1294  * **cron:** store logs and files of stdout logs ([a9f3c52](https://github.com/qri-io/qri/commit/a9f3c52))
  1295  * **cron.FbStore:** store cron jobs as flatbuffers ([755186d](https://github.com/qri-io/qri/commit/755186d))
  1296  * **cron.file:** FileJobStore for saving jobs to a backing CBOR file ([9d4de77](https://github.com/qri-io/qri/commit/9d4de77))
  1297  * **fill.Struct:** Support interface{} fields, require map string keys ([46166d1](https://github.com/qri-io/qri/commit/46166d1))
  1298  * **instance:** instroduce Instance, deprecate global config ([53a8e4b](https://github.com/qri-io/qri/commit/53a8e4b))
  1299  * **lib:** sew initial cron service into lib ([5e8a871](https://github.com/qri-io/qri/commit/5e8a871))
  1300  * **peers:** fix limit/offset bugs, add sending output to `less` when listing peer cache ([2e623db](https://github.com/qri-io/qri/commit/2e623db))
  1301  * **update:** add update log command and api endpoints ([56c4840](https://github.com/qri-io/qri/commit/56c4840))
  1302  * **update:** build out update package API, use it ([3004fd8](https://github.com/qri-io/qri/commit/3004fd8))
  1303  * **update:** cleanup CLI output ([fa2ebad](https://github.com/qri-io/qri/commit/fa2ebad))
  1304  * **update:** detect and report 'no changes' on dataset jobs ([ae63512](https://github.com/qri-io/qri/commit/ae63512))
  1305  * **update:** experimental support for multi-repo updates with --use-repo ([9ae8d44](https://github.com/qri-io/qri/commit/9ae8d44))
  1306  * **update:** introduce update package & update daemon ([dc6066c](https://github.com/qri-io/qri/commit/dc6066c))
  1307  * **update:** support updates via shell scripts ([c94edd8](https://github.com/qri-io/qri/commit/c94edd8))
  1308  
  1309  
  1310  ### BREAKING CHANGES
  1311  
  1312  * **cron:** Field names of cron.Job have been refactored, which will break repo/update/logs.qfb and repo/update/jobs.qfb files. Delete them to fix.. This will only affect users who have been building from source between releases.
  1313  * **connect:** "qri connect" no longer has flags for setting port numbers
  1314  * **api:** /update endpoint is moved to /update/run
  1315  * **cmd:** On the cli, all `limit` and `offset` flags have been changed to `page` and `page-size`.
  1316  * **lib.AbsPath:** lib.AbsPath is removed, use github.com/qri-io/qfs.AbsPath instead
  1317  
  1318  
  1319  
  1320  <a name="0.7.3"></a>
  1321  # [0.7.3](https://github.com/qri-io/qri/compare/v0.7.2...v0.7.3) (2019-04-03)
  1322  
  1323  This release is all about 3 Rs:
  1324  * Rendering
  1325  * Remotes
  1326  * `load_dataset`
  1327  
  1328  This release we've focused on improving dataset visualiing, setting the stage with better defaults and a cleaner API for creating custom viz. We think expressing dataset vizualiations as self-contained `html` makes Qri datasets an order of magnitude more useful, and can't wait for you to try it.
  1329  
  1330  Along with the usual bug fixes, a few nice bonuses have landed, like supplying [multiple `--file` args](https://github.com/qri-io/qri/pull/718) to qri save to combine dataset input files, and `qri get rendered` to show rendered viz. Anyway, on to the big stuff:
  1331  
  1332  ### Default Rendering ([RFC0011](https://github.com/qri-io/rfcs/blob/master/text/0011-html_viz.md))
  1333  Whenever you create a new dataset version, Qri will now create a default viz component if you don't provide one. Unless run with `--no-render`, Qri will now execute that template, and store the result in a file called `index.html` in your dataset. This makes your dataset _much_ more fun when viewed directly on the d.web, which is outside of Qri entirely.
  1334  
  1335  This is because IPFS HTTP gateways are sensitive to `index.html`. When you use qri to make a dataset, your dataset comes with a self-contained visualization that others can see without downloading Qri at all.
  1336  
  1337  We think this dramatically increases the usefulness of a dataset, and increases the chances that others will want to share & disseminate your work by making your dataset a more-complete offering in the data value chain. These embedded default visualizations drop the time it takes to create a readable dataset to one step.
  1338  
  1339  That being said, we've intentionally made the default visualization rather bland. The reason for this is twofold. First, to keep the file size of the `index.html` small (less than 1KB). Second, we want you to customize it. We'll refine the default template over time, but we hope you'll use viz to tell a story with your data.
  1340  
  1341  Users may understandably want to disable default vizualizations. To achieve this `qri save` and `qri update` have a new flag: `--no-render`. No render will prevent the execution of any viz template. This will save ~1KB per version, at the cost of usability.
  1342  
  1343  ### Overhauled HTML Template API ([RFC0011](https://github.com/qri-io/rfcs/blob/master/text/0011-html_viz.md#template-api))
  1344  Keeping with the theme of better viz, we've also taken time to overhaul our template API. Given that this is a public API, we took some time to think about what it would mean to try to render Qri templates _outside_ of our go implementation. While no code does this today, we wanted to make sure it would be easier in the future, so we took steps to define an API that generally avoids use of the go templating `.`, instead presenting a `ds` object with json-case accessors. Taking things like this:
  1345  
  1346  ```
  1347  <h1>{{ .Meta.Title }}</h1>
  1348  ```
  1349  to this: 
  1350  ```
  1351  <h1>{{ ds.meta.title }}</h1>
  1352  ```
  1353  
  1354  This change brings the template syntax closer to the way we work with datasets in other places (eg: in `dataset.yaml` files and starlark transform scripts), which should help cut down on the mental overhead of working with a dataset in all these locations. We think this up-front work on our template API will make it easier to start writing custom templates. We don't have docs up yet, but the RFC [reference](https://github.com/qri-io/rfcs/blob/master/text/0011-html_viz.md#reference-level-explanation) section outlines the API in detail.
  1355  
  1356  ### Experimental Remote Mode ([RFC0022](https://github.com/qri-io/rfcs/blob/master/text/0022-remotes.md))
  1357  The registry is nice and all, but we need more ways to push data around. In this release we're launching a new expriment called "remotes" that start into this work. Remotes act as a way for any user of Qri to setup their own server that keeps datasets alive, providing availability and ownership over data within a set of nodes that they control.
  1358  
  1359  Currently we consider this feature "advanced only" as it comes with a number of warnings and some special setup configuration. For more info, [check the RFC](https://github.com/qri-io/rfcs/blob/master/text/0022-remotes.md), and if you're interested in running a remote, [hop on discord](https://discordapp.com/invite/etap8Gb) and say "hey I want to run a remote".
  1360  
  1361  
  1362  ### Starlark `load_dataset` ([RFC0023](https://github.com/qri-io/rfcs/blob/master/text/0023-starlark_load_dataset.md))
  1363  We've made a breaking API change in Starlark that deprecates `qri.load_dataset_body`, and introduce a new global function: `load_dataset`. This new API makes it clear that `load_dataset` both loads the dataset and declares it as a dependency of this script. This is an important step toward making datasets a first-class citizen in the qri ecosystem. Here's an example of the new syntax:
  1364  
  1365  ```python
  1366  load("http.star", "http")
  1367  
  1368  # load a dataset into a variable named "fhv"
  1369  fhv = load_dataset("b5/nyc_for_hire_vehicles")
  1370  
  1371  def download(ctx):
  1372    # use the fhv dataset to inform an http request
  1373    vins = ["%s,%s" % (entry['vin'], entry['model_yearl']), for entry in fhv.body()]
  1374  
  1375    res = http.post("https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/", form_body={
  1376      'format': 'JSON', 
  1377      'DATA': vins.join(";")
  1378    })
  1379  
  1380    return res.json()
  1381  
  1382  def transform(ds, ctx):
  1383    ds.set_body(ctx.download)
  1384  ```
  1385  
  1386  Users who were previously using `qri.load_dataset_body` will need to update their scripts to use the new syntax. The easiest way to do that is by adding a new version to your dataset history with the updated script:
  1387  ```
  1388  $ qri get transform.script me/dataset > transform.star
  1389  # make updates to transform.star file & save
  1390  $ qri save --file transform.script me/dataset
  1391  ```
  1392  Three easy steps, and your dataset log tells the story of the upgrade.
  1393  
  1394  
  1395  ### Bug Fixes
  1396  
  1397  * **api:** Listen on localhost for API and RPC ([04a4500](https://github.com/qri-io/qri/commit/04a4500))
  1398  * **fill_struct:** Work with non-pointer structs and pointers to non-structs ([0d14bac](https://github.com/qri-io/qri/commit/0d14bac))
  1399  * **get:** If format is misspelled, display an error ([b8fcceb](https://github.com/qri-io/qri/commit/b8fcceb))
  1400  * **save:** Better error message when saving with wrong file ([75cb06a](https://github.com/qri-io/qri/commit/75cb06a))
  1401  * **tests:** Save with viz needs html format, update testdata file ([f7cd486](https://github.com/qri-io/qri/commit/f7cd486))
  1402  
  1403  
  1404  ### Code Refactoring
  1405  
  1406  * **render:** remove limit, offset, all parmeters ([165abce](https://github.com/qri-io/qri/commit/165abce))
  1407  
  1408  
  1409  ### Features
  1410  
  1411  * **cmd/get:** add `rendered` to selector in `qri get` command ([90719a8](https://github.com/qri-io/qri/commit/90719a8))
  1412  * **dag info:** add label for rendered viz output ([7157cd7](https://github.com/qri-io/qri/commit/7157cd7))
  1413  * **daginfo:** add `qri daginfo` command that returns a dag.Info of a dataset ([e4d9e27](https://github.com/qri-io/qri/commit/e4d9e27))
  1414  * **daginfo:** add summary view for `qri daginfo` ([9f9b32f](https://github.com/qri-io/qri/commit/9f9b32f))
  1415  * **dagInfo:** add ability to get a subDag at a specific label ([7a07ee8](https://github.com/qri-io/qri/commit/7a07ee8))
  1416  * **remote:** Beginning of "remote" mode implementation ([49dbef9](https://github.com/qri-io/qri/commit/49dbef9))
  1417  * **remote:** Bump version number, review fixes. ([21a4448](https://github.com/qri-io/qri/commit/21a4448))
  1418  * **remote:** Deserialize response from remote using json.Decode ([2d73e84](https://github.com/qri-io/qri/commit/2d73e84))
  1419  * **remote:** Parse config using FillStruct. Remotes field. ([a2efbf3](https://github.com/qri-io/qri/commit/a2efbf3))
  1420  * **remote:** Retrieve sessionID & diff first, pass both to dsync ([7f3d8bc](https://github.com/qri-io/qri/commit/7f3d8bc))
  1421  * **remote:** Send actual dag.Info to remote, perform dsync ([5cec2de](https://github.com/qri-io/qri/commit/5cec2de))
  1422  * **remote:** Switch to --remote-accept-size-max flag ([b26cbb9](https://github.com/qri-io/qri/commit/b26cbb9))
  1423  * **remotes:** base/fill/PathValue used by Config, to enable Remotes ([4d45dce](https://github.com/qri-io/qri/commit/4d45dce))
  1424  * **remotes:** Complete dsync by writing to ds_refs and pinning ([b47a3e4](https://github.com/qri-io/qri/commit/b47a3e4))
  1425  * **save:** add `no-render` option to `qri save` command ([a8f36b2](https://github.com/qri-io/qri/commit/a8f36b2))
  1426  * **save:** More tests for saving: viz, transform. Update comments. ([91246fe](https://github.com/qri-io/qri/commit/91246fe))
  1427  * **save:** Save a dataset with multiple file arguments ([23735b7](https://github.com/qri-io/qri/commit/23735b7))
  1428  * **save:** Tests for saving datasets with multiple file arguments ([9fe54bc](https://github.com/qri-io/qri/commit/9fe54bc))
  1429  
  1430  
  1431  ### BREAKING CHANGES
  1432  
  1433  * **render:** qri render limit, offset, all parameters have been removed
  1434  
  1435  
  1436  
  1437  <a name="0.7.2"></a>
  1438  # [0.7.2](https://github.com/qri-io/qri/compare/v0.7.1...v0.7.2) (2019-03-14)
  1439  
  1440  
  1441  ### Better piping for `qri save`
  1442  Minor set of fixes aimed at making the command line work better. The biggest command we've fixed is `qri save --dry-run`. Qri now properly routes diagnostic output to `stderr` (things like the spinner, transform exectution, and completion messages), while sending the _result_ of the dry run to `stdout`. This makes the following much more powerful:
  1443  
  1444  `qri save --dry-run --file transform.star me/dataset > dry_run_output.json`
  1445  
  1446  If save works, the `dry_run_output.json` will now be a valid `json` file representing the result of the dry run, and you'll still see progress output in your terminal window. We'll be working to bring this separation of diagnostic & results output to all commands in the near future.
  1447  
  1448  ### Run transforms directly with the `--file` flag
  1449  One other small note, if you feed a file that ends in `.star` to `qri save --file`, Qri will assume you mean it to be a transform script, and execute it as such. This cuts out the need for a `dataset.yaml` file, and makes working with transforms a little easier to reason about. If you need to provide configuration details to the transform, you'll still need to create a `dataset.yaml` file & specify your `.star` file there.
  1450  
  1451  
  1452  ### Bug Fixes
  1453  
  1454  * **get:** better defaults for get body. ([5631d08](https://github.com/qri-io/qri/commit/5631d08))
  1455  * **stderr:** write save diagnostic output to stderr ([3dac8b8](https://github.com/qri-io/qri/commit/3dac8b8))
  1456  
  1457  
  1458  ### Features
  1459  
  1460  * **ReadDatasetFile:** infer .star & .html files to be bare tf & vz components ([89fcba8](https://github.com/qri-io/qri/commit/89fcba8))
  1461  
  1462  
  1463  ### BREAKING CHANGES
  1464  
  1465  * **get:** cli body command is now removed
  1466  
  1467  
  1468  
  1469  <a name="0.7.1"></a>
  1470  # [0.7.1](https://github.com/qri-io/qri/compare/v0.7.0...v0.7.1) (2019-03-07)
  1471  
  1472  0.7.1 is on the larger side for a patch release, shipping fixes & features aimed at doing more with datasets. With this release qri is better at comparing data, and more flexible when it comes to both saving & exporting data.
  1473  
  1474  ### Overhauled Diff
  1475  We've completely overhauled our `diff` command, using a new algorithm that's capable of diffing large volumes of structured data quickly. We've also adjusted the command itself to work with structured data both inside and outside of qri.
  1476  
  1477  Two caveats come with this new feature:
  1478  * This code is new. We have tests that show our differ produces _valid_ diff scripts, but sometimes diff doesn't produce diffs that are fun to read. We'd love your feedback on improving the new diff command.
  1479  * We haven't really figured out a proper way to _visualize_ these diffs yet.
  1480  
  1481  Caveats aside, new diff is mad decent. Here's a few examples:
  1482  
  1483  ```
  1484  # get more info on diff:
  1485  $ qri diff --help
  1486  
  1487  # diff dataset body against it's previous version:
  1488  $ qri diff body me/annual_pop
  1489  
  1490  # diff two dataset meta sections:
  1491  $ qri diff meta me/population_2016 me/population_2017
  1492  
  1493  # diff two local json files:
  1494  $ qri diff a.json b.json
  1495  
  1496  # diff a json & a csv file:
  1497  $ qri diff data.csv b.json
  1498  
  1499  # output diff as json
  1500  $ qri diff a.json b.json --format json
  1501  
  1502  # print just a diff summary
  1503  $ qri diff me/annual_pop --summary
  1504  ```
  1505  
  1506  ### Revamped Export
  1507  We've overhauled our export command to up it's utility. We've also introduced the terms "foreign" and "native" export to refer to the _fidelity_ of an export. This round of improvements has focused on foreign exports, which converts qri datasets into common formats. For example, now you can (finally) express a complete dataset as json:
  1508  
  1509  ```
  1510  $ qri export --format json me/annual_pop
  1511  ```
  1512  
  1513  We've also made the role `qri export` plays work better in relation to `qri get`. If you want a _complete_ dataset, use `qri export`. If you want a piece of a dataset (for example, just the body), use `qri dataset`.
  1514  
  1515  
  1516  ### Shorthand Save Files
  1517  
  1518  We've added a way to save changes to datasets that only affect individual components. If you only want to change, say the meta section of a dataset, you can now create a file that only affects the meta component. In the past,  you'd have no choice but to construct a complete dataset document, and only alter the `meta` section. Instead you can now save a file like this:
  1519  
  1520  ```json
  1521  {
  1522    "qri": "md:0", // this "md:0" value for the "qri" key tells qri this only affects meta
  1523    "title" : "this is a new title",
  1524    "description": "new decription"
  1525  }
  1526  ```
  1527  
  1528  and give that to save:
  1529  `$ qri save --file meta.json me/dataset`
  1530  
  1531  Qri will interpret this file and apply the changes to the meta component. This pairs very nicely with `qri get` to make workflows that only affect specific components, you could use this to change a dataset's schema, which lives in the `structure` component:
  1532  ```
  1533  $ qri get structure me/annual_pop  > structure.yaml
  1534  
  1535  # save changes to structure.yaml
  1536  
  1537  $ qri save --file structure.yaml me/annual_pop
  1538  ```
  1539  
  1540  ### Starlark improvements:
  1541  We've added a `json` package to starlark, and given `math` a new method `round()`, which is not built into starlark as a language primtive. If you want to round numbers in starlark scripts, do this:
  1542  
  1543  ```python
  1544  load("math.star", "math")
  1545  
  1546  print(math.round(3.5)) # prints: 4
  1547  ```
  1548  
  1549  ### Fixes
  1550  We've also shipped a bunch of little bug fixes that should add up to a better experience. All the changes described above also apply to the qri JSON api as well. Happy versioning!
  1551  
  1552  
  1553  ### Bug Fixes
  1554  
  1555  * **actions.SaveDataset:** delay inferring values until after writing changes ([86f57fa](https://github.com/qri-io/qri/commit/86f57fa))
  1556  * **api:** restore api /diff endpoint ([e71fd8e](https://github.com/qri-io/qri/commit/e71fd8e))
  1557  * **base.ReadEntries:** Simplify ReadEntries by using PagedReader in render ([4f914a6](https://github.com/qri-io/qri/commit/4f914a6))
  1558  * **cli persistent flags:** properly register global flags ([f4f1ed7](https://github.com/qri-io/qri/commit/f4f1ed7)), closes [#506](https://github.com/qri-io/qri/issues/506)
  1559  * **export:** Export --zip flag ([8514c76](https://github.com/qri-io/qri/commit/8514c76))
  1560  * **export:** Overhaul export command ([f7df3f9](https://github.com/qri-io/qri/commit/f7df3f9))
  1561  * **export:** Test cases for export ([12a279f](https://github.com/qri-io/qri/commit/12a279f))
  1562  * **export:** Update api zip handler, and cmd integration test ([82cd4cc](https://github.com/qri-io/qri/commit/82cd4cc))
  1563  * **get:** Apply format to get when using a selector ([ed1fd31](https://github.com/qri-io/qri/commit/ed1fd31))
  1564  * **get:** Get returns 404 if dataset is not found ([291296b](https://github.com/qri-io/qri/commit/291296b))
  1565  * **get dataset:** return a datasetRef, not a dataset! ([6e51a31](https://github.com/qri-io/qri/commit/6e51a31))
  1566  * **info:** Remove the info command, list does it now ([ef34a05](https://github.com/qri-io/qri/commit/ef34a05))
  1567  * **list:** Flag --num-versions shows number of versions of each dataset ([2f5a8b1](https://github.com/qri-io/qri/commit/2f5a8b1))
  1568  * **list:** Improve usability of `list` command ([d773363](https://github.com/qri-io/qri/commit/d773363))
  1569  * **list:** Rename lib parameter to ShowNumVersions ([7214f93](https://github.com/qri-io/qri/commit/7214f93))
  1570  
  1571  
  1572  ### Features
  1573  
  1574  * **cmd:** add summary flag to diff command ([f793c0f](https://github.com/qri-io/qri/commit/f793c0f))
  1575  * **diff:** added diffStat string, support for diffing files ([2d16df5](https://github.com/qri-io/qri/commit/2d16df5))
  1576  * **diff:** overhauling diff to use difff ([b825e65](https://github.com/qri-io/qri/commit/b825e65))
  1577  * **fill_struct:** Additional tests, cover some edge-cases ([e1454de](https://github.com/qri-io/qri/commit/e1454de))
  1578  * **fill_struct:** Fix qri key, multiple small fixes ([71d78e7](https://github.com/qri-io/qri/commit/71d78e7))
  1579  * **fill_struct:** Json and yaml deserialization rewrite ([ace2c1e](https://github.com/qri-io/qri/commit/ace2c1e))
  1580  * **fill_struct:** Rename to SetArbitrary ([990ad24](https://github.com/qri-io/qri/commit/990ad24))
  1581  * **fill_struct:** Support bool, float, slices ([314be2a](https://github.com/qri-io/qri/commit/314be2a))
  1582  * **lib.Datasets.Save:** add force flag to skip empty-commit checking ([6fd5b1f](https://github.com/qri-io/qri/commit/6fd5b1f))
  1583  
  1584  
  1585  
  1586  <a name="0.7.0"></a>
  1587  # [0.7.0](https://github.com/qri-io/qri/compare/v0.6.2...v0.7.0) (2019-02-05)
  1588  
  1589  We've bumped this release to 0.7.0 to reflect some major-league refactoring going on deeper in the stack. The main goal of this release has been to drive stability up, and put the Qri codebase on firmer foundation for refinement.
  1590  
  1591  ### Major Stability Improvements
  1592  Much of our refactoring has gone into removing & consolidating code, making it easier reason about. The effect of this are fewer unintended interactions between different subsystems, resulting in a version of qri that behaves much better, especially in the corner cases. All of these improvements are made on both the JSON API, the CLI, _and_ while operating over RPC (we use RPC when `qri connect` is running in another terminal).
  1593   
  1594  Commands like `qri get` and `qri export` in particular work consistently, and can be used to greater effect. For example, running `qri use` on a dataset let's you drop the repeated typing of a dataset name, and play with `get` to explore the dataset faster:
  1595  ```
  1596  $ qri use me/dataset
  1597  $ qri get meta --format yaml
  1598  $ qri get body --format json --limit 20 --offset 3
  1599  ```
  1600  
  1601  It's much to fetch scripts with `get` and write them to a file for local work:
  1602  ```
  1603  $ qri get transform.script > transform.star
  1604  ```
  1605  
  1606  Speaking of transforms, `qri update` on a local dataset is now true alias for `qri save --recall=tf`. Eliminating the alternate codepath for `qri update` has made update work far better for re-running transforms.
  1607  
  1608  Export now has a far friendlier `--format` flag for getting a dataset document into a common data format. This'll give you a JSON interpretation of your dataset:
  1609  ```
  1610  qri export --format=json me/dataset
  1611  ```
  1612  
  1613  We're inching closer to our overall goal of building Qri into a series of well-composed packages with a cohesive user interface. Lots more work to do, partly because there's more that we _can_ do now that our code is better composed. We'd encourage you to play with the CLI if you haven't yet taken it for a spin.
  1614  
  1615  ### XLSX support
  1616  Along with the improved export command, we now have early support for Excel `.xlsx` documents! this now works:
  1617  ```
  1618  qri export --format=xlsx peer/dataset
  1619  ``` 
  1620  
  1621  this now works too (so long as there's a sheet named "sheet1"), and an existing history in another format like JSON, CSV, or CBOR:
  1622  ```
  1623  qri save --body dataset.xlsx --keep-format peer/dataset
  1624  ```
  1625  Lots of work to do here, but early support for excel is an exciting addition.
  1626  
  1627  
  1628  ### Bug Fixes
  1629  
  1630  * **get:** Datasets whose name contains a field should work with get ([97410fb](https://github.com/qri-io/qri/commit/97410fb))
  1631  * **get:** Fix get command using a dotted path ([c130349](https://github.com/qri-io/qri/commit/c130349))
  1632  * **get:** Turn `body` into a selector of the `get` command ([7793845](https://github.com/qri-io/qri/commit/7793845))
  1633  * **local update:** rework local update to be a type of save ([fa9ca11](https://github.com/qri-io/qri/commit/fa9ca11))
  1634  * **save:** Improve error message if new ds has no body or structure ([31332fd](https://github.com/qri-io/qri/commit/31332fd))
  1635  * **save:** Infer more values, such as Schema, when appropriate ([1c95539](https://github.com/qri-io/qri/commit/1c95539))
  1636  
  1637  
  1638  ### Features
  1639  
  1640  * **export:** initial foreign export support ([9382483](https://github.com/qri-io/qri/commit/9382483))
  1641  * **get:** support getting script file fields ([da8ae46](https://github.com/qri-io/qri/commit/da8ae46))
  1642  
  1643  
  1644  
  1645  <a name="0.6.2"></a>
  1646  # [0.6.2](https://github.com/qri-io/qri/compare/v0.6.1...v0.6.2) (2019-01-22)
  1647  
  1648  0.6.2 is mainly about squashing bugs, but there are three fun new features worth noting:
  1649  
  1650  ### :globe_with_meridians: IPFS HTTP API Support
  1651  Given that all Qri nodes currently run IPFS under the hood, it's sad that Qri doesn't expose the full power of IPFS while running. We've fixed that by adding new configuration options to enable the IPFS HTTP API. This lets you use the `ipfs` binary to use IPFS while qri is running. We've added support for toggling IPFS pubsub as well. By default new installations of Qri come with the IPFS api enabled, and pubsub disabled.
  1652  
  1653  To enable both, change your Qri config.yaml `store` to include the new options flags:
  1654  
  1655  ```yaml
  1656  store:
  1657    type: "ipfs"
  1658    options:
  1659      # when api is true, Qri will use the IPFS config to spin up an HTTP API
  1660      # at whatever port your IPFS repo is configured for
  1661      # (the configuration in IPFS is "Addresses.API", defaults to localhost:5001)
  1662      api: true
  1663      # optional, when true running "qri connect" will also enable IPFS pubsub 
  1664      # as if `ipfs daemon --enable-pubsub-experiment` were run
  1665      pubsub: true
  1666  ```
  1667  
  1668  With these settings you can run `qri connect` in one terminal, and then run (nearly) any regular IPFS command in another terminal with `ipfs --api /ip4/127.0.0.1/tcp/5001/ [command]`. Having both IPFS & Qri work at once makes life much easier for anyone who needs access to both functionalities at once.
  1669  
  1670  ### :world_map: Starlark Geo Support
  1671  We're very excited to land initial support for a geospatial module in Starlark. Considering just how much open data is geospatial, we're very excited to play with this :) [Here's an example transform script](https://gist.github.com/b5/7fc378b6ee504e929ab390bca8f038f6) to get started.
  1672  
  1673  ### :1234: Remove now supports any number of revisions
  1674  Previously, it was only possible to reomve _entire dataset histories_, which is, well, not ideal. We've changed the way remove works so you can now choose how many revisions (dataset versions) to delete. `qri remove --revisions 1 me/dataset_name` is basically an undo button, while `qri remove --all me/dataset_name` will delete the entire dataset. This also applies to the API, by supplying a now-required `revisions` query param.
  1675  
  1676  
  1677  
  1678  ### Bug Fixes
  1679  
  1680  * **cmd:** Both body and setup runnable during "qri connect" ([0a9c93a](https://github.com/qri-io/qri/commit/0a9c93a))
  1681  * **cmd.Export:** handle -o flag on export to get target directory ([0064715](https://github.com/qri-io/qri/commit/0064715))
  1682  * **export:** Check for unsupported export flags, recognize --format ([aea27de](https://github.com/qri-io/qri/commit/aea27de))
  1683  * **export:** Export can be used while running `qri connect` ([a5a56d1](https://github.com/qri-io/qri/commit/a5a56d1))
  1684  * **export:** Flag is --zip instead of --zipped, api format form value ([f370632](https://github.com/qri-io/qri/commit/f370632))
  1685  * **export:** Write exported file to pwd where command is run. ([b62f739](https://github.com/qri-io/qri/commit/b62f739))
  1686  * **list:** Listing a non-existent profile should not crash ([e00d516](https://github.com/qri-io/qri/commit/e00d516))
  1687  * **p2p dataset info:** return not found if dataset doesn't populate ([b55af2a](https://github.com/qri-io/qri/commit/b55af2a))
  1688  * **print:** Use int64 in print in order to support Arm6 (Raspberry Pi). ([64fcbc4](https://github.com/qri-io/qri/commit/64fcbc4))
  1689  * **remove:** Flag --all as an alias for --revisions=all. More tests ([7e29002](https://github.com/qri-io/qri/commit/7e29002))
  1690  * **remove:** Remove requires the --revisions to specify what to delete ([02a0b02](https://github.com/qri-io/qri/commit/02a0b02))
  1691  * **Save:** add tests to cmd that test you can save a transform and viz ([#649](https://github.com/qri-io/qri/issues/649)) ([42410a5](https://github.com/qri-io/qri/commit/42410a5))
  1692  
  1693  
  1694  ### Features
  1695  
  1696  * **api:** always include script output in POST /dataset responses ([ee32e44](https://github.com/qri-io/qri/commit/ee32e44))
  1697  * **config.Store:** support store options to enable ipfs api & pubsub ([e76b9f8](https://github.com/qri-io/qri/commit/e76b9f8)), closes [#162](https://github.com/qri-io/qri/issues/162) [#658](https://github.com/qri-io/qri/issues/658)
  1698  
  1699  
  1700  
  1701  <a name="0.6.1"></a>
  1702  # [0.6.1](https://github.com/qri-io/qri/compare/v0.6.0...v0.6.1) (2018-12-12)
  1703  
  1704  For a patch release, 0.6.1 is on the larger side. After cutting the 0.6.0 release, we realized that NAT traversal issues were preventing Qri from working in a consistent, performant way. Basically, peers aren't seeing each other, and despite tools for building & maintaining direct connections with Qri peers, data transfer isn't performing in a way that's comparable with "git+github". To compensate for this, we're focusing on making publishing to the registry consistent & reliable, and using the registry to reduce our reliance on p2p connections. The result is Qri has a fast path that works with the registry for many dataset transfer commands, but still uses p2p whenever possible.
  1705  
  1706  In the coming months we'll continue to iterate these solutions toward each other, making our p2p technology faster & more reliable, while keeping these "fast-paths" for point-to-point dataset transfer.
  1707  
  1708  0.6.1 No breaking changes, but some behaviours are different. The biggie is `qri publish` now takes a few extra steps.
  1709  
  1710  ### :racing_car: Faster, dependable Publish & Add
  1711  Our big focus has been on making dataset transfer to the registry fast & reliable. The end result is `qri publish` and `qri add` now feels a _lot_ more like `git push` and `git fetch`. We're using our shiny new [dag package](https://github.com/qri-io/dag) to do a transfer of raw IPFS blocks directly. Look for us to expand & improve the use of this (open source) secret sauce for a more performant Qri experience.
  1712  
  1713  ### :mag: Search is restored!
  1714  `qri search` is back! It works with the registry! Try running `qri search foo` and `qri add` with one of the results!
  1715  
  1716  ### Bug Fixes
  1717  
  1718  * **actions.ResolveDatasetRef:** temp fix to keep incomplete ref responses from resolve ([b284228](https://github.com/qri-io/qri/commit/b284228))
  1719  * **build:** move gx-dep packages around ([f85b432](https://github.com/qri-io/qri/commit/f85b432))
  1720  * **config migrate:** fix crash in migration ([2c4396e](https://github.com/qri-io/qri/commit/2c4396e))
  1721  * **config migration:** add config migration to update p2p.QriBootstrapAddrs ([bc9bfcd](https://github.com/qri-io/qri/commit/bc9bfcd))
  1722  * **connect output:** suppress RPC error messages, clarify connection message ([934f11c](https://github.com/qri-io/qri/commit/934f11c)), closes [#623](https://github.com/qri-io/qri/issues/623)
  1723  * **format:** Detect format change when saving, either error or rewrite ([137e18b](https://github.com/qri-io/qri/commit/137e18b))
  1724  * **format:** Tests for ConvertBodyFormat, many small cleanups. ([be4a32c](https://github.com/qri-io/qri/commit/be4a32c))
  1725  * **p2p:** bump qriSupportValue from 1 to 100 ([4159818](https://github.com/qri-io/qri/commit/4159818))
  1726  * **publish:**  api publish endpoint and CanonicalizeDatasetRef fix ([75077cf](https://github.com/qri-io/qri/commit/75077cf))
  1727  * **ResolveRef:** fix improper IDs form registry resolves, cleanup search CLI printing ([115350c](https://github.com/qri-io/qri/commit/115350c))
  1728  * **Save:** fix saving dataset with viz stored in cafs ([bc2b00a](https://github.com/qri-io/qri/commit/bc2b00a))
  1729  * **secrets:** move secrets out-of-band from dataset ([a258a23](https://github.com/qri-io/qri/commit/a258a23)), closes [#609](https://github.com/qri-io/qri/issues/609)
  1730  * **transform:** Fix how secrets and config are passed into transform. ([179f31c](https://github.com/qri-io/qri/commit/179f31c))
  1731  * **webapp:** restore webapp by serving compiled app as a directory ([ad5e2be](https://github.com/qri-io/qri/commit/ad5e2be))
  1732  
  1733  
  1734  ### Features
  1735  
  1736  * **api.registry:** create `/registry/list` endpoint that returns a list of datasets avail on the registry ([868bd5d](https://github.com/qri-io/qri/commit/868bd5d))
  1737  * **bsync:** initial block-sync sketched out ([6718e69](https://github.com/qri-io/qri/commit/6718e69))
  1738  * **bsync:** initial Receivers implementation, HTTP support ([2e986f6](https://github.com/qri-io/qri/commit/2e986f6))
  1739  * **bsync:** initial work on bsync ([f3c37c6](https://github.com/qri-io/qri/commit/f3c37c6))
  1740  * **cmd registry pin:** add registry pin commands ([2293275](https://github.com/qri-io/qri/commit/2293275))
  1741  * **manifest:** generate a manifest for a given reference ([e3e52ac](https://github.com/qri-io/qri/commit/e3e52ac))
  1742  * **manifest:** initial DAGInfo, move Completion into manifest ([2c206de](https://github.com/qri-io/qri/commit/2c206de))
  1743  * **online:** Set Online flag for peers when using lib.Info. Cleanups. ([4542056](https://github.com/qri-io/qri/commit/4542056)), closes [#577](https://github.com/qri-io/qri/issues/577)
  1744  * **RegistryList:** get a list of datasets from a registry ([708c554](https://github.com/qri-io/qri/commit/708c554))
  1745  * **RegistryRequests.List:** wrap actions.RegistryList at the lib level ([e18f664](https://github.com/qri-io/qri/commit/e18f664))
  1746  
  1747  
  1748  
  1749  <a name="0.6.0"></a>
  1750  # [0.6.0](https://github.com/qri-io/qri/compare/v0.5.6...v0.6.0) (2018-11-09)
  1751  
  1752  Version 0.6.0 is a **big** 'ol release. Lots of changes that have taken close to a month to land. Test coverage is up, but expect us to have broken a bunch of things. We'll be rapidly iterating over the coming weeks to make sure everything works the way it should.
  1753  
  1754  This release marks turning a corner for the Qri project as a whole. We have a new look for the frontend, and have rounded out an initial feature set we think will take Qri out of the realm of "experimental" and into the world of dependable, usable code. It's taken a great deal of time, effort, and research. I'm _very_ thankful/proud/excited for all who have contributed to this release, and can't wait to start showing off this newest verion. Here's some of the highlights, with a full changelog below.
  1755  
  1756  ### :heart: We've adopted the RFC process
  1757  I'm delighted to say Qri's feature development is now driven by a request-for-comments process. You can read about new features we're considering and implementing, as well as make suggestions over at our RFC repo. From this release forward, we'll note the biggest RFCs that have landed in release notes.
  1758  
  1759  
  1760  ### Overhauled, more capable starlark transform functions, renamed everything from "skylark" to "starlark" [(RFC0016)](https://github.com/qri-io/rfcs/blob/master/text/0016-revise_transform_processing.md)
  1761  We've overhauled the way transform functions are called to provide greater flexibility between function calls to allow sidecar state to travel from special functions, and unified all transforms around the `transform` special function. here's an example:
  1762  
  1763  ```python
  1764  load("http.star", "http")
  1765  def download(ctx):
  1766    res = http.get("https://api.github.com/")
  1767    return res.json()
  1768  
  1769  def transform(ds, ctx):
  1770    ds.set_body(ctx.download)
  1771  ```
  1772  
  1773  The passed in dataset is now properly set to the most recent snapshot thanks to our improved transform logic. More on that below.
  1774  
  1775  ### `.zip` export & import [(RFC0014)](https://github.com/qri-io/rfcs/blob/master/text/0014-export.md)
  1776  The following now works:
  1777  ```
  1778  $ qri export me/my_dataset
  1779  exported my_dataset.zip
  1780  
  1781  # on some other qri repo:
  1782  $ qri save --file=my_dataset.zip
  1783  ```
  1784  This makes it possible to send around Qri datasets without using the p2p network. It even works when the zip is posted to a url:
  1785  ```
  1786  $ qri save --file=https://dropbox.com/.../my_dataset.zip
  1787  ```
  1788  
  1789  We think this is a big win for portability. We'll be working on exporting to different file formats in the coming weeks.
  1790  
  1791  
  1792  ### Publish & Update [(RFC0018)](https://github.com/qri-io/rfcs/blob/master/text/0018-publish-update.md)
  1793  Qri now gives you control over which datasets of your will be listed for others to see using `qri publish`. This does mean you need to publish a datset before others will see it listed. **This does not mean that data added to Qri is private**. It's better to think of data you've added to qri that isn't published as 'unlisted'. If you gave someone the hash of your dataset, they could add it with `qri add`, but users who list your datasets over p2p won't see your unlisted work. If you want private data, for now Qri isn't the right tool, but now you have more control over what users see when they visit your profile.
  1794  
  1795  We now also have our first real mechanism for automated synchronization: update. Update works on both your own datasets and other people's. Running update on your own dataset will re-run the most recent transform and generate a new dataset version if Qri detects a change. Running update on a peer's dataset will check to see if they're online, and if they are, update will fast-forward your copy of their dataset to the latest version.
  1796  
  1797  ### New and Save have merged [(RFC0017)](https://github.com/qri-io/rfcs/blob/master/text/0017-define_dataset_creation.md)
  1798  The `new` and `save` commands (and API endpoints) have merged into just `save`. New wasn't doing too much for us, so we're hoping to get down to one keyword for all modifications that aren't re-running transform scripts.
  1799  
  1800  ### Deterministic Transforms & Overhauled Dataset Creation [(RFC0020)](https://github.com/qri-io/rfcs/blob/master/text/0020-distingush_manual_vs_scripted_transforms.md)
  1801  We've completely overhauled the process of saving a datset, clarifying the mental model by distinguishing between _manual_ and _scripted_ transformations. The process of creating a dataset is now easier to understand and predict. We'll be working in the coming weeks to properly document how this works, but the first form of documentation we've landed are error messages that help clarify when an issue arises.
  1802  
  1803  ### Bug Fixes
  1804  
  1805  * **actions.SaveDataset:** ensure both manual & scripted transforms are provided previous dataset ([902183d](https://github.com/qri-io/qri/commit/902183d))
  1806  * **actions.SaveDataset:** load transform from store if cafs scriptPath provided ([274fa76](https://github.com/qri-io/qri/commit/274fa76))
  1807  * **actions.Update:** properly set PrevPath before saving update ([eafe8b5](https://github.com/qri-io/qri/commit/eafe8b5))
  1808  * **bootstrap peers:** fix network not ever contacting bootstrap peers ([f9074b0](https://github.com/qri-io/qri/commit/f9074b0))
  1809  * **fs Profile Store:** fix lock pass-by-value error ([a22515a](https://github.com/qri-io/qri/commit/a22515a))
  1810  * **fs refstore:** don't store DatasetPod in refstore ([6ab5849](https://github.com/qri-io/qri/commit/6ab5849))
  1811  * **lib.AbsPath:** allow directories named 'http' in filepaths ([684d3be](https://github.com/qri-io/qri/commit/684d3be))
  1812  * **qri:** Fix usage of dataset and startf ([b754c06](https://github.com/qri-io/qri/commit/b754c06))
  1813  * **racy p2p tests:** don't pass locks by value in MemStore ([5e410a3](https://github.com/qri-io/qri/commit/5e410a3))
  1814  * **save:** ensure transforms are run when importing a zip ([a35523c](https://github.com/qri-io/qri/commit/a35523c))
  1815  
  1816  
  1817  ### Features
  1818  
  1819  * **actions.UpdateDataset:** support for local dataset updates ([f402956](https://github.com/qri-io/qri/commit/f402956))
  1820  * **api /publish:** add publish API endpoint ([502188e](https://github.com/qri-io/qri/commit/502188e))
  1821  * **api /publish:** add publish API endpoint ([3d1b4bf](https://github.com/qri-io/qri/commit/3d1b4bf))
  1822  * **api published:** GET /publish/ now lists published datasets ([6c8f0b2](https://github.com/qri-io/qri/commit/6c8f0b2))
  1823  * **api published:** GET /publish/ now lists published datasets ([9e60af6](https://github.com/qri-io/qri/commit/9e60af6))
  1824  * **api update:** add update API endpoint ([cb66b36](https://github.com/qri-io/qri/commit/cb66b36))
  1825  * **api.Update:** accept dry_run parameter ([642e7fa](https://github.com/qri-io/qri/commit/642e7fa))
  1826  * **base:** defining base package ([1a7cd42](https://github.com/qri-io/qri/commit/1a7cd42))
  1827  * **base.LogDiff:** diff logs against a repo's dataset history ([bd7340a](https://github.com/qri-io/qri/commit/bd7340a))
  1828  * **cmd publish:** add publish command, publish-on-save flag ([1bfcd92](https://github.com/qri-io/qri/commit/1bfcd92))
  1829  * **cmd publish:** add publish command, publish-on-save flag ([327f697](https://github.com/qri-io/qri/commit/327f697))
  1830  * **cmd.Save, cmd.Update:** add recall flags to save and update ([083331d](https://github.com/qri-io/qri/commit/083331d))
  1831  * **cmd.Update:** add update command ([03c2630](https://github.com/qri-io/qri/commit/03c2630))
  1832  * **fsrepo:** add support for storing 'Published' field in fsrepo ([837edeb](https://github.com/qri-io/qri/commit/837edeb))
  1833  * **mutal exclusion tf:** error if two transform types affect the same component ([fd439cb](https://github.com/qri-io/qri/commit/fd439cb))
  1834  * **p2p update:** initial p2p update ([76e886a](https://github.com/qri-io/qri/commit/76e886a))
  1835  * **p2p.test:** add `TestableNode` struct that satisfies the `TestablePeerNode` interface ([2c53a49](https://github.com/qri-io/qri/commit/2c53a49))
  1836  * **published:** datasets now have a publish flag ([84019b7](https://github.com/qri-io/qri/commit/84019b7))
  1837  * **published:** datasets now have a publish flag ([11db984](https://github.com/qri-io/qri/commit/11db984))
  1838  * **rev:** add rev package, add LoadRevs to base ([00ca81c](https://github.com/qri-io/qri/commit/00ca81c))
  1839  * **save:** add support for saving from file archives ([00a30d3](https://github.com/qri-io/qri/commit/00a30d3))
  1840  * **save:** Don't leak file paths across API. ([57a1c36](https://github.com/qri-io/qri/commit/57a1c36))
  1841  * **save:** Merge command `new` into `save`. ([33c4da6](https://github.com/qri-io/qri/commit/33c4da6))
  1842  * **save:** Remove new api and cmd. Document plan for actions. ([4919503](https://github.com/qri-io/qri/commit/4919503))
  1843  * **starlark:** renamed, reworked starlark syntax & transforms ([4e9c6fd](https://github.com/qri-io/qri/commit/4e9c6fd))
  1844  * **zip:** Import a zip file using save on the command-line ([bbb989a](https://github.com/qri-io/qri/commit/bbb989a))
  1845  
  1846  
  1847  
  1848  <a name="0.5.6"></a>
  1849  # [0.5.6](https://github.com/qri-io/qri/compare/v0.5.5...v0.5.6) (2018-10-10)
  1850  
  1851  ### :two_women_holding_hands: Peer Sharing Fixes & Slightly better export
  1852  
  1853  This patch release is focused on making inroads on some long-standing issues with peer discovery. We've added tests & a few fixes that should help peers get connected and stay connected. This is an area of active work that we'll be adding more improvements to in the future.
  1854  
  1855  We've also standardized our export format with a newly-approved [export rfc](https://github.com/qri-io/rfcs/blob/master/text/0014-export.md), which fixes a few issues with the way Qri exports .zip archives. exports should now be complete archives that we'll start using for import in a forthcoming release.
  1856  
  1857  ### Bug Fixes
  1858  
  1859  * **export:** Blank yaml file should have correct fields ([15484c0](https://github.com/qri-io/qri/commit/15484c0))
  1860  * **new:** Take absolute path to body file before loading it in `new`. ([b9afcd0](https://github.com/qri-io/qri/commit/b9afcd0))
  1861  * **p2p:** fix concurrent writes to repo Profile store ([3cf6f5c](https://github.com/qri-io/qri/commit/3cf6f5c))
  1862  * **p2p.QriConnectePeers:** properly tag QriPeers on both ends of the ConnManager ([14d473f](https://github.com/qri-io/qri/commit/14d473f))
  1863  * **peer sharing:** fix peers not sharing info with each other ([8219bab](https://github.com/qri-io/qri/commit/8219bab)), closes [#510](https://github.com/qri-io/qri/issues/510)
  1864  
  1865  
  1866  ### Features
  1867  
  1868  * **api:** Unpack endpoint gets a zip and sends back its contents ([185c01a](https://github.com/qri-io/qri/commit/185c01a))
  1869  * **api:** Wrap unpack response in api envelope ([aa5df03](https://github.com/qri-io/qri/commit/aa5df03))
  1870  * **export:** Always export by zip for now, until full RFC is implemented. ([9bc77b0](https://github.com/qri-io/qri/commit/9bc77b0))
  1871  * **export:** Test case for unpack endpoint. ([54aa3ee](https://github.com/qri-io/qri/commit/54aa3ee))
  1872  
  1873  
  1874  
  1875  <a name="0.5.5"></a>
  1876  # [0.5.5](https://github.com/qri-io/qri/compare/v0.5.4...v0.5.5) (2018-10-05)
  1877  
  1878  Version 0.5.5 is a patch release with some small features and a few bugfixes. It's mainly here because @b5 wants
  1879  to play with .zip files & regexes in transform scripts.
  1880  
  1881  ### :package: Skylark `re` and `zip` packages
  1882  We've added two new small, bare-bones packages to skylark to handle common-yet-vital use cases:
  1883  `re` brings basic support regular expressions, and `zip` brings read-only capacity to open zip archives.
  1884  Both of these are rather utility-oriented, but _very_ importnat when opening & cleaning data.
  1885  
  1886  ### :twisted_rightwards_arrows: Upcoming switch from "skylark" to "starlark"
  1887  Speaking of skylark, google has landed on a rename for their project, and it'll hence-fourth be named "starlark".
  1888  As such we'll be making the switch to this terminology in an upcoming release. Our package names will be changing
  1889  from `.sky` to some new file extension, which will be a breaking change for all tranforms that import `.sky` packages.
  1890  We'll keep you posted.
  1891  
  1892  ### Features
  1893  
  1894  * **RequestDatasetLog:** add back functionality for getting a peer's dataset log over p2p ([813bf0d](https://github.com/qri-io/qri/commit/813bf0d))
  1895  * **RequestDatasetLog:** handle non-local datasets, rename lots of vars ([248e02e](https://github.com/qri-io/qri/commit/248e02e))
  1896  
  1897  
  1898  
  1899  <a name="0.5.4"></a>
  1900  # [0.5.4](https://github.com/qri-io/qri/compare/v0.5.3...v0.5.4) (2018-10-01)
  1901  
  1902  ### :wrench: minor patch release
  1903  0.5.4 is a _very_ minor release that cleans up a few issues with our API to make the frontend editor work :smile:
  1904  
  1905  ### Features
  1906  
  1907  * **ConvertBodyFile:** extracted actions.ConvertBodyFile from LookupBody func ([d8a7f77](https://github.com/qri-io/qri/commit/d8a7f77))
  1908  
  1909  
  1910  
  1911  <a name="0.5.3"></a>
  1912  # [0.5.3](https://github.com/qri-io/qri/compare/v0.5.2...v0.5.3) (2018-09-24)
  1913  
  1914  ### :running_woman: Dry Run
  1915  0.5.3 is a minor version bump that introduces a new `--dry-run` flag on `qri new` and `qri save` that'll run new/save _without committing changes_. We've added the same thing on the api using a query param: `dry_run=true`. Dry runs are fun! use 'em to experiment with different input without having to constantly delete stuff.
  1916  
  1917  ### Bug Fixes
  1918  
  1919  * **dsgraph:** fix breaking change from dataset pkg ([0954513](https://github.com/qri-io/qri/commit/0954513))
  1920  
  1921  
  1922  ### Features
  1923  
  1924  * **api dry run:** add dry run & moar file options to /new ([52cfa19](https://github.com/qri-io/qri/commit/52cfa19))
  1925  * **dry_run flag:** added dry run flag to creating & updating datasets ([ef2d5ca](https://github.com/qri-io/qri/commit/ef2d5ca))
  1926  * **p2p local streams:** add local streams to QriNode for local stdio interaction ([53ff3fd](https://github.com/qri-io/qri/commit/53ff3fd))
  1927  
  1928  
  1929  
  1930  <a name="0.5.2"></a>
  1931  # [0.5.2](https://github.com/qri-io/qri/compare/v0.5.1...v0.5.2) (2018-09-14)
  1932  
  1933  
  1934  Most of 0.5.2 is under-the-hood changes that make qri work better. We've put a _lot_ of time into our test suite & refactoring our existing code, which will set the stage for dev work to move a little faster in the coming weeks :smile:
  1935  
  1936  ### :truck: IPFS repo migration
  1937  We've updated our IPFS dependencies from go-ipfs 0.4.15 to 0.4.17. Between those verions the structure of IPFS repositories changed, and as such need to be migrated. If this is your first time installing Qri, you won't have an issue, but if you're coming from Qri 0.5.1 or earlier you'll see a message after upgrading that'll explain you'll need to install go-ipfs to update your repo. We know this is, well, not fun, but it's the safest way to ensure the integrity of your underlying IPFS repo.
  1938  
  1939  ### Bug Fixes
  1940  
  1941  * **api.Body:** fix bug that returns error when getting a peers body ([d87ccac](https://github.com/qri-io/qri/commit/d87ccac))
  1942  * **api/datasets:** fix error based on [@dustmop](https://github.com/dustmop)'s comment https://github.com/qri-io/qri/pull/533#discussion_r214204240 ([a509627](https://github.com/qri-io/qri/commit/a509627)), closes [/github.com/qri-io/qri/pull/533#discussion_r214204240](https://github.com//github.com/qri-io/qri/pull/533/issues/discussion_r214204240)
  1943  * **cmd:** Don't ignore command-line arguments for `get` command. ([d6b49d3](https://github.com/qri-io/qri/commit/d6b49d3))
  1944  * **cmd:** Execute commands using RunE instead of Run ([5457ccb](https://github.com/qri-io/qri/commit/5457ccb))
  1945  * **cmd:** Operating system-specific calls in their own sourcefile ([4074df6](https://github.com/qri-io/qri/commit/4074df6))
  1946  * **cmd:** Set number of open files limit at startup. ([761259f](https://github.com/qri-io/qri/commit/761259f))
  1947  * **cmd:** Split old `add` command into `new` and `add`. ([0abc837](https://github.com/qri-io/qri/commit/0abc837))
  1948  * **cmd/cmd.go:** have printErr check errs for lib.Error and print correct message ([75a7e85](https://github.com/qri-io/qri/commit/75a7e85))
  1949  * **connect --setup:** add Anon flag to make setup work w/o user input ([dcb92ae](https://github.com/qri-io/qri/commit/dcb92ae))
  1950  * **CreateDataset:** remove transform creating default viz ([4536dc6](https://github.com/qri-io/qri/commit/4536dc6))
  1951  * **get:** Additional documentation about lib/Get method. ([6108ddd](https://github.com/qri-io/qri/commit/6108ddd))
  1952  * **get:** Can get another user's repo, as long as node is connected. ([3251d58](https://github.com/qri-io/qri/commit/3251d58))
  1953  * **get:** Get completely reworked to function better ([7c0cc8d](https://github.com/qri-io/qri/commit/7c0cc8d)), closes [#519](https://github.com/qri-io/qri/issues/519) [#509](https://github.com/qri-io/qri/issues/509) [#479](https://github.com/qri-io/qri/issues/479) [#397](https://github.com/qri-io/qri/issues/397)
  1954  * **LookupBody:** LookupBody should respond with *body* path ([7c1f38f](https://github.com/qri-io/qri/commit/7c1f38f))
  1955  * **p2p:** Avoid generating p2p keys in DefaultP2P, for faster tests ([97a1b6e](https://github.com/qri-io/qri/commit/97a1b6e))
  1956  * **p2p:** NewQriNode parameter cleanup, and factory for TestableQriNode. ([5652f4d](https://github.com/qri-io/qri/commit/5652f4d))
  1957  * **profile:** Tests for ProfilePod.Copy and ProfilePod.SetField ([a1a464c](https://github.com/qri-io/qri/commit/a1a464c))
  1958  * **profile:** Using config set profile.something calls SaveProfile. ([7c3e9f6](https://github.com/qri-io/qri/commit/7c3e9f6))
  1959  
  1960  
  1961  ### Features
  1962  
  1963  * **api/open_api:** add both open api 2.0 and open api 3.0 specs ([4faf8ac](https://github.com/qri-io/qri/commit/4faf8ac))
  1964  * **cmd loading:** add loading indicator for long-running commands ([d988843](https://github.com/qri-io/qri/commit/d988843))
  1965  * **docs:** add script to generate documentation in markdown ([6ca60f4](https://github.com/qri-io/qri/commit/6ca60f4))
  1966  * **p2p.ResolveDatasetRef:** resolve dataset names with p2p network ([4fd24c5](https://github.com/qri-io/qri/commit/4fd24c5))
  1967  * **profile:** Detect peername renames when listing datasets. ([f1a19ba](https://github.com/qri-io/qri/commit/f1a19ba))
  1968  * **ResolveDatasetRef:** new action for resolving dataset references ([00aefc2](https://github.com/qri-io/qri/commit/00aefc2))
  1969  * **save:** re-run transform on qri save with no args ([0e906ae](https://github.com/qri-io/qri/commit/0e906ae))
  1970  
  1971  
  1972  
  1973  <a name="0.5.1"></a>
  1974  # [0.5.1](https://github.com/qri-io/qri/compare/v0.5.1-rc1...v0.5.1) (2018-07-19)
  1975  
  1976  Ok ok so now we have a formal 0.5.1 release. Maybe this should be 0.6.0 given the magnitude of visualizations, but meh, we're calling it a patch.
  1977  
  1978  #### :bar_chart: Delight in Data with HTML-template visualizations
  1979  For a little while we've been experimenting with the `qri render` as a way to template data into html. The more we've played with it, the more we've come to rely on it. So much so, that we think templates should become a native component of datasets. For this we've added a new section to the dataset definition called `viz`, which is where you specify a custom template. a `dataset.yaml` file that specifies viz will look something like this (These details are always available with the handy `qri export --blank`):
  1980  
  1981  ```
  1982  # use viz to provide custom a HTML template of your dataset
  1983  # the currently accepted syntax is 'html'
  1984  # scriptpath is the path to your template, relative to this file:
  1985  # viz:
  1986  #   syntax: html
  1987  #   scriptpath: template.html
  1988  ```
  1989  
  1990  A template can only be a single file. So your template can't reference a local "style.css" file for now. _But!_ You're more than welcome to write HTML that grabs external resources, like getting jQuery or D3, or your favourite charting library off a CDN.
  1991  
  1992  When you supply a template, the Dataset itself is handed back to you, and we use golang's `html/template` package to render. Here's a simplified example:
  1993  
  1994  ```html
  1995  <html>
  1996    <body>
  1997      <h1>{{ .Meta.Title }}</h1>
  1998      <p>{{ .Meta.Description }}</p>
  1999      <ul>
  2000      {{ range .Body }}
  2001        <li>{{ . }}</li>
  2002      {{ end }}
  2003      </ul>
  2004    </body>
  2005  </html>
  2006  ```
  2007  
  2008  This would print the Title & Description from your dataset's metadata. If your dataset was a list of strings, each entry would be printed out as a list item.
  2009  
  2010  #### Moar Better Frontend
  2011  We're so into viz, we've completely overhauled the frontend to put custom templates front-and-center for datasets. Be sure to take the new frontend for a spin by visiting `http://localhost:2505` while `qri connect` is running.
  2012  
  2013  We've chosen to invest time in viz because we think it brings an important moment of delight to datasets. Without it, all of this _data_ stuff just feels like work. There's something truly magical about seeing your data rendered in a custom page that makes all the munging worthwhile.
  2014  
  2015  
  2016  ### Bug Fixes
  2017  
  2018  * **get:** fix get command not accepting ds refs ([fc2a2b2](https://github.com/qri-io/qri/commit/fc2a2b2)), closes [#492](https://github.com/qri-io/qri/issues/492)
  2019  * **peers:** If user is not connected, show error instead of segfaulting. ([80b1e3e](https://github.com/qri-io/qri/commit/80b1e3e))
  2020  * **rpc:** Register types with gob to avoid "reading body EOF" errors ([011f4bd](https://github.com/qri-io/qri/commit/011f4bd))
  2021  
  2022  
  2023  
  2024  <a name="0.5.1-rc1"></a>
  2025  # [0.5.1-rc1](https://github.com/qri-io/qri/compare/v0.5.0...v0.5.1-rc1) (2018-07-14)
  2026  
  2027  0.5.1 is a release candidate to get a few important details out the door to demo at the wonderful _our networks_ conference in Toronto. we antipate further changes before cutting a proper 0.5.1 release, which we'll properly document. More soon!
  2028  
  2029  ### Bug Fixes
  2030  
  2031  * **add:** Work-around for RPC error that breaks `qri add`. ([d9f7805](https://github.com/qri-io/qri/commit/d9f7805))
  2032  * **cmd:** Assume "me" peername for save and remove as well. ([1ef627c](https://github.com/qri-io/qri/commit/1ef627c))
  2033  * **cmd:** Wrap how DatasetRefs are parsed for better cmd behavior. ([62bf188](https://github.com/qri-io/qri/commit/62bf188))
  2034  * **cmd/validate:** fix bug that did not give proper error message when command inputs were incorrect ([07b2d13](https://github.com/qri-io/qri/commit/07b2d13))
  2035  * **render:** fix render template render priority ([dffdbb4](https://github.com/qri-io/qri/commit/dffdbb4))
  2036  * **render:** restore render tests, small refactoring ([7735669](https://github.com/qri-io/qri/commit/7735669))
  2037  
  2038  
  2039  ### Features
  2040  
  2041  * **`/add`:** can now use dataset.yaml or .json file to add commit/meta/structure/etc info on add ([3cc1917](https://github.com/qri-io/qri/commit/3cc1917))
  2042  * **api.Registry:** add groundwork for `/registry/` endpoint ([ec10ddd](https://github.com/qri-io/qri/commit/ec10ddd))
  2043  * **api/registry, lib/registry, repo/registry:** finish publish and unpublish endpoints ([841bfb8](https://github.com/qri-io/qri/commit/841bfb8))
  2044  * **api/search:** add `/search` endpoint back to api ([25635f1](https://github.com/qri-io/qri/commit/25635f1))
  2045  * **api/server:** add RegistryHandler to server ([b675fdd](https://github.com/qri-io/qri/commit/b675fdd))
  2046  * **api/server:** version added to `/status` response ([739671e](https://github.com/qri-io/qri/commit/739671e))
  2047  * **cmd Validate:** `Validate` func for `validate` cmd ([b9e675b](https://github.com/qri-io/qri/commit/b9e675b))
  2048  * **cmd/search:** Validate function to validate user input ([0593058](https://github.com/qri-io/qri/commit/0593058))
  2049  * **lib.Error:** new type Error that satisfies the error interface ([207e314](https://github.com/qri-io/qri/commit/207e314))
  2050  * **pin,unpin:** add registry actions for pinning and unpinning ([c67df8c](https://github.com/qri-io/qri/commit/c67df8c))
  2051  * **TestFactory:** new struct TestFactory that can be used as factory when building tests on individual commands ([79446cd](https://github.com/qri-io/qri/commit/79446cd))
  2052  * **useOptions.validate:** add `Validate` function to use command ([d831a51](https://github.com/qri-io/qri/commit/d831a51))
  2053  * **viz:** add viz api endpoint, viz refactor ([b5a658e](https://github.com/qri-io/qri/commit/b5a658e))
  2054  
  2055  
  2056  
  2057  <a name="0.5.0"></a>
  2058  # [0.5.0](https://github.com/qri-io/qri/compare/v0.4.0...v0.5.0) (2018-06-18)
  2059  
  2060  Who needs patch releases!? In version 0.5.0 we're introducing an initial search implementation, a few new commands, rounding out a bunch of features that warrant a minor version bump with some breaking changes. Because of these breaking changes, datasets created with v0.4.0 or earler will need to be re-created to work properly with this version.
  2061  
  2062  #### :mag: Registry Search Alpha
  2063  We're still hard at work on getting registries right (more on that in the coming weeks), but for now we've shipped an initial command "qri search", that'll let you search registries for datasets. The way we see search working in the future is leveraging registries to build indexes of published datasets so you can easily search for datasets that have been published. We have a lot of work to do around making sure those datasets are available for download, but feel free to play with the command to get a feel for where we're headed with search.
  2064  
  2065  #### use & get commands
  2066  working with the command line, it can get really irritating to constantly re-type the name of a dataset. To help with this, we've added a new command: `qri use`, which takes it's inspiration from database "use" commands that set the current database. `qri use` takes any number of dataset references as arguments, and once a user has set a selection with qri use, they become the default dataset names when no selection is made.
  2067  
  2068  Around qri HQ we've all come to love the ease of working with the `qri config` command. `qri config get` shows either the whole configuration, or you can provide a dot.separated.path to scope down the section of config to show. `qri get` takes this idea an applies it to datasets. `qri get meta.title me/dataset_name` will get the title from metadata, and like the config command, it's output can be switched from YAML (default) to JSON. `qri get` also accepts multiple datasets, which will be combined into 
  2069  
  2070  #### new skylark html module
  2071  We're still working on a proper html module for skylark transforms with an API that pythonists will be familiar with, but in the meantime we've added in a basic jquery-like selector syntax for working with HTML documents.
  2072  
  2073  #### "Data" is now "Body"
  2074  This is a breaking change we've been hoping to get in sooner-rather-than-later that renames the `Data` field of a dataset to `Body`. From here on in we'll refer to the _body_ of a dataset as it's principle content. We think this language helps show how datasets are like webpages, and cutw down on use of an ambiguous term like "data".
  2075  
  2076  #### Thinking about qri as an importable library
  2077  Finally, in what is more of a symbolic change than anything else, we've renamed the `core` package to `lib` to get us to start thinking about qri as an importable library. Next week we'll publish a new project aimed at writing tutorials & docs with an associated test suite built around datasets that uses qri as a library. We hope to use this project to mature the `lib` package for this use case.
  2078  
  2079  
  2080  ### Bug Fixes
  2081  
  2082  * **cmd:** set core.ConfigPath on init ([9e841b8](https://github.com/qri-io/qri/commit/9e841b8))
  2083  * **cmd.RPC:** warn when RPC connected ([00ff64f](https://github.com/qri-io/qri/commit/00ff64f))
  2084  * **cmd/list:** fix `network` flag error ([e15483b](https://github.com/qri-io/qri/commit/e15483b))
  2085  * **config:** set map values with config set command ([edd9e44](https://github.com/qri-io/qri/commit/edd9e44)), closes [#450](https://github.com/qri-io/qri/issues/450)
  2086  * **CreateDataset:** user-specified data should override transforms ([7edff80](https://github.com/qri-io/qri/commit/7edff80))
  2087  * **CreateDataset:** user-specified data should override transforms ([dea1ac4](https://github.com/qri-io/qri/commit/dea1ac4)), closes [#456](https://github.com/qri-io/qri/issues/456)
  2088  * **list peer datasets:** fix to make listing peer datasets work ([f1df720](https://github.com/qri-io/qri/commit/f1df720))
  2089  * **MemRepo:** remove privatekey field, properly assign regclient ([594a86c](https://github.com/qri-io/qri/commit/594a86c))
  2090  * **save:** qri save without CLI dataset arg ([780d734](https://github.com/qri-io/qri/commit/780d734))
  2091  
  2092  
  2093  ### Code Refactoring
  2094  
  2095  * **dataset.Body:** rename dataset.Data to Body ([d764749](https://github.com/qri-io/qri/commit/d764749)), closes [#422](https://github.com/qri-io/qri/issues/422)
  2096  * **export:** remove excessive flags from qri export ([aeb5ee4](https://github.com/qri-io/qri/commit/aeb5ee4))
  2097  
  2098  
  2099  ### Features
  2100  
  2101  * **default to use:** added use-defaults to commands ([dee523e](https://github.com/qri-io/qri/commit/dee523e))
  2102  * **export:** export transform.sky when present ([5939668](https://github.com/qri-io/qri/commit/5939668))
  2103  * **Reference Selection:** support reference selection ([3cae7bd](https://github.com/qri-io/qri/commit/3cae7bd))
  2104  * **Search:** added implementations for core search and commandline search ([698a53b](https://github.com/qri-io/qri/commit/698a53b))
  2105  * **use flags:** added list & clear flags to qri use ([3b61f60](https://github.com/qri-io/qri/commit/3b61f60))
  2106  * **use, get:** added use and get commands ([6628354](https://github.com/qri-io/qri/commit/6628354))
  2107  * **yaml body:** support yaml body with json conversion ([49568e0](https://github.com/qri-io/qri/commit/49568e0))
  2108  
  2109  
  2110  ### BREAKING CHANGES
  2111  
  2112  * **dataset.Body:** this change will break hashes. `dataPath` is now `bodyPath`.
  2113  * **export:** option to export specific dataset components has been removed
  2114  
  2115  
  2116  
  2117  <a name="0.4.0"></a>
  2118  # [0.4.0](https://github.com/qri-io/qri/compare/v0.3.2...v0.4.0) (2018-06-06)
  2119  
  2120  _We're going to start writing proper release notes now, so, uh, here are those notes:_
  2121  
  2122  This release brings a big new feature in the form of our first transformation implementation, and a bunch of refinements that make the experience of working with qri a little easier. 
  2123  
  2124  #### Introducing Skylark Transformations
  2125  For months qri has had a planned feature set for embedding the concept of "transformations" directly into datasets. Basically transforms are scripts that auto-generate datasets. We've defined a "transformation" to be a repeatable process that takes zero or more datasets and data sources, and outputs exactly one dataset. By embedding transformations directly into datasets, users can repeat them with a single command, keeping the code that updates a dataset, and it's resulting data in the same place. This opens up a whole new set of uses for qri datasets, making them auditable, repeatable, configurable, and generally _functional_. Using transformations, qri can check to see if your dataset is out of date, and update it for you.
  2126  
  2127  While we've had the _plan_ for transformations for some time now, it's taken us a long time to figure out how to write a first implementation. Because transformations are executable code, security & behavioural expectations are a big concern. We also want to set ourselves up for success by choosing an implementation that will feel familiar to those who do a lot of code-based data munging, while also leaving the door open to things we'd like to do in the future like parallelized execution.
  2128  
  2129  So after a lot of research and a false-start or five, we've decided on a scripting language called _skylark_ as our base implementation, which has grown out of the _bazel_ project at google. This choice might seem strange at first (bazel is a build tool and has nothing to do with data), but skylark has a number of advantages:
  2130  * **python-like syntax** - _many_ people working in data science these days write python, we like that.
  2131  * **deterministic subset of python** - unlike python, skylark removes properties that reduce introspection into code behaviour. things like `while` loops and recursive functions are omitted, making it possible for qri to infer how a given transformation will behave.
  2132  * **parallel execution** - thanks to this deterministic requirement (and lack of global interpreter lock) skylark functions can be executed in parallel. Combined with peer-2-peer networking, we're hoping to advance tranformations toward peer-driven distribed computing. More on that in the coming months.
  2133  
  2134  A tutorial on how to write skylark transformations is forthcoming, we'll post examples to our documentation site when it's ready: https://qri.io/docs
  2135  
  2136  #### dataset.yaml, and more :heart: for the CLI
  2137  For a while now we've been thinking about datasets as being a lot like web pages. Web pages have `head`,`meta` and `body` elements. Datasets have `meta`, `structure`, `commit`, and `data`. To us this metaphor helps reason about the elements of a dataset, why they exist, and their function. And just like how webpages are defined in `.html` files, we've updated the CLI to work with `.yaml` files that define dataests. `qri export --blank` will now write a blank dataset file with comments that link to documentation on each section of a dataset. You can edit that file, save it, and run `qri add --dataset=dataset.yaml me/my_dataset` to add the dataset to qri. Ditto for `qri update`.
  2138  
  2139  We'd like to encourage users to think in terms of these `dataset.yaml` files, building up a mental model of each element of a dataset in much the same way we think about HTML page elements. We chose `yaml` over JSON specifically because we can include comments in these files, making it easier to pass them around with tools outside of qri, and we're hoping this'll make it easier to think about datasets moving forward. In futures release we plan to rename the "data" element to "body" to bring this metaphor even closer.
  2140  
  2141  Along with `dataset.yaml`, we've also done a bunch of refactoring & bug fixes to make the CLI generally work better, and look forward to improving on this trend in near-term patch releases. One of the biggest things we'd like to improve upon is providing more meaningful error messages.
  2142  
  2143  
  2144  ### Bug Fixes
  2145  
  2146  * **cmd.list:** `qri list` now displays datasets size in KBs, MBs, etc ([c4805ca](https://github.com/qri-io/qri/commit/c4805ca))
  2147  * **cmd/add:** title and message flags work and override the dataset.Commit fields ([0ef9b80](https://github.com/qri-io/qri/commit/0ef9b80))
  2148  * **ipfs:** Display better error if IPFS is holding a lock ([dbc1604](https://github.com/qri-io/qri/commit/dbc1604))
  2149  * **list:** Show info for datasets even if they don't have meta ([a853e71](https://github.com/qri-io/qri/commit/a853e71))
  2150  
  2151  
  2152  ### Code Refactoring
  2153  
  2154  * **core.Add, core.Save:** refactor input params, folding into a DatasetPod ([e63694f](https://github.com/qri-io/qri/commit/e63694f))
  2155  
  2156  
  2157  ### Features
  2158  
  2159  * **add:** accept --dataset yaml/json file arg to add ([6e04481](https://github.com/qri-io/qri/commit/6e04481))
  2160  * **backtrace:** Show error's stack if QRI_BACKTRACE is defined ([88160e2](https://github.com/qri-io/qri/commit/88160e2))
  2161  * **cmd.Export:** added --blank flag to export dataset template ([27d13a0](https://github.com/qri-io/qri/commit/27d13a0)), closes [#409](https://github.com/qri-io/qri/issues/409)
  2162  * **cmd/export:** specify data format using --data-format flag ([8549d59](https://github.com/qri-io/qri/commit/8549d59))
  2163  * **CreateDataset:** write author ProfileID when creating a dataset ([93d4ef1](https://github.com/qri-io/qri/commit/93d4ef1))
  2164  * **export:** can now choose dataset/structure/meta format on export ([2863ded](https://github.com/qri-io/qri/commit/2863ded))
  2165  * **registry cmd:** add commands for working with registries ([85d6892](https://github.com/qri-io/qri/commit/85d6892))
  2166  * **skylark:** Pass previous dataset body to skylark for updates ([64e5b64](https://github.com/qri-io/qri/commit/64e5b64))
  2167  * **transform:** execute transformations with skylark language ([f684229](https://github.com/qri-io/qri/commit/f684229))
  2168  * **transform secrets:** supply secrets to transforms ([5d8cac9](https://github.com/qri-io/qri/commit/5d8cac9))
  2169  
  2170  
  2171  ### BREAKING CHANGES
  2172  
  2173  * **core.Add, core.Save:** add & save on both API & CLI now accept a "file" which is the full dataset
  2174  
  2175  
  2176  
  2177  <a name="0.3.2"></a>
  2178  # [0.3.2](https://github.com/qri-io/qri/compare/v0.3.1...v0.3.2) (2018-05-15)
  2179  
  2180  
  2181  ### Bug Fixes
  2182  
  2183  * **core.profile:** fixing bug in SetPosterPhoto and SetProfilePhoto ([8cbed3a](https://github.com/qri-io/qri/commit/8cbed3a))
  2184  * **handleDatasetsList:** peer's datasets not returning fully hydrated ([b755554](https://github.com/qri-io/qri/commit/b755554))
  2185  * **profile.MemStore:** address race condition ([58ece89](https://github.com/qri-io/qri/commit/58ece89))
  2186  * **registry:** make registry post & deletes actually work ([f71eec6](https://github.com/qri-io/qri/commit/f71eec6))
  2187  * **SetProfile:** peer should be able to remove name, email, description, homeurl, and twitter ([6f4cc1e](https://github.com/qri-io/qri/commit/6f4cc1e))
  2188  * **setup:** fix config not loading if already found ([190f2c7](https://github.com/qri-io/qri/commit/190f2c7))
  2189  * **test_repo:** added field `Type: "peer"` to test repo profile ([8478462](https://github.com/qri-io/qri/commit/8478462))
  2190  
  2191  
  2192  ### Features
  2193  
  2194  * **cmd.peers:** merge connections command into peers list command ([a3fe649](https://github.com/qri-io/qri/commit/a3fe649))
  2195  * **core.GetProfile:** add naive online indicator if P2P is enabled ([84ccc24](https://github.com/qri-io/qri/commit/84ccc24))
  2196  * **p2p:** Tag qri peers in connManager ([2f4b1fd](https://github.com/qri-io/qri/commit/2f4b1fd))
  2197  * **peer connections:** single peer connection control ([ab7e035](https://github.com/qri-io/qri/commit/ab7e035))
  2198  * **Profile Info, Connections:** verbose profile info, better explicit conn mgmt ([eb01247](https://github.com/qri-io/qri/commit/eb01247))
  2199  * **profiles:** transition to online-first display, announce ntwk joins ([f712080](https://github.com/qri-io/qri/commit/f712080))
  2200  * **registry.Datasets:** initial dataset registry integration ([58d64c2](https://github.com/qri-io/qri/commit/58d64c2)), closes [#397](https://github.com/qri-io/qri/issues/397)
  2201  * **render:** add render command for executing templates against datasets ([607104d](https://github.com/qri-io/qri/commit/607104d))
  2202  * **repo:** merge repos' EventLogs using a simple first attempt ([e5997bb](https://github.com/qri-io/qri/commit/e5997bb))
  2203  * **repo.Registry:** add registry to repo interface ([9bcb303](https://github.com/qri-io/qri/commit/9bcb303))
  2204  
  2205  
  2206  
  2207  <a name="0.3.1"></a>
  2208  # [0.3.1](https://github.com/qri-io/qri/compare/v0.3.0...v0.3.1) (2018-04-25)
  2209  
  2210  
  2211  ### Bug Fixes
  2212  
  2213  * **api:** add image/jpeg content type to PosterHandler ([b0e2495](https://github.com/qri-io/qri/commit/b0e2495))
  2214  * **config:** `qri config set` on an int field does not actually update ([435c634](https://github.com/qri-io/qri/commit/435c634))
  2215  * **connect:** fix errors caused by running connect with setup ([e522925](https://github.com/qri-io/qri/commit/e522925))
  2216  * **core.Add:** major cleanup to make add work properly ([e7951d4](https://github.com/qri-io/qri/commit/e7951d4))
  2217  * **core.StructuredData:** make StructuredData handle object datasets ([ffd8dd3](https://github.com/qri-io/qri/commit/ffd8dd3))
  2218  * **fsrepo.Profiles:** add file lock for peers.json ([f692d55](https://github.com/qri-io/qri/commit/f692d55)), closes [#357](https://github.com/qri-io/qri/issues/357)
  2219  * **fsrepo.ProfileStore:** add mutex lock ([2d4d9ee](https://github.com/qri-io/qri/commit/2d4d9ee))
  2220  * **p2p:** restore RPC peer-oriented calls, add CLI qri peers connect ([6b07712](https://github.com/qri-io/qri/commit/6b07712))
  2221  * **RPC:** bail on commands that currently don't work over RPC ([cefcebd](https://github.com/qri-io/qri/commit/cefcebd))
  2222  * **webapp:** replaced hardcoded entryupintupdateaddress ([c221d7d](https://github.com/qri-io/qri/commit/c221d7d))
  2223  
  2224  
  2225  ### Features
  2226  
  2227  * **cmd:** organize commands into groups. ([1059277](https://github.com/qri-io/qri/commit/1059277))
  2228  * **config:** add registry config ([1c72892](https://github.com/qri-io/qri/commit/1c72892))
  2229  * **config:** made webapp updates lookup configurable ([8999021](https://github.com/qri-io/qri/commit/8999021))
  2230  * **registry:** use registry at setup to claim peername ([5b3c2ee](https://github.com/qri-io/qri/commit/5b3c2ee))
  2231  * **teardown:** added 'uninstall' option from the CLI & core Teardown method ([428eeb7](https://github.com/qri-io/qri/commit/428eeb7)), closes [#175](https://github.com/qri-io/qri/issues/175)
  2232  
  2233  
  2234  
  2235  <a name="0.3.0"></a>
  2236  # [0.3.0](https://github.com/qri-io/qri/compare/v0.2.0...v0.3.0) (2018-04-09)
  2237  
  2238  
  2239  ### Bug Fixes
  2240  
  2241  * **api:** fix double api import caused by rebase ([b590776](https://github.com/qri-io/qri/commit/b590776))
  2242  * **config:** fix issues created by config overhaul ([501cf9a](https://github.com/qri-io/qri/commit/501cf9a)), closes [#328](https://github.com/qri-io/qri/issues/328) [#329](https://github.com/qri-io/qri/issues/329)
  2243  * **dockerfile:** Use unambiguous adduser arguments ([#331](https://github.com/qri-io/qri/issues/331)) ([2061d93](https://github.com/qri-io/qri/commit/2061d93))
  2244  * **fsrepo.Peerstore:** fix peerstore writing invalid json ([b76c52b](https://github.com/qri-io/qri/commit/b76c52b))
  2245  * **structuredData:** data should return DataPath not dataset Path ([7bae799](https://github.com/qri-io/qri/commit/7bae799))
  2246  * **webapp:** hide webapp hash behind vanity url ([64a5a76](https://github.com/qri-io/qri/commit/64a5a76))
  2247  
  2248  
  2249  ### Features
  2250  
  2251  * **actions:** added new repo actions package to encapsulate repo biz logic ([20322e1](https://github.com/qri-io/qri/commit/20322e1))
  2252  * **cmd.Config:** added qri config export command ([87fc395](https://github.com/qri-io/qri/commit/87fc395))
  2253  * **config:** add basic validation for api config ([c353200](https://github.com/qri-io/qri/commit/c353200))
  2254  * **config:** add basic validation for cli config ([0bea261](https://github.com/qri-io/qri/commit/0bea261))
  2255  * **config:** add basic validation for logging config ([2e6ccbb](https://github.com/qri-io/qri/commit/2e6ccbb))
  2256  * **config:** add basic validation for p2p config ([57b740c](https://github.com/qri-io/qri/commit/57b740c))
  2257  * **config:** add basic validation for profile config ([77fe3eb](https://github.com/qri-io/qri/commit/77fe3eb))
  2258  * **config:** add basic validation for repo config ([6fb0cda](https://github.com/qri-io/qri/commit/6fb0cda))
  2259  * **config:** add basic validation for rpc config ([4ddc2e6](https://github.com/qri-io/qri/commit/4ddc2e6))
  2260  * **config:** add basic validation for store config ([a9c341f](https://github.com/qri-io/qri/commit/a9c341f))
  2261  * **config:** add basic validation for webapp config ([6d64eb3](https://github.com/qri-io/qri/commit/6d64eb3))
  2262  * **config:** add more tests for config validation ([cd8aa2f](https://github.com/qri-io/qri/commit/cd8aa2f))
  2263  * **config:** add tests for config validation ([2175e03](https://github.com/qri-io/qri/commit/2175e03))
  2264  * **config:** unify qri configuration into single package ([6969ec5](https://github.com/qri-io/qri/commit/6969ec5))
  2265  * **p2p:** shiny new peer-2-peer communication library ([7a4e292](https://github.com/qri-io/qri/commit/7a4e292))
  2266  * **p2p.AnnounceDatasetChanges:** new message for announcing datasets ([29016e6](https://github.com/qri-io/qri/commit/29016e6))
  2267  * **readonly:** add check for readonly & GET in middleware ([92a2e84](https://github.com/qri-io/qri/commit/92a2e84))
  2268  * **readonly:** add fields for ReadOnly option ([832f7e3](https://github.com/qri-io/qri/commit/832f7e3))
  2269  * **readonly:** add ReadOnly to handlers ([e04f9c1](https://github.com/qri-io/qri/commit/e04f9c1))
  2270  * **readonly:** add tests for read-only server ([d7c8732](https://github.com/qri-io/qri/commit/d7c8732))
  2271  * **repo.Event:** removed DatasetAnnounce in favor of event logs ([35686fd](https://github.com/qri-io/qri/commit/35686fd))
  2272  
  2273  
  2274  
  2275  <a name="0.2.0"></a>
  2276  # [0.2.0](https://github.com/qri-io/qri/compare/v0.1.2...v0.2.0) (2018-03-12)
  2277  
  2278  
  2279  ### Bug Fixes
  2280  
  2281  * **api:** update history, add, remove, info to work with hashes ([60f79fd](https://github.com/qri-io/qri/commit/60f79fd)), closes [#222](https://github.com/qri-io/qri/issues/222)
  2282  * **CanonicalizeDatatsetRef:** should hydrate datasetRef if given path ([bf12ac4](https://github.com/qri-io/qri/commit/bf12ac4))
  2283  * **cmd.Setup:** added back env var to supply IPFS config on setup ([fb19615](https://github.com/qri-io/qri/commit/fb19615))
  2284  * **data api endpoint:** need path in response to be able to normalize data on frontend ([dc0d1f0](https://github.com/qri-io/qri/commit/dc0d1f0))
  2285  * **DatasetRef:** fixes to datasetRef handling ([134e0f9](https://github.com/qri-io/qri/commit/134e0f9))
  2286  * **refstore:** fix bug that allowed ref to save without peername ([4698dab](https://github.com/qri-io/qri/commit/4698dab))
  2287  * **Validate:** completely overhaul validation to make it work properly ([8af5653](https://github.com/qri-io/qri/commit/8af5653)), closes [#290](https://github.com/qri-io/qri/issues/290) [#290](https://github.com/qri-io/qri/issues/290)
  2288  
  2289  
  2290  ### Features
  2291  
  2292  * added color diff output that works with global color flags ([d46afac](https://github.com/qri-io/qri/commit/d46afac))
  2293  * **private flag** add private flag to cli and api add ([6ffee3d](https://github.com/qri-io/qri/commit/6ffee3d))
  2294  * color diff output ([7f38363](https://github.com/qri-io/qri/commit/7f38363))
  2295  * **api.List:** allow /list/[peer_id] ([a2771f9](https://github.com/qri-io/qri/commit/a2771f9))
  2296  * **CBOR:** added experimental support for CBOR data format ([6ac1c0e](https://github.com/qri-io/qri/commit/6ac1c0e))
  2297  * **cmd.data:** added a 'data' command to the CLI to match /data API endpoint ([51d36d2](https://github.com/qri-io/qri/commit/51d36d2))
  2298  * **diff:** add `/diff` api endpoint ([91c3d22](https://github.com/qri-io/qri/commit/91c3d22))
  2299  * **PeerID:** add PeerID to datasetRef ([005814e](https://github.com/qri-io/qri/commit/005814e))
  2300  * **save:** add `/save/` endpoint ([8563835](https://github.com/qri-io/qri/commit/8563835))
  2301  * **SelfUpdate:** added check for version being out of date ([0d87261](https://github.com/qri-io/qri/commit/0d87261))
  2302  * **webapp:** add local webapp server on port 2505 ([e38951d](https://github.com/qri-io/qri/commit/e38951d))
  2303  * **webapp:** fetch webapp hash via dnslink ([101809d](https://github.com/qri-io/qri/commit/101809d))
  2304  
  2305  
  2306  
  2307  <a name="0.1.2"></a>
  2308  # [0.1.2](https://github.com/qri-io/qri/compare/v0.1.1...v0.1.2) (2018-02-19)
  2309  
  2310  
  2311  ### Bug Fixes
  2312  
  2313  * **api history:** need to use new repo.CanonicalizeDatasetRef function to get correct ref to pass to history ([4ee7ab1](https://github.com/qri-io/qri/commit/4ee7ab1))
  2314  * **cmd:** invalid flags no longer emit a weird message ([44657ee](https://github.com/qri-io/qri/commit/44657ee))
  2315  * **cmd.Export:** fixed the ordering of path and namespace ([0ca5791](https://github.com/qri-io/qri/commit/0ca5791))
  2316  * **cmd.version:** fix incorrect version number ([#262](https://github.com/qri-io/qri/issues/262)) ([6465192](https://github.com/qri-io/qri/commit/6465192))
  2317  * **NewFilesRequest, save:** renamed NewMimeMultipartRequest to NewFilesRequest ([35da882](https://github.com/qri-io/qri/commit/35da882))
  2318  * **ParseDatasetRef, HTTPPathToQriPath:** fix that allows datasetRefs to parse peername/dataset_name@/hash ([40943ae](https://github.com/qri-io/qri/commit/40943ae))
  2319  * **save:** reset the meta and structure paths after assign ([c815bd6](https://github.com/qri-io/qri/commit/c815bd6))
  2320  * **SaveRequestParams, initHandler:** fix bug that only let us add a dataset from a file (now can add from a url) ([0e3e908](https://github.com/qri-io/qri/commit/0e3e908))
  2321  
  2322  
  2323  ### Features
  2324  
  2325  * **api tests:** expand tests to include testing responses ([b8a4d06](https://github.com/qri-io/qri/commit/b8a4d06))
  2326  * **JSON:** support JSON as a first-class citizen in qri ([#271](https://github.com/qri-io/qri/issues/271)) ([6dee242](https://github.com/qri-io/qri/commit/6dee242))
  2327  * **profileSchema:** we now validate the peer profile before saving ([6632613](https://github.com/qri-io/qri/commit/6632613))
  2328  * **ValidateProfile:** ValidateProfile reads schema from file ([5c4e987](https://github.com/qri-io/qri/commit/5c4e987))
  2329  
  2330  
  2331  
  2332  <a name="0.1.1"></a>
  2333  # [0.1.1](https://github.com/qri-io/qri/compare/v0.1.0...v0.1.1) (2018-02-13)
  2334  
  2335  
  2336  ### Bug Fixes
  2337  
  2338  * **api, save:** fix bugs to allow save API endpoint to work ([39d9be5](https://github.com/qri-io/qri/commit/39d9be5))
  2339  * updated cmd.diff to be compatible with updates to dsdiff ([201bdda](https://github.com/qri-io/qri/commit/201bdda))
  2340  * updated output param of core.Diff to `*map[string]*dsdiff.SubDiff` ([8e1aa39](https://github.com/qri-io/qri/commit/8e1aa39))
  2341  * **handleDatasetInfoResponse:** fix bug that did not keep path ([5c6d372](https://github.com/qri-io/qri/commit/5c6d372))
  2342  
  2343  
  2344  ### Features
  2345  
  2346  * **add:** add ability to add structure and metadata to API add endpoint ([722d9ad](https://github.com/qri-io/qri/commit/722d9ad))
  2347  * **add:** add ability to add structure via the CLI ([69c6a27](https://github.com/qri-io/qri/commit/69c6a27))
  2348  * **add:** cmd.add should print out any validation errors as a warning ([92bd873](https://github.com/qri-io/qri/commit/92bd873))
  2349  * **api, history:** get your own dataset's history, or a peer's dataset history using peername/datasetname ([bb321de](https://github.com/qri-io/qri/commit/bb321de))
  2350  * **cmd, log:** add ability to get history of peer datasets ([e3bb5ab](https://github.com/qri-io/qri/commit/e3bb5ab))
  2351  * **cmd.Add:** added a verbose flag to list specific validaton errors ([6b3de72](https://github.com/qri-io/qri/commit/6b3de72))
  2352  * **cmd.export:** added optional namespacing flag ([2103885](https://github.com/qri-io/qri/commit/2103885))
  2353  * **cmd.Save:** added validation warnings/options to match cmd.Add ([e77176a](https://github.com/qri-io/qri/commit/e77176a))
  2354  * **core, log:** add getRemote to Log, add Node *p2p.QriNode to HistoryRequests struct ([4356a9d](https://github.com/qri-io/qri/commit/4356a9d))
  2355  * **Init:** add structure and structureFilename to InitParams, and handle adding structure to InitParams in Init function ([9f8785e](https://github.com/qri-io/qri/commit/9f8785e))
  2356  * **p2p, history:** add handling history/log requests for peer's dataset ([a5b5f9b](https://github.com/qri-io/qri/commit/a5b5f9b))
  2357  * export to zip file and export directory using dataset name now active ([1533293](https://github.com/qri-io/qri/commit/1533293))
  2358  * reference canonicalization ([3f3aca5](https://github.com/qri-io/qri/commit/3f3aca5))
  2359  
  2360  
  2361  
  2362  <a name="0.1.0"></a>
  2363  # 0.1.0 (2018-02-02)
  2364  
  2365  
  2366  ### Bug Fixes
  2367  
  2368  * added the cmd/diff.go file ([b4139f1](https://github.com/qri-io/qri/commit/b4139f1))
  2369  * cleanup bugs introduced by recent changes ([c8e5a57](https://github.com/qri-io/qri/commit/c8e5a57))
  2370  * cleanup output of export & dataset commands ([4cf18a0](https://github.com/qri-io/qri/commit/4cf18a0))
  2371  * lots of little cleanup ([77ce05c](https://github.com/qri-io/qri/commit/77ce05c))
  2372  * lots of little cleanups here & there ([b44c749](https://github.com/qri-io/qri/commit/b44c749))
  2373  * lots of nitty-gritty fixes in time for demo. ([bc09dcf](https://github.com/qri-io/qri/commit/bc09dcf))
  2374  * more work on settling Transform refactor ([6010e9f](https://github.com/qri-io/qri/commit/6010e9f))
  2375  * remove query dedupe for now, it's broken ([a27c274](https://github.com/qri-io/qri/commit/a27c274))
  2376  * removed a println that was causing an invalid nil pointer dereference ([43c5123](https://github.com/qri-io/qri/commit/43c5123))
  2377  * **core.DatasetHandlers.StructuredData:** fix support for different data formats ([cda0728](https://github.com/qri-io/qri/commit/cda0728))
  2378  * restoring tests, cleaning up post-ds.Transform refactor ([f3dea07](https://github.com/qri-io/qri/commit/f3dea07))
  2379  * updated handlers functions taking a ListParams to use the OrderBy field ([1bf6ec3](https://github.com/qri-io/qri/commit/1bf6ec3))
  2380  * updated pagination to rely on core struct ([cdba451](https://github.com/qri-io/qri/commit/cdba451))
  2381  * more pre-demo tweaks ([a90ba04](https://github.com/qri-io/qri/commit/a90ba04))
  2382  * **api add:** fix api add endpoint bugs ([e3b2554](https://github.com/qri-io/qri/commit/e3b2554))
  2383  * **build:** always fetch dependencies from the network ([510e5ff](https://github.com/qri-io/qri/commit/510e5ff)), closes [#217](https://github.com/qri-io/qri/issues/217)
  2384  * **cmd.Add:** cleaned up add command ([875cd6f](https://github.com/qri-io/qri/commit/875cd6f))
  2385  * **cmd.queriesCmd:**  fix query listing command ([5ce7d38](https://github.com/qri-io/qri/commit/5ce7d38))
  2386  * **core.DatasetRequests.Delete:** restore dataset delete method ([54abed8](https://github.com/qri-io/qri/commit/54abed8)), closes [#89](https://github.com/qri-io/qri/issues/89)
  2387  * **core.DatasetRequests.Rename:** prevent name overwrite ([2d44f48](https://github.com/qri-io/qri/commit/2d44f48))
  2388  * **core.DatasetRequests.Rename:** repo.DatasetRef return ([cbde8a7](https://github.com/qri-io/qri/commit/cbde8a7))
  2389  * **core.History:** fix null datasets in repsonses ([ab1fd7c](https://github.com/qri-io/qri/commit/ab1fd7c))
  2390  * **core.PeerRequests.List:** remove current user from peers list ([e8611d0](https://github.com/qri-io/qri/commit/e8611d0)), closes [#115](https://github.com/qri-io/qri/issues/115)
  2391  * vendor in missing dsgraph dep, update  deps ([1967864](https://github.com/qri-io/qri/commit/1967864))
  2392  * **deps:** fix outdated ipfs gx dep ([6017ea3](https://github.com/qri-io/qri/commit/6017ea3))
  2393  * **ListParams:** address zero-indexing error in ListParams ([c317b28](https://github.com/qri-io/qri/commit/c317b28))
  2394  * **p2p.Bootstrap:** fixes to bootstrapping ([351c8dd](https://github.com/qri-io/qri/commit/351c8dd))
  2395  * **repo.Namestore.PutName:** added test to prevent empty names in repos ([202f33d](https://github.com/qri-io/qri/commit/202f33d))
  2396  * **repo.WalkRepoDatasets:** remove data race ([56862e2](https://github.com/qri-io/qri/commit/56862e2))
  2397  * **repo/graph.RepoGraph:** fix data race ([7372abc](https://github.com/qri-io/qri/commit/7372abc))
  2398  
  2399  
  2400  ### Code Refactoring
  2401  
  2402  * **core.DatasetRequests.Save:** removed ambiguous Save method ([f1972dc](https://github.com/qri-io/qri/commit/f1972dc))
  2403  
  2404  
  2405  ### Features
  2406  
  2407  * **api.ServeRPC:** serve core methods over RPC ([d4778fe](https://github.com/qri-io/qri/commit/d4778fe))
  2408  * **bash completions, DatasetRef:** added compl maker, dataset ref parsing ([036ccee](https://github.com/qri-io/qri/commit/036ccee))
  2409  * **ChangeRequest:** add support for change requests to query repositories ([eba76ea](https://github.com/qri-io/qri/commit/eba76ea))
  2410  * **cli.export:** added export command ([232b5d9](https://github.com/qri-io/qri/commit/232b5d9))
  2411  * **cmd.Config:** re-add support for configuration files ([6305d22](https://github.com/qri-io/qri/commit/6305d22)), closes [#108](https://github.com/qri-io/qri/issues/108)
  2412  * **cmd.config, cmd.profile:** added initial profile & config commands ([0e968fd](https://github.com/qri-io/qri/commit/0e968fd)), closes [#192](https://github.com/qri-io/qri/issues/192)
  2413  * **cmd.Init:** added init command ([a3530c1](https://github.com/qri-io/qri/commit/a3530c1))
  2414  * **cmd.Init:** brand new initialization process ([79371c0](https://github.com/qri-io/qri/commit/79371c0))
  2415  * **cmd.Init:** set init args via ENV variables ([878e7cb](https://github.com/qri-io/qri/commit/878e7cb))
  2416  * **cmd.Search:** added format to search, fix dockerfile ([314f088](https://github.com/qri-io/qri/commit/314f088))
  2417  * **core.DatasetRequests.Rename:** added capacity to rename a dataset ([a5776b3](https://github.com/qri-io/qri/commit/a5776b3))
  2418  * **core.HistoryRequests.Log:** deliver history as a log of dataset references ([6ca1839](https://github.com/qri-io/qri/commit/6ca1839))
  2419  * **core.Init:** initialize a dataset from a url ([7858ba7](https://github.com/qri-io/qri/commit/7858ba7))
  2420  * **core.QueryRequests.DatasetQueries:** first implementation ([a8fd2ec](https://github.com/qri-io/qri/commit/a8fd2ec))
  2421  * **core.QueryRequests.Query:** check for previously executed queries ([c3be454](https://github.com/qri-io/qri/commit/c3be454)), closes [#30](https://github.com/qri-io/qri/issues/30)
  2422  * **Datasets.List:** list removte peer datasets ([69a5210](https://github.com/qri-io/qri/commit/69a5210))
  2423  * **DefaultDatasets:** first cuts on requesting default datasets ([05a9e2f](https://github.com/qri-io/qri/commit/05a9e2f)), closes [#161](https://github.com/qri-io/qri/issues/161)
  2424  * **history:** add support for dataset history logs ([f9a3938](https://github.com/qri-io/qri/commit/f9a3938))
  2425  * **license:** switch project license to GPLv3 ([66edf29](https://github.com/qri-io/qri/commit/66edf29))
  2426  * **makefile:** added make build command ([cc6b26a](https://github.com/qri-io/qri/commit/cc6b26a))
  2427  * working on remote dataset retrieval ([d8b4424](https://github.com/qri-io/qri/commit/d8b4424))
  2428  * **makefile:** make build now requires gopath ([e74b8a3](https://github.com/qri-io/qri/commit/e74b8a3))
  2429  * added *tentative* workaround for diffing data--might need to refactor ([757753c](https://github.com/qri-io/qri/commit/757753c))
  2430  * **p2p.Bootstrap:** boostrap off both IPFS and QRI nodes ([4e80265](https://github.com/qri-io/qri/commit/4e80265))
  2431  * added *tentative* workaround for diffing data--might need to refactor ([920e66f](https://github.com/qri-io/qri/commit/920e66f))
  2432  * added initial validate command ([a647eb6](https://github.com/qri-io/qri/commit/a647eb6))
  2433  * **repo.Graph:** initial support for repo graphs ([1a5c9f9](https://github.com/qri-io/qri/commit/1a5c9f9))
  2434  * added new dataset request method `Diff` with minimal test ([c308bf0](https://github.com/qri-io/qri/commit/c308bf0))
  2435  * added new dataset request method `Diff` with minimal test ([4e7a033](https://github.com/qri-io/qri/commit/4e7a033))
  2436  * **p2p.DatasetInfo:** support dataset info over the wire ([821ed03](https://github.com/qri-io/qri/commit/821ed03))
  2437  * **p2p.QriConns:** list connected qri peers ([f067ce7](https://github.com/qri-io/qri/commit/f067ce7))
  2438  * **profile.Photo,profile.Poster:** hash-based profile images ([c0c1047](https://github.com/qri-io/qri/commit/c0c1047))
  2439  * **repo.Repo.Graph:** repos now have a graph method ([bc1f377](https://github.com/qri-io/qri/commit/bc1f377))
  2440  * **repo/graph:** added QueriesMap and DataNodes ([a285644](https://github.com/qri-io/qri/commit/a285644))
  2441  * **RPC:** change default port, provide RPC listener ([92e42ae](https://github.com/qri-io/qri/commit/92e42ae)), closes [#163](https://github.com/qri-io/qri/issues/163)
  2442  * added placeholders for `DatasetRequests.Diff` ([cffa623](https://github.com/qri-io/qri/commit/cffa623))
  2443  * added placeholders for `DatasetRequests.Diff` ([44f896b](https://github.com/qri-io/qri/commit/44f896b))
  2444  * new export command. ([f36da26](https://github.com/qri-io/qri/commit/f36da26))
  2445  * qri repos generate & store their own keys ([961b219](https://github.com/qri-io/qri/commit/961b219))
  2446  
  2447  
  2448  ### BREAKING CHANGES
  2449  
  2450  * **core.DatasetRequests.Save:** all api methods now route through either Init or Update.
  2451  This doesn't really matter, as no one was using this api anyway. But hey, it's
  2452  good to practice documenting these things
  2453  
  2454  
  2455