Add generated HTML

master
Ryan Rix 7 years ago
parent 9a36a47548
commit 155f2e8e94

@ -0,0 +1,360 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-02-11 Sat 11:11 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Memex Client Specifications</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Ryan Rix &lt;ryan@whatthefuck.computer&gt;" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2013 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head>
<body>
<div id="content">
<h1 class="title">Memex Client Specifications</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgc34ff41">1. Overview</a></li>
<li><a href="#org4292850">2. Chat Interface (Matrix)</a>
<ul>
<li><a href="#orgfd29066">2.1. Sample Flows</a>
<ul>
<li><a href="#orgf713b04">2.1.1. Retrieving Information</a></li>
<li><a href="#org3aae825">2.1.2. Adding a fact</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org8b8178b">3. Web Application</a></li>
<li><a href="#orgfa1caed">4. Tasker Scripts</a></li>
<li><a href="#org9f6a435">5. Command Line query interface</a></li>
</ul>
</div>
</div>
<div id="outline-container-orgc34ff41" class="outline-2">
<h2 id="orgc34ff41"><span class="section-number-2">1</span> Overview</h2>
<div class="outline-text-2" id="text-1">
<p>
This document lays out the ways in which I will be interacting with my Memex, possibly with crudely
drawn interface descriptions.
</p>
</div>
</div>
<div id="outline-container-org4292850" class="outline-2">
<h2 id="org4292850"><span class="section-number-2">2</span> Chat Interface (Matrix)</h2>
<div class="outline-text-2" id="text-2">
<p>
I'd like a chat-style interface to be the primary system with which to interact with the Memex; this
allows me to form natural-language queries and send them to the system, in a way that is easy for me
to integrate with my other systems, such as the CCE<sup><a id="fnr.1" class="footref" href="#fn.1">1</a></sup>. In essence, this boils down to a pretty
simple NLP system which needs to be able to extract a few parts of speech out of a query.
</p>
</div>
<div id="outline-container-orgfd29066" class="outline-3">
<h3 id="orgfd29066"><span class="section-number-3">2.1</span> Sample Flows</h3>
<div class="outline-text-3" id="text-2-1">
<p>
(<code>op</code> is the Operator of the bot, and <code>bot</code> is the bot)
</p>
</div>
<div id="outline-container-orgf713b04" class="outline-4">
<h4 id="orgf713b04"><span class="section-number-4">2.1.1</span> Retrieving Information</h4>
<div class="outline-text-4" id="text-2-1-1">
<pre class="example">
&lt;op&gt; What photos did I take on January 17th?
&lt;bot&gt; I found 27 photos you took on January 17th, 2016.
&lt;bot&gt; I am uploading thumbnails now. Feel free to tell me to stop when you see what you are looking for.
&lt;bot&gt; =IMG_2011.jpg=
&lt;bot&gt; My friends and I at dinner fact://photos/ef066a9b-be38-4013-af4a-f4ed2faa410e
&lt;bot&gt; =IMG_2012.jpg=
&lt;bot&gt; Birthday Selfie! fact://photos/2a9b5f93-cb1d-4096-910f-38c3afb6cb9f
&lt;bot&gt; =IMG_2013.jpg=
&lt;op&gt; stop
&lt;bot&gt; fact://photos/7535a26e-11a0-44e9-ac30-0fff2e212abe
&lt;bot&gt; If you want more information about a fact, paste the description or the item's URI back to me.
&lt;op&gt; My friends and I at dinner (in Oakland, CA), fact://photos/ef066a9b-be38-4013-af4a-f4ed2faa410e
&lt;bot&gt; This fact was captured in Oakland, CA at 21:13 on January 17th 2016.
&lt;bot&gt; It is tagged with "Carl Johnson", "Jane Doe", "John Doo", "Ocean Waves", "Roxie Theatre"
</pre>
<p>
The key bits here are <code>What photos</code> which references the <code>photos</code> fact index, and "on January 17th"
with an implied year of "last year", which is the parameter on which to narrow the query. Other
``narrowers" could be "in Phoenix, Arizona" and eventually more complex chained queries like "during
fact://event/ef2cdcbd-449f-4903-9119-69779e63c6c0", referencing an Event fact's start and end times.
</p>
</div>
</div>
<div id="outline-container-org3aae825" class="outline-4">
<h4 id="org3aae825"><span class="section-number-4">2.1.2</span> Adding a fact</h4>
<div class="outline-text-4" id="text-2-1-2">
<pre class="example">
&lt;op&gt; I purchased "Site Reliability Engineering" EBook from O'Reilly
&lt;bot&gt; Okay, can you upload a picture of it?
&lt;op&gt; =IMG_2014.jpg=
&lt;bot&gt; Thanks, I have found the following information about the ebook, is it correct?
&lt;bot&gt; Title: Site Reliability Engineering
&lt;bot&gt; Author: John Doe
&lt;bot&gt; ISBN: 1234567890
&lt;op&gt; Correct.
&lt;bot&gt; Great, how much did it cost?
&lt;op&gt; 34.99
&lt;bot&gt; Alright, I've created fact://ebook/1560bff1-ae7a-4117-85b8-7c9caa294cb7
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org8b8178b" class="outline-2">
<h2 id="org8b8178b"><span class="section-number-2">3</span> Web Application</h2>
</div>
<div id="outline-container-orgfa1caed" class="outline-2">
<h2 id="orgfa1caed"><span class="section-number-2">4</span> Tasker Scripts</h2>
</div>
<div id="outline-container-org9f6a435" class="outline-2">
<h2 id="org9f6a435"><span class="section-number-2">5</span> Command Line query interface</h2>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1">1</a></sup> <div class="footpara"><p class="footpara">
<a href="http://doc.rix.si/cce/cce.html">http://doc.rix.si/cce/cce.html</a>
</p></div></div>
</div>
</div></div>
<div id="postamble" class="status">
<p class="author">Author: Ryan Rix &lt;ryan@whatthefuck.computer&gt;</p>
<p class="date">Created: 2017-02-11 Sat 11:11</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>

