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 datapopulates 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