What is Lexical.cloud?
Cloud computing is a vast domain with offerings from many providers. Challenges presented by many providers include:
- Vernacular differs with each cloud provider
- Product naming creates distinct vocabularies for each provider
- Features are distributed differently across products
- Translation between clouds providers is an art
Lexical.cloud is a cross-reference of products and capabilities from many cloud providers. Goals of this project include:
- Grouping products for discoverability
- Identifying capabilities of each product
- Linking product features with a shared vocabulary
Keep reading below to understand the big picture. The explanation is organized into the following sections:
- Context explains the who and why
- Containers explains the what
- Components explains the how
Context
As a creator
, I want to develop apps
that leverage the Lexical.cloud
catalog,
so I can answer questions about cloud resources when choosing an architecture.
As a consumer
, I want to explore the Lexical.cloud
catalog,
so I can discover what resources exist to fulfill cloud architecture needs.
As a contributor
, I want to maintain the Lexical.cloud
catalog,
so I can spread awareness of options for cloud architecture.
flowchart TD
%% entities
U1["fa:fa-users Consumers"]
U2["fa:fa-users Contributors"]
U3["fa:fa-users Creators"]
%% groups
subgraph G1["fa:fa-users Users"]
U1
U2
U3
end
subgraph G2["fa:fa-cloud Lexical.cloud
- Discover resources to fulfill cloud architecture needs.
- Spread awareness of options for cloud architecture.
"]
end
subgraph G3["fa:fa-box Apps
- Answer questions about cloud resources when choosing an architecture.
"]
end
%% relationships
U3 -->|develop| G3 -->|leverage| G2
U1 -->|explore| G2
U2 -->|maintain| G2
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke-dasharray:5
%% interactions
click G2 "#lexicalcloud"
Lexical.cloud
Given Lexical.cloud
is a community data
project
when contributors
maintain the community data
then community data
populates the frontend
and backend
.
Given Lexical.cloud
exposes data in a backend
when community data
populates the backend
then apps
can leverage the backend
.
Given Lexical.cloud
needs a frontend
to display data
when community data
populates the frontend
then consumers
can explore the frontend
.
flowchart TD
%% entities
U1["fa:fa-users Consumers"]
U2["fa:fa-users Contributors"]
U3["fa:fa-users Creators"]
%% groups
subgraph G1["fa:fa-users Users"]
U1
U2
U3
end
subgraph G2["fa:fa-box Apps"]
end
subgraph G3["fa:fa-cloud Lexical.cloud"]
G4
G5
G6
end
subgraph G4["fa:fa-database Community Data"]
end
subgraph G5["fa:fa-cloud Backend"]
end
subgraph G6["fa:fa-cloud Frontend"]
end
%% relationships
U1 -->|explore| G6
U2 -->|maintain| G4
U3 -->|develop| G2
G4 -->|populates| G5
G4 -->|populates| G6
G2 -->|leverage| G5
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke-dasharray:5
style G3 stroke:#30638E,stroke-dasharray:10,stroke-width:3px
%% interactions
click G4 "#community-data"
click G5 "#backend"
click G6 "#frontend"
Containers
Community Data
DIAGRAM | DECISION LOG
Given Lexical.cloud
community data
sources
include a cloud catalog
when contributors
maintain the cloud catalog
then the cloud catalog
feeds many transforms
.
Given Lexical.cloud
community data
tranforms
include a static site generator
when the static site generator
produces html content
then the html content
populates the frontend
and consumers
can explore that content on the frontend
.
Given Lexical.cloud
community data
tranforms
include a json generator
when the json generator
produces the json data
then the json data
populates the backend
and apps
leverage services on the backend
.
flowchart TD
%% entities
U1["fa:fa-users Consumers"]
U2["fa:fa-users Contributors"]
U3["fa:fa-users Creators"]
I1["fa:fa-table Cloud Catalog"]
P1["fa:fa-code Static Site Generator"]
P2["fa:fa-code JSON Generator"]
O2["fa:fa-bracket JSON Data"]
O1["fa:fa-globe HTML Content"]
%% groups
subgraph G1["fa:fa-users Users"]
U1
U2
U3
end
subgraph G2["fa:fa-box Apps"]
end
subgraph G3["fa:fa-cloud Lexical.cloud"]
G4
G5
G6
end
subgraph G4["fa:fa-database Community Data"]
G4a
G4b
G4c
end
subgraph G4a["Sources"]
I1
end
subgraph G4b["Transforms"]
P1
P2
end
subgraph G4c["Outputs"]
O1
O2
end
subgraph G5["fa:fa-cloud Backend"]
end
subgraph G6["fa:fa-cloud Frontend"]
end
%% relationships
U1 -->|explore| G6
U2 -->|maintain| I1
U3 -->|develop| G2
O1 -->|populates| G6
O2 -->|populates| G5
G2 -->|leverage| G5
I1 -->|feeds| P1 -->|produces| O1
I1 -->|feeds| P2 -->|produces| O2
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke-dasharray:5
style G3 stroke-dasharray:5
style G4 stroke:#30638E,stroke-dasharray:10,stroke-width:3px
style G4a stroke-dasharray:5
style G4b stroke-dasharray:5
style G4c stroke-dasharray:5
%% interactions
click I1 "#cloud-catalog"
click P1 "#static-site-generator"
click P2 "#json-generator"
click O1 "#html-content"
click O2 "#json-data"
click G5 "#backend"
click G6 "#frontend"
Backend
DIAGRAM | DECISION LOG
Given Lexical.cloud
backend
begins ingestion
with storage
when community data
populates backend storage
then data in storage
is ready to process by the state machine
.
Given Lexical.cloud
backend
persist state in a datastore
when ingestion
completes at the state machine
then the state machine
will update the datastore
.
Given Lexical.cloud
backend
api
is fronted by an api gateway
when apps
leverage the api
then the api gateway
will call endpoints
and the endpoints
will query the datastore
.
flowchart TD
%% entities
%%U1["fa:fa-users Consumers"]
U2["fa:fa-users Contributors"]
U3["fa:fa-users Creators"]
I1["fa:fa-floppy-disk Storage"]
I2["fa:fa-code API Gateway"]
O1["fa:fa-database Datastore"]
%% groups
subgraph G1["fa:fa-users Users"]
%%U1
U2
U3
end
subgraph G2["fa:fa-box Apps"]
end
subgraph G3["fa:fa-cloud Lexical.cloud"]
G4
G5
%%G6
end
subgraph G4["fa:fa-database Community Data"]
end
subgraph G5["fa:fa-cloud Backend"]
G7
G8
O1
end
%%subgraph G6["fa:fa-cloud Frontend"]
%%end
subgraph G7["Ingestion"]
I1
G7a
end
subgraph G7a["fa:fa-pipe-section State Machine"]
end
subgraph G8["API"]
I2
G8a
end
subgraph G8a["Endpoints"]
end
%% relationships
%%U1 -->|explore| G6
U2 -->|maintain| G4
U3 -->|develop| G2
G4 -->|populates| G7
%%G4 -->|populates| G6
G2 -->|leverage| G8
I1 -->|process| G7a
I2 -->|call| G8a
G7a -->|update| O1
G8a -->|query| O1
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke-dasharray:5
style G3 stroke-dasharray:5
style G4 stroke-dasharray:5
style G5 stroke:#30638E,stroke-dasharray:10,stroke-width:3px
%%style G6 stroke-dasharray:5
style G7 stroke-dasharray:5
style G8 stroke-dasharray:5
style O1 stroke:white
%% interactions
click G4 "#community-data"
%%click G6 "#frontend"
click O1 "#datastore"
click I1 "#storage"
click I2 "#api-gateway"
click G7a "#state-machine"
click G8a "#endpoints"
Frontend
DIAGRAM | DECISION LOG
Given Lexical.cloud
frontend
includes a website
when community data
populates the frontend
then consumers
can explore that content on the website
.
flowchart TD
%% entities
U1["fa:fa-users Consumers"]
U2["fa:fa-users Contributors"]
%%U3["fa:fa-users Creators"]
O1["fa:fa-globe Website"]
%% groups
subgraph G1["fa:fa-users Users"]
U1
U2
%%U3
end
%%subgraph G2["fa:fa-box Apps"]
%%end
subgraph G3["fa:fa-cloud Lexical.cloud"]
G4
%%G5
G6
end
subgraph G4["fa:fa-database Community Data"]
end
%%subgraph G5["fa:fa-cloud Backend"]
%%end
subgraph G6["fa:fa-cloud Frontend"]
O1
end
%% relationships
U1 -->|explore| O1
U2 -->|maintain| G4
%%U3 -->|develop| G2
%%G4 -->|populates| G5
G4 -->|populates| G6
%%G2 -->|leverage| G5
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke-dasharray:5
style G3 stroke-dasharray:5
style G6 stroke:#30638E,stroke-dasharray:10,stroke-width:3px
%% interactions
click G4 "#community-data"
click O1 "#website"
Components
Cloud Catalog
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given the cloud catalog
consist of the repository at lexical-cloud-docs
and lexical-cloud-docs
trigger the Github Action
on merge completion
when contributors
merge content into lexical-cloud-docs
then a Github Action
sends the catalog as input to static site generator
and a Github Action
sends the catalog as input to json generator
.
flowchart LR
%% entities
U1["fa:fa-users Contributors"]
C1["fab:fa-github lexical-cloud-docs"]
C2["fab:fa-github Github Action"]
%% groups
subgraph G1["fa:fa-table Cloud Catalog"]
C1
C2
end
subgraph G2["fa:fa-code Static Site Generator"]
end
subgraph G3["fa:fa-code JSON Generator"]
end
%% relationships
U1 -->|merge| C1
C1 -->|trigger| C2
C2 -->|input| G2
C2 -->|input| G3
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke:#30638E,stroke-width:3px
%% interactions
click C1 href "https://www.github.com/lexical-cloud/lexical-cloud-docs" _blank
click G2 "#static-site-generator"
click G3 "#json-generator"
TODO: Github Action
Static Site Generator
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given the static site generator
consist of the repository at lexical-cloud-docs-hugo
and lexical-cloud-docs-hugo
has a base theme of docsy
for hugo
when the cloud catalog
is input to lexical-cloud-docs-hugo
then lexical-cloud-docs-hugo
sends output to html content
.
flowchart LR
%% entities
C1["fab:fa-github lexical-cloud-docs-hugo"]
C2["fab:fa-github docsy"]
%% groups
subgraph G1["fa:fa-code Static Site Generator"]
C1
C2
end
subgraph G2["fa:fa-table Cloud Catalog"]
end
subgraph G3["fa:fa-code HTML Content"]
end
%% relationships
G2 -->|input| C1
C1 ---|base theme| C2
C1 -->|output| G3
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke:#30638E,stroke-width:3px
%% interactions
click C1 href "https://www.github.com/lexical-cloud/lexical-cloud-docs-hugo" _blank
click C2 href "https://www.github.com/lexical-cloud/docsy" _blank
click G2 "#cloud-catalog"
click G3 "#html-content"
HTML Content
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given the html content
consist of the repository at lexical-cloud.github.io
when the static site generator
sends output to lexical-cloud.github.io
then the website
will serve content at lexical-cloud.github.io
.
flowchart LR
%% entities
C1["fab:fa-github lexical-cloud.github.io"]
%% groups
subgraph G1["fa:fa-code HTML Content"]
C1
end
subgraph G2["fa:fa-code Static Site Generator"]
end
subgraph G3["fa:fa-globe Website"]
end
%% relationships
G2 -->|output| C1
G3 -->|serve| C1
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke:#30638E,stroke-width:3px
%% interactions
click C1 href "https://www.github.com/lexical-cloud/lexical-cloud.github.io" _blank
click G2 "#static-site-generator"
click G3 "#website"
Website
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given the website
is hosted on Github Pages
when consumers
explore the website
then Github Pages
serve the repository of HTML content
flowchart LR
%% entities
U1["fa:fa-users Consumers"]
C1["fab:fa-github Github Pages"]
%% groups
subgraph G1["fa:fa-globe Website"]
C1
end
subgraph G2["fa:fa-code HTML Content"]
end
%% relationships
U1 -->|explore| G1
C1 -->|serve| G2
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke:#30638E,stroke-width:3px
%% interactions
click C2 href "https://www.github.com/lexical-cloud/lexical-cloud.github.io" _blank
click G2 "#html-content"
JSON Generator
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given json generator
consist of the repository at lexical-cloud-data-hugo
and lexical-cloud-data-hugo
has a base theme
of docsy
for hugo
when the cloud catalog
is input to lexical-cloud-data-hugo
then lexical-cloud-data-hugo
sends output to lexical-cloud-data
.
flowchart LR
%% entities
C1["fab:fa-github lexical-cloud-data-hugo"]
C2["fab:fa-github docsy"]
%% groups
subgraph G1["fa:fa-code JSON Generator"]
C1
C2
end
subgraph G2["fa:fa-table Cloud Catalog"]
end
subgraph G3["fa:fa-code JSON Data"]
end
%% relationships
G2 -->|input| C1
C1 ---|base theme| C2
C1 -->|output| G3
%% styles
classDef clickable fill:#3176d9,color:white
classDef cluster fill:white
style G1 stroke:#30638E,stroke-width:3px
%% interactions
click C1 href "https://www.github.com/lexical-cloud/lexical-cloud-data-hugo" _blank
click C2 href "https://www.github.com/lexical-cloud/docsy" _blank
click G2 "#cloud-catalog"
click G3 "#json-data"
JSON Data
DIAGRAM | DECISION LOG | CODE REPOSITORY
Given the json data
consist of the repository at lexical-cloud-data
and lexical-cloud-data
has a Github Action
that executes on merge completion
when the json generator
sends output to lexical-cloud-data
then the Github action
fires an event to notify subscribers
.
flowchart LR
%% entities
C1["fab:fa-github lexical-cloud-data"]
C2["fab:fa-github Github Action"]
%% groups
subgraph G1["fa:fa-code JSON Generator"]
end
subgraph G2["fa:fa-code JSON Data"]
C1
C2
end
subgraph G3["fa:fa-envelope Subscribers"]
end
%% relationships
G1 -->|input| C1
C1 -->|trigger| C2
C2 -->|notify| G3
%% styles
classDef clickable fill:#3176d9,color:white
style G2 stroke:#30638E,stroke-width:3px
%% interactions
click C1 href "https://www.github.com/lexical-cloud/lexical-cloud-data" _blank
click G1 "#json-generator"
TODO: Github Action
API Gateway
TODO
Endpoints
TODO
Storage
TODO
State Machine
TODO
Datastore
TODO