👂 🎴 🕸️
The
application
'
s
Perl
code
lives
under
lib
/
Kastalia
/.
Main
.
pm
defines
almost
every
HTTP
route
--
what
URL
does
what
.
Core
.
pm
''
TT
.
pm
''
SelectorQueries
.
pm
and
API
.
pm
have
no
package
statement
of
their
own
:
they
are
require
'
d
straight
into
Main
.
pm
'
s
namespace
''
so
every
helper
function
they
define
(
addKnot
''
addBound
''
addAttribute
''
the
various
graph
-
query
helpers
used
by
templates
''
and
so
on
)
is
directly
callable
''
unqualified
''
from
anywhere
in
that
merged
namespace
--
effectively
one
large
shared
toolbox
rather
than
several
separate
modules
.
User
.
pm
is
the
one
exception
that
keeps
its
own
package
Kastalia
::
User
''
for
the
LDAP
-
backed
account
/
login
logic
''
while
still
sharing
the
same
Dancer2
app
context
.<
br
><
br
>
Dancer2
itself
handles
routing
''
sessions
(
backed
by
Memcached
)
and
the
Template
::
Toolkit
rendering
described
in
the
Frontend
section
.
Two
tables
carry
almost
the
entire
system
:
knots
(
knot
id
''
knot
name
''
knot
content
''
attributes
hstore
)
and
bounds
(
bound
id
''
sub
''
predicate
''
obj
''
ord
''
bound
creator
).<
br
><
br
>
attributes
is
a
Postgres
hstore
column
--
an
open
-
ended
set
of
key
/
value
string
pairs
--
rather
than
a
fixed
set
of
typed
columns
.
This
is
what
lets
a
knot
carry
wildly
different
metadata
depending
on
what
it
'
s
being
used
for
:
a
presentation
knot
might
have
ogg
url
and
presentation
timeline
;
an
image
knot
an
img
url
;
a
person
knot
an
age
or
voice
.
No
schema
migration
is
needed
to
introduce
a
new
attribute
--
any
route
can
simply
start
writing
a
new
key
.<
br
><
br
>
predicate
''
by
contrast
''
is
a
proper
Postgres
ENUM
type
''
not
a
free
string
--
a
closed
''
explicit
list
of
the
relation
kinds
the
graph
currently
understands
(
is
parent
''
contains
''
is
member
''
is
uttered
as
''
illustrates
''
translates
''
echoes
''
is
linked
''
and
a
handful
of
others
).
Extending
the
vocabulary
means
explicitly
adding
a
new
value
to
that
enum
(
ALTER
TYPE
predicate
ADD
VALUE
...)
--
a
small
deliberate
act
''
not
an
accident
of
someone
typing
a
slightly
different
string
.
[Impressum, Datenschutz, Login] Other subprojects of udk.ai linkring: refused.science baumhaus.digital teacher.solar fibel.digital gardens.digital