<rss version="2.0">
  <channel>
    <title>Siplicity</title>
    <link>https://sipli.city</link>
    <description>Siplicity - Devlog</description>
    <generator>Zine -- https://zine-ssg.io</generator>
    <language>en-AU</language>
    <lastBuildDate>Fri, 24 Jul 2026 05:14:25 +0000</lastBuildDate>
    
      <item>
        <title>Custom vocabularies</title>
        <description>&lt;p&gt;At the heart of Siplicity, there is a simple, but flexible, metadata model. Metadata, for files and folders, is stored as a tree of namespace/name/value nodes. Nodes can have children. Values are just strings.&lt;/p&gt;&lt;p&gt;There’s a special SCHEMA node in Siplicity that keeps track of the metadata terms being used in a particular session. There’s not much else special about it: it stores the schema in the same metadata structure described above, except without any values.&lt;/p&gt;&lt;p&gt;This looks like this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;          ns:name
            |
  ---------------------
  |         |         |
ns:name  ns:name  ns:name
            |         |
       ----------     --------------------    
       |         |    |          |       |
    ns:name  ns:name  ns:name  ns:name  ns:name

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The SCHEMA node is updated automatically during a Siplicity session (e.g. if you run a checksum job, it might add the schema terms for checksum algorithm and checksum result). In the data entry pane, when you select fields to edit, you are selecting from the fields available on that SCHEMA node.&lt;/p&gt;&lt;p&gt;Over the past few months I’ve been working on a mechanism for end users to attach their own custom vocabulary terms to the SCHEMA node. To enable, for example, working with &lt;a href=&quot;https://www.dublincore.org/specifications/dublin-core/&quot;&gt;DC Terms&lt;/a&gt; or the &lt;a href=&quot;https://www.loc.gov/standards/premis/&quot;&gt;PREMIS vocabulary&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;TOML&lt;/h2&gt;&lt;p&gt;End users can now add custom vocabularies by encoding their schema into a &lt;a href=&quot;https://toml.io/en/&quot;&gt;TOML file&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here’s an example, showing the full complexity you can achieve:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;namespace = &amp;quot;test&amp;quot; // namespaces are inherited, can be overriden below
name = &amp;quot;root&amp;quot; // name of root metadata node, if omitted, fields will sit at the top level of the schema
fields = [
    &amp;quot;simple&amp;quot;,
    { name = &amp;quot;parent&amp;quot;, fields = [
        &amp;quot;simple child&amp;quot;,
        { name = &amp;quot;another&amp;quot;, namespace = &amp;quot;distinct&amp;quot;, fields = [
            &amp;quot;enough&amp;quot;,
        ] },
    ] },
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This translates to this tree of namespace/name pairs:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;          test:root
            |
  ------------------
  |                |
test:simple  test:parent
                   |         
       ------------- 
       |           |
test:simple child  distinct:another
                   |
                   distinct:enough 

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It’s a little dense, I know, but there’s a simplified form that you can use for a flat schema where all the terms sit in a single namespace:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;namespace = &amp;quot;AGRkMS&amp;quot;
name = &amp;quot;AGRkMS&amp;quot;
fields = [
  &amp;quot;Identifier&amp;quot;,
  &amp;quot;Creator&amp;quot;,
  &amp;quot;Date Created&amp;quot;,
  &amp;quot;Title&amp;quot;,
  &amp;quot;Protective Marking&amp;quot;,
  &amp;quot;Disposal Class&amp;quot;,
  &amp;quot;Rights&amp;quot;,
]
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Settings&lt;/h2&gt;&lt;p&gt;Once you’ve created your TOML file, it needs to be saved within a “vocab” folder, within the “definitions” folder of your “siplicity” home directory.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://sipli.city/file-tree.png&quot; alt=&quot;screenshot of file tree&quot; width=&quot;327&quot; height=&quot;154&quot;&gt;&lt;/p&gt;&lt;p&gt;On a Windows install, you can find the “siplicity” home directory within the hidden “AppData” directory, e.g.:&lt;/p&gt;&lt;p&gt;&lt;code&gt;c:\Users\richardlehane\AppData\Local\siplicity&lt;/code&gt;&lt;/p&gt;&lt;h3&gt;Activation&lt;/h3&gt;&lt;p&gt;The next time you start Siplicity it will be loaded and the final step is to activate it. To do this, go into the “Definitions” tab of Siplicity’s settings menu, and activate the toggle for your vocabulary:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://sipli.city/settings-activate.png&quot; alt=&quot;screenshot of settings menu&quot; width=&quot;528&quot; height=&quot;386&quot;&gt;&lt;/p&gt;&lt;h2&gt;Using your new terms&lt;/h2&gt;&lt;p&gt;Once that’s all done, you can start using your terms. When selecting fields for editing in the data entry pane, they will appear like this:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://sipli.city/schema.png&quot; alt=&quot;screenshot of schema menu&quot; width=&quot;479&quot; height=&quot;641&quot;&gt;&lt;/p&gt;</description>
        <link>https://sipli.city/devlog/vocabularies/</link>
        <pubDate>Thu, 02 Jul 2026 01:00:00 +0000</pubDate>
        <guid>https://sipli.city/devlog/vocabularies/</guid>
      </item>
    
      <item>
        <title>Siplicity available in Early Access</title>
        <description>&lt;p&gt;What better day than &lt;a href=&quot;https://www.dpconline.org/events/world-digital-preservation-day&quot;&gt;World Digital Preservation Day&lt;/a&gt; to announce that &lt;a href=&quot;https://sipli.city/&quot;&gt;Siplicity&lt;/a&gt; is now is now available to &lt;a href=&quot;https://sipli.city/get-it/&quot;&gt;download, try, and buy in early access&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;&lt;em&gt;What is Siplicity?&lt;/em&gt; It’s a new application to make transferring digital files simpler, particularly when working in a digital preservation or digital curation context.&lt;/p&gt;&lt;p&gt;&lt;em&gt;What does early access mean?&lt;/em&gt; It’s a &lt;a href=&quot;https://en.wikipedia.org/wiki/Early_access&quot;&gt;term from the video game industry&lt;/a&gt;, and means that users can buy and use software while it is still being built. For users, this means they can access software earlier and engage with developers to help shape the final product. For developers, it means funding at a crucial stage and real world testing before the formal release.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Should you join the early access?&lt;/em&gt; &lt;a href=&quot;https://sipli.city/get-it/&quot;&gt;Install&lt;/a&gt; and try it first. Although Siplicity is unfinished, the essential functionality is now in place, including the three principal &lt;a href=&quot;https://sipli.city/screenshots/&quot;&gt;working views&lt;/a&gt; (the workspace pane, the analysis pane, and the data entry pane). You can test all of that in the demo. A license is only required to unlock use of the commit button. If there’s already enough there to incorporate the tool in your workflows, or if it’s on the verge of that, please consider getting a license. To reward early access supporters, the early access license includes three year’s access to updates (rather than the normal license’s two years).&lt;/p&gt;&lt;p&gt;If you like what you see, but can’t yet justify the purchase, know that there’s a lot more still to come, including:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;cross-platform support&lt;/li&gt;&lt;li&gt;multilingual support&lt;/li&gt;&lt;li&gt;working with compressed and archive formats&lt;/li&gt;&lt;li&gt;comprehensive, PREMIS-based audit trails&lt;/li&gt;&lt;li&gt;reading and writing embedded metadata&lt;/li&gt;&lt;li&gt;formulas/macros for metadata editing&lt;/li&gt;&lt;li&gt;metadata import&lt;/li&gt;&lt;li&gt;remote file locations&lt;/li&gt;&lt;li&gt;support for multiple outputs including OCFL, EARK, and the various flavours of digital preservation system imports.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I’ll be posting my progress regularly on the &lt;a href=&quot;https://sipli.city/devlog/&quot;&gt;devlog&lt;/a&gt;, and hope to have these pieces in place for a version one launch early next year.&lt;/p&gt;&lt;p&gt;&lt;em&gt;July 2026 update: the early access period is continuing until v1.0 is released&lt;/em&gt;&lt;/p&gt;</description>
        <link>https://sipli.city/devlog/early-access/</link>
        <pubDate>Wed, 06 Nov 2024 22:00:00 +0000</pubDate>
        <guid>https://sipli.city/devlog/early-access/</guid>
      </item>
    
      <item>
        <title>Actionable analytics</title>
        <description>&lt;p&gt;This week I finished the first draft of Siplicity’s analysis pane.&lt;/p&gt;&lt;p&gt;Here’s how it looks:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://sipli.city/devlog/analysis/analysis.gif&quot; alt=&quot;Screencast of analysis pane&quot; width=&quot;1254&quot; height=&quot;703&quot;&gt;&lt;/p&gt;&lt;p&gt;As soon as you add files to the to the workspace, an initial set of reports is automatically created, with visualisations for file sizes, dates modified, and file extensions.&lt;/p&gt;&lt;p&gt;Running actions over the files in your workspace can produce further reports:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;the siegfried action creates format ID, format class and mime-type reports&lt;/li&gt;&lt;li&gt;any of the checksum actions will generate a duplicate report.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All of the reports can be used as the basis for queries to the worspace pane. So that, for example, you can more closely inspect files from a particular date range or of a particular format type.&lt;/p&gt;&lt;p&gt;This connection between the analysis and workspace panes can power workflows like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;identifying and removing zero-byte files&lt;/li&gt;&lt;li&gt;selecting duplicate files for removal&lt;/li&gt;&lt;li&gt;blacklisting sets of file formats&lt;/li&gt;&lt;li&gt;whitelisting file formats for selection to the output pane.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In other words, Siplicity’s analytics produce more than insights. They are actionable.&lt;/p&gt;</description>
        <link>https://sipli.city/devlog/analysis/</link>
        <pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate>
        <guid>https://sipli.city/devlog/analysis/</guid>
      </item>
    
      <item>
        <title>Bake off - second attempt in the kitchen!</title>
        <description>&lt;p&gt;Two weeks ago I gave a first demonstration of Siplicity for the &lt;a href=&quot;https://ipres2024.pubpub.org/&quot;&gt;iPRES conference&lt;/a&gt; (the “bake off” stream). Many thanks to Micky, Dries, and the rest of the conference team for including me in the program.&lt;/p&gt;&lt;p&gt;My presentation was unfortunately a little undercooked. Many of the ingredients were there, but without enough time in the coding oven, and so I focused the presentation on Siplicity’s backend application (the GRPC server), which didn’t make for an appetizing meal.&lt;/p&gt;&lt;p&gt;OK, enough with the cooking puns! Here’s the demo of Siplicity I would have liked to have given:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://sipli.city/devlog/bake-off/siplicity_2024-10-20.gif&quot; alt=&quot;Screencast of Siplicity application&quot; width=&quot;876&quot; height=&quot;683&quot;&gt;&lt;/p&gt;&lt;p&gt;In this screencast you can see that much of Siplicity’s basic functionality is now implemented in the frontend.&lt;/p&gt;&lt;p&gt;The screencast demonstrates:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;adding files and folders to an input graph&lt;/li&gt;&lt;li&gt;manipulating the input graph (select, delete and move nodes to the output graph)&lt;/li&gt;&lt;li&gt;running processes like file format identification and checksum calculation to enrich record metadata&lt;/li&gt;&lt;li&gt;viewing record details and metadata&lt;/li&gt;&lt;li&gt;manipulating the output graph and defining an output destination&lt;/li&gt;&lt;li&gt;formatting the output graph as a bagit package&lt;/li&gt;&lt;li&gt;committing the output graph to disk.&lt;/li&gt;&lt;/ul&gt;</description>
        <link>https://sipli.city/devlog/bake-off/</link>
        <pubDate>Thu, 03 Oct 2024 00:00:00 +0000</pubDate>
        <guid>https://sipli.city/devlog/bake-off/</guid>
      </item>
    
      <item>
        <title>Tech stack overview</title>
        <description>&lt;p&gt;Siplicity has a backend written in &lt;a href=&quot;https://golang.org&quot;&gt;Go&lt;/a&gt;. I chose Go mainly because I am familiar with it but can justify the choice on the basis that it is cross-platform, reasonably performant, and enables native integration with &lt;a href=&quot;https://www.itforarchivists.com/siegfried&quot;&gt;Siegfried&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The frontend is &lt;a href=&quot;https://flutter.dev&quot;&gt;Flutter&lt;/a&gt;. This framework is best known for mobile UIs but it now has good desktop and web support too. It is modern, performant, and native-feeling.&lt;/p&gt;&lt;p&gt;The backend and frontend communicate via &lt;a href=&quot;https://grpc.io&quot;&gt;gRPC&lt;/a&gt;. I’ve been using the &lt;a href=&quot;https://buf.build/&quot;&gt;Buf&lt;/a&gt; tooling for this.&lt;/p&gt;&lt;p&gt;I am focused on creating a local, client application but a benefit of this mix of go/flutter/grpc is that it opens the door to other potential deployment scenarios, including local client (native or browser) with a cloud backend (e.g. an AWS machine in the same region as your cloud storage).&lt;/p&gt;</description>
        <link>https://sipli.city/devlog/tech-stack/</link>
        <pubDate>Sun, 15 Sep 2024 02:00:00 +0000</pubDate>
        <guid>https://sipli.city/devlog/tech-stack/</guid>
      </item>
    
  </channel>
</rss>