generated from localfirstfm/landscape-data-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata.js
112 lines (111 loc) · 2.98 KB
/
data.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// @ts-check
import { LandscapeSchema } from "@localfirstfm/landscape-schema";
export const data = LandscapeSchema.make({
Version: 1,
Id: "tinybase",
Name: "TinyBase",
Description: "A reactive data store & sync engine.",
Website: "https://tinybase.org",
GitHub: "https://github.com/tinyplex/tinybase",
Logo: {
Light: "https://tinybase.org/favicon.svg",
Dark: "https://tinybase.org/favicon.svg",
},
MaturityLevel: "Mature",
InitialReleaseDate: new Date("2022-01-17"),
Deployment: ["Self-hosted"],
License: "MIT",
NotableAdopters: [
{ Name: "Athena Crisis", URL: "https://athenacrisis.com" },
{ Name: "TinyHub", URL: "https://tinyhub.org" },
],
AppTarget: {
LanguageSDK: { data: ["TypeScript", "JavaScript"] },
Platform: {
data: ["Browser", "Node", "React Native", "Deno", "Cloudflare Workers"],
},
FrameworkIntegrations: {
data: ["React", "React Native"],
},
ClientBundleSize: {
data: "5.3kB - 11.5kB",
comment: "The clue is in the name!",
},
},
Networking: {
Protocol: {
data: ["WebSockets", "HTTP"],
},
Topology: {
data: "P2P via Relay Servers",
comment:
"Client-server is also made possible by an API that lets the server participate as a peer.",
},
},
ServerSideData: {
PersistenceMechanism: {
data: [
"Cloudflare Durable Object Storage",
"SQLite",
"Postgres",
"Custom",
],
},
DataSize: {
data: "Up to 5-10 MB per store",
comment:
"The server can also use a database like SQLite or Postgres for larger data.",
},
DataModelParadigm: {
data: "Relational",
comment: "Both relational and key-value data can be stored and synced.",
},
},
ClientSideData: {
QueryAPI: { data: ["Sync", "Reactive queries"] },
LocalRefreshLatency: { data: "~1ms" },
PersistenceMechanism: {
data: [
"SQLite",
"IndexedDB",
"PGLite via OPFS",
"SQLite",
"Yjs",
"Custom",
],
},
PersistenceFeatures: { data: "Indexes" },
DataModel: { data: "Document" },
OfflineReads: { data: "Full Support" },
OfflineWrites: { data: "Local conflict resolution" },
DataSize: { data: "Up to 5-10 MB per store" },
},
SynchronizationStrategy: {
FullOrPartialReplication: { data: ["Full Replication"] },
ConflictHandling: { data: "Automatic via CRDT" },
WhereResolutionOccurs: {
data: "Client",
comment: "Server can also resolve conflicts.",
},
WhatGetsSynced: {
data: {
ClientToServer: "Cell- or value-level changes",
ServerToClient: "Cell- or value-level changes",
ClientToClient: "Cell- or value-level changes",
},
},
},
UIRelated: {
Components: {
data: ["React", "ReactDom"],
},
},
DevelopmentWorkflowsDX: {
DebuggingTools: {
data: ["Data Inspector"],
},
TypeSupport: {
data: "TypeScript, inferred from Schemas",
},
},
});