Tooling for group self-awareness
Groups, especially remote colaborative groups, often lack contextual information about collaborators that makes working together harder. Co-locating oneself across a number of spaces in the context of a group (or groups) provides an important avenue for improving both sense-making and working together. Where provides a generalized pattern for creating shared maps for groups to see the emergent "whereness" of each other across self-evolved sets of maps.
Specifies a space, which includes a coordinate system to use for that space, as well as a surface to render for it. To begin the app would likely just use the Cartesian coordinate system wich refers to positions on a literal image which acts as the surface.
struct Space {
name: String,
dimensionality: CoordinateSystem,
surface: String, // json encoding of what ever constitutes a surface for this space
meta: HashMap<String, String>, // usable by the UI for whatever
}
{
name: "mountain map",
dimensionality: {
type: "orthogonal",
coords: {x: "integer", y: "integer"},
range: {x: {min: 0, max: 1024}, y:{min: 0, max: 1024}}
},
surface: {
url: "https://mountain-map-images.com/everest",
size: {x:1000, y:700},
data: "[]",
,}
meta: {
attribution: "photo taken by Jane Doe"
}
}
{
name: "geo-location",
dimensionality: {
type: "orthogonal",
coords: {lat: "float", lon: "float"},
range: {lat: {min: -90, max: 90}, lon:{min: -180, max: 180}}
}
}
{
name: "emo-location",
dimensionality: {
type: "orthogonal",
coords: {core: "enum", intensity: "integer", nuance: "string"},
range: {core: ["sad", "angry", "happy", "disgusted", "fearful", "suprised", "bad"], intensity: {min: 1, max: 5}}
},
}
{
name: "emo-wheel",
dimensionality: {
type: "fixed-tree",
tree: {
{
sad: {
lonely: ["isolated", "abandoned"],
vulnerable: ["victimized", "fragile"],
despair: ["grief", "powerless"],
...
},
angry: {...},
happy: {...},
disgusted: {...},
fearful: {...},
surprised: {...},
bad: {...}
}
}
}
}
(See the Feelings Wheel)
Specifies a contextualized location in a Space. Note that the meta would not need to include data already included in Entry headers like timestamp and provenance. Where instances are added as links to Space entries for lookup.
struct Where {
location: Coord, // a location in a some arbitrary space (JSON-encoded)
meta: HashMap<String, String>, // contextualized meaning of the location
}
Here are some example "Wheres" in various different coordinate systems
{
location: {x: 12354, y: 725},
meta: {rating: "best"}
}
{
location: {core: "angry", intesity: 5, nuance: "Feeling betrayed :("},
meta: {current: true, quality: "worst", rank: "primary"}
}
{
location: "fragile",
meta: {current: true, rank: "secondary"}
}
{
location: {lat: 32.30642, lon: -122.61458},
meta: {type: "home", current: true}
}
create_space(Space) -> Hash
: creates a spaceadd_where(Space, Where) -> Hash
: adds a location to spaceremove_where(Where)
: removes a location from a spaceget_spaces() -> Vec<Space>
: returns a list of all spacesget_where(Space) -> Vec<(AgentPubKey,Timestamp,Where)>
: returns list of all locations in a space
new_space(SpaceHash, Space)
new_where(SpecHash, WhereHaderHash, Where)
removed(SpaceHash, WhereHeaderHash)
We want to be able to create spaces which are templates, instead of actual spaces to make it easy to customize especially spaces with complex surfaces. To do this we:
- link spaces to a "templates" anchor instead of the usual "spaces" link.
- Use a convention in the surface data to indicate a template slot with a name that can get rendered in a UI and then substitued into when creating a space from the template. For example, since the surface is a JSON string a template could look like this:
{
"url":"%%%Image URL%%%",
"data": "[{\"box\":{\"left\":100,\"top\":10,\"width\":100,\"height\":50},\"content\":\"%%%Title%%%\"}]"
}
struct Template {
name: String,
surface: JsonString,
}
{
name: "Map",
surface: "{
'url': '%ImageURL%',
'box': \"{'box':{'left':100,'top':10,'width':100,'height':50}\"
'title': '%String%'
}",
}
{
name: "Gauge",
surface: "{
'minimum-value': '%Number%',
'interval':' %Number%',
'maximum-value': '%Number%',
}",
}
{
name: "Wheel",
surface: "{
'count':' %Number%',
'hole-pct':' %Number%',
'hole-content': '%String%',
}",
}
{
name: "2D Compass",
surface:"{
'left-axis': '%String%',
'right-axis': '%String%',
'top-axis': '%String%',
'bottom-axis': '%String%',
}",
}