@ -0,0 +1,451 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-02-11 Sat 11:12 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Memex Ingester Pipeline</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Ryan Rix &lt;ryan@whatthefuck.computer&gt;" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2013 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head>
<body>
<div id="content">
<h1 class="title">Memex Ingester Pipeline</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org8995dab">1. Overview</a></li>
<li><a href="#org674c902">2. Ingester Architecture</a>
<ul>
<li><a href="#org77b6e83">2.1. Required Fields</a>
<ul>
<li><a href="#org401af79">2.1.1. <code>uri</code></a></li>
<li><a href="#org4a3464d">2.1.2. <code>name</code></a></li>
<li><a href="#org6aca3fb">2.1.3. <code>image</code></a></li>
</ul>
</li>
<li><a href="#orga4310b7">2.2. Optional Fields</a>
<ul>
<li><a href="#org3128b42">2.2.1. <code>description</code></a></li>
<li><a href="#orgb50779b">2.2.2. <code>captured-at</code></a></li>
<li><a href="#org4ab0b42">2.2.3. <code>updated-at</code></a></li>
<li><a href="#orge192b08">2.2.4. <code>geo</code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org8995dab" class="outline-2">
<h2 id="org8995dab"><span class="section-number-2">1</span> Overview</h2>
<div class="outline-text-2" id="text-1">
<p>
Memex is an data storage and information retrieval system, built around the idea of ingesting data
from a number of sources and storing them in a datastore which allows for easy queries of said data.
</p>
<p>
The current stack looks, in essence, like an ElasticSearch database, paired with a set of custom
ingesters; currently, the ingesters are probably going to be written from scratch, instead of
leveraging a platform like Logstash, as the facts I am looking at are less stream-based than what
Logstash is designed to provide. For things with default Logstash providers, like <code>twitter</code>, I could
leverage these if the memory trade-off of running a full Java application is deemed to be worthwhile.
</p>
</div>
</div>
<div id="outline-container-org674c902" class="outline-2">
<h2 id="org674c902"><span class="section-number-2">2</span> Ingester Architecture</h2>
<div class="outline-text-2" id="text-2">
<p>
Because ElasticSearch exposes a simple HTTP API, ingesters can be written in the language most
appropriate for them. This means that I could build an <code>Org-mode</code> parser that runs as an Emacs batch
job, or a Matrix log parser that runs as a JavaScript process on my server, or a Twitter parser that
uses a simple Python twitter streaming library to push my tweets and tweets mentioning me in to
ElasticSearch.
</p>
<p>
Each ingester will have its own fact-type, which translates in to the ElasticSearch index in which
the fact is stored. It is important to note that the ElasticSearch is <b>not</b> to be considered the
source of truth; I won't be uploading image blobs in to the ElasticSearch, just pointing to where on
my file store's file system it resides on. The presentation layer is responsible for providing that
to me, be it as a Matrix Content Repository upload, or a temporary HTTPS URL served from said
machine's <code>apache2</code> instance and presented in the mobile application which generated the query
results.
</p>
<p>
This is intentionally vague; the idea is that facts are generic enough to be useful and the meat is
in the query system, the ability to link facts together, which is where this turns in to a "fun" NLP
problem that I'm actually going to punt on for a while, and instead will probably be issuing
multiple queries, chaining the facts to get the information I need by hand.
</p>
</div>
<div id="outline-container-org77b6e83" class="outline-3">
<h3 id="org77b6e83"><a id="ID-407fd88b-f5c8-46de-b77d-6e9583714347"></a><span class="section-number-3">2.1</span> Required Fields</h3>
<div class="outline-text-3" id="text-2-1">
<p>
In order to make the clients easy to standardize, a number of fields are defined to make it easy to
present the information a fact contains; each fact can have its own set of metadata, and each
fact-type will probably have its own schema to make certain types of media more easy to standardize.
</p>
</div>
<div id="outline-container-org401af79" class="outline-4">
<h4 id="org401af79"><span class="section-number-4">2.1.1</span> <code>uri</code></h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
A URI points to where a fact lives, simply. Given the fact that a Fact can be, for example, the
ownership of a physical item, the URIs can either be URLs, or Emacs org-mode style links as
generated by <code>org-store-link</code><sup><a id="fnr.1" class="footref" href="#fn.1">1</a></sup>; HTTP or HTTPS URLs are preferred, but not required.
</p>
<p>
In the case of physical facts, the URI can be a human-readable string or a <code>fact//:&lt;INDEX&gt;/&lt;UUID&gt;</code> pointer to
another fact, which is then interpreted as a parent-child relationship. A prime use-case here would
be "where is this item stored?", allowing us to walk the fact tree to discover a direct physical
location in which an object exists.
</p>
</div>
</div>
<div id="outline-container-org4a3464d" class="outline-4">
<h4 id="org4a3464d"><span class="section-number-4">2.1.2</span> <code>name</code></h4>
<div class="outline-text-4" id="text-2-1-2">
<p>
This is the human-readable name of a given fact; it can be the file name of a digital artifact, but
should be more meaningful than this, for example "%ARTIST - %TRACK - %ALBUM" for audio files, or
"%AUTHOR - %TITLE" for documents.
</p>
</div>
</div>
<div id="outline-container-org6aca3fb" class="outline-4">
<h4 id="org6aca3fb"><span class="section-number-4">2.1.3</span> <code>image</code></h4>
<div class="outline-text-4" id="text-2-1-3">
<p>
This is one of:
</p>
<ul class="org-ul">
<li>A fully qualified HTTP or HTTPS URI to an image which represents the fact (Cover art,</li>
</ul>
<p>
product photo of object, etc).
</p>
<ul class="org-ul">
<li>A <code>fact://&lt;INDEX&gt;/&lt;UUID&gt;</code> URI pointing to another fact, such as a photo fact whose URI is displayable.</li>
<li>A <code>mxc://&lt;MXID&gt;</code> pointer to an object in the Matrix Content Repository, this is fully qualified
with the <code>server_name</code> of the homeserver, as it would be for a <a href="https://matrix.org">matrix.org</a> upload.<sup><a id="fnr.2" class="footref" href="#fn.2">2</a></sup><sup>, </sup><sup><a id="fnr.3" class="footref" href="#fn.3">3</a></sup></li>
<li>A <code>file://&lt;PATH&gt;</code> URI matching the <code>uri</code> property above.</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orga4310b7" class="outline-3">
<h3 id="orga4310b7"><span class="section-number-3">2.2</span> Optional Fields</h3>
<div class="outline-text-3" id="text-2-2">
<p>
Past the <a href="#org77b6e83">Required Fields</a> presented above, clients are expected to be able to render the following
optional fields.
</p>
</div>
<div id="outline-container-org3128b42" class="outline-4">
<h4 id="org3128b42"><span class="section-number-4">2.2.1</span> <code>description</code></h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
A human readable description of the fact. Pretty straightforward. This could come from photograph
metadata, album synopses online, or entered by hand.
</p>
</div>
</div>
<div id="outline-container-orgb50779b" class="outline-4">
<h4 id="orgb50779b"><span class="section-number-4">2.2.2</span> <code>captured-at</code></h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
Initial datetime at which a fact was captured. <code>PUT</code> requests should never set this, <code>POST</code> requests
should always set this. This should be any time-shaped object which ElasticSearch can parse.<sup><a id="fnr.4" class="footref" href="#fn.4">4</a></sup>
</p>
</div>
</div>
<div id="outline-container-org4ab0b42" class="outline-4">
<h4 id="org4ab0b42"><span class="section-number-4">2.2.3</span> <code>updated-at</code></h4>
<div class="outline-text-4" id="text-2-2-3">
<p>
The datetime at which the fact was last changed. This should be set by both <code>PUT</code> and <code>POST</code>
requests. This should be any time-shaped object which ElasticSearch can parse.<sup><a id="fnr.4.100" class="footref" href="#fn.4">4</a></sup>
</p>
</div>
</div>
<div id="outline-container-orge192b08" class="outline-4">
<h4 id="orge192b08"><span class="section-number-4">2.2.4</span> <code>geo</code></h4>
<div class="outline-text-4" id="text-2-2-4">
<p>
A geo URI<sup><a id="fnr.5" class="footref" href="#fn.5">5</a></sup> which would allow the fact to be placed on a map and queried based on location.
</p>
</div>
</div>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1">1</a></sup> <div class="footpara"><p class="footpara">
(define-function 'org-store-link)
</p></div></div>
<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2">2</a></sup> <div class="footpara"><p class="footpara">
<a href="https://matrix.org/docs/spec/client_server/r0.2.0.html#id43">https://matrix.org/docs/spec/client_server/r0.2.0.html#id43</a>
</p></div></div>
<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3">3</a></sup> <div class="footpara"><p class="footpara">
This is provided as a means to allow user using a theoretical Matrix.org client to capture
facts to upload an image as part of the fact generation, without having to manually transfer an
image in to where it can be referenced by the Image DB.
</p></div></div>
<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4">4</a></sup> <div class="footpara"><p class="footpara">
<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html</a>
</p></div></div>
<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5">5</a></sup> <div class="footpara"><p class="footpara">
<a href="https://en.wikipedia.org/wiki/Geo_URI_scheme">https://en.wikipedia.org/wiki/Geo_URI_scheme</a>
</p></div></div>
</div>
</div></div>
<div id="postamble" class="status">
<p class="author">Author: Ryan Rix &lt;ryan@whatthefuck.computer&gt;</p>
<p class="date">Created: 2017-02-11 Sat 11:12</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>

@ -0,0 +1,333 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-02-11 Sat 11:11 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Memex</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Ryan Rix &lt;ryan@whatthefuck.computer&gt;" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2013 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head>
<body>
<div id="content">
<h1 class="title">Memex</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgfbb0ce3">1. Memex: Extracting Information from Data</a>
<ul>
<li><a href="#org2962fa0">1.1. Use Cases</a></li>
</ul>
</li>
<li><a href="#org2f61feb">2. Architecture</a>
<ul>
<li><a href="#orgadf5073">2.1. Fact Types</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-orgfbb0ce3" class="outline-2">
<h2 id="orgfbb0ce3"><span class="section-number-2">1</span> Memex: Extracting Information from Data</h2>
<div class="outline-text-2" id="text-1">
<p>
Memex is my external memory, a search engine for the facts surrounding my life.
</p>
</div>
<div id="outline-container-org2962fa0" class="outline-3">
<h3 id="org2962fa0"><span class="section-number-3">1.1</span> Use Cases</h3>
<div class="outline-text-3" id="text-1-1">
<ul class="org-ul">
<li>What calendar events do I have today</li>
<li>What photos did I take while I was in San Diego?</li>
<li>What restaurant did I go to the last time I was in Tempe?</li>
<li>Who was I talking to about Ear Plugs on Twitter?</li>
<li>What page was I looking at that had</li>
<li>Where did I store my USB mouse?</li>
<li>Which e-books do I need to strip the DRM from?</li>
<li>Who have I sent emails to in the last month?</li>
<li>When was the last time I ate Burmese food</li>
<li>Where was I when I took a picture of a truck</li>
<li>Which calendar event did this page of notes come from</li>
<li>Which calendar event was I at when I wrote this org-mode entry</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org2f61feb" class="outline-2">
<h2 id="org2f61feb"><span class="section-number-2">2</span> Architecture</h2>
<div class="outline-text-2" id="text-2">
<p>
This thing is pretty simple, right now; it's a simple backend that takes objects and shoves them in
to two stores.
</p>
<div class="figure">
<p><img src="images/arch.png" alt="arch.png" />
</p>
</div>
<p>
I am not sure whether I want to have this running PostgreSQL, that feels very much like
overkill. The biggest unknown is being able to do recursive graph queries with Elasticsearch, but
I'm not even sure if that is a usecase I need. In the short/medium turn, I imagine I will stick with
just using ElasticSearch, and save the blobs to somewhere I can backfill them from, probably an S3
bucket.
</p>
</div>
<div id="outline-container-orgadf5073" class="outline-3">
<h3 id="orgadf5073"><span class="section-number-3">2.1</span> Fact Types</h3>
<div class="outline-text-3" id="text-2-1">
<p>
Facts, can be roughly defined as:
</p>
<ul class="org-ul">
<li>time, date and location in which an Event takes place</li>
<li>location of a digital artifact along with metadata to identify the artifact</li>
<li>location of a physical artifact along with metadata surrounding the artifact</li>
<li><code>object</code> is a bit obtuse, but is a physical "thing"</li>
<li><code>event</code> is a time period, two datetimes with metadata attached to them.</li>
<li><code>location</code> is probably too abstract; it feels like an attribute attached to other facts, but there
might be value in presenting it directly.</li>
<li><code>statement</code> is a sentence or paragraph of either written text, recorded voice, or thoughts; linked
statements form a conversation or train of thought depending on the source.</li>
<li><code>page</code> is either an OCRd document, or the text of an HTML page.</li>
<li><code>photo</code> is, well, a photo. A jpeg or png with metadata attached.</li>
<li><code>file</code> is any other file, with whatever metadata can be extracted from them.</li>
<li><code>person</code> is self-explanatory. Basically looking at a vcard and arbitrary key-values otherwise.</li>
</ul>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Ryan Rix &lt;ryan@whatthefuck.computer&gt;</p>
<p class="date">Created: 2017-02-11 Sat 11:11</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>

@ -66,7 +66,7 @@ This is one of:
product photo of object, etc).
- A =fact://<INDEX>/<UUID>= URI pointing to another fact, such as a photo fact whose URI is displayable.
- A =mxc://<MXID>= pointer to an object in the Matrix Content Repository, this is fully qualified
with the =server_name= of the homeserver, as it would be for a [[matrix.org]] upload.[fn:2][fn:3]
with the =server_name= of the homeserver, as it would be for a [[https://matrix.org][matrix.org]] upload.[fn:2][fn:3]
- A =file://<PATH>= URI matching the =uri= property above.
** Optional Fields

Loading…
Cancel
Save