···22//
33// For a full list of overridable settings, and general information on folder-specific settings,
44// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
55-{}
55+{
66+ "lsp": {
77+ "nil": {
88+ // or "nixd":
99+ "initialization_options": {
1010+ "formatting": {
1111+ "command": ["alejandra", "--quiet", "--"] // or ["nixfmt"]
1212+ }
1313+ }
1414+ }
1515+ }
1616+}
···22resolver = "2"
33# Note that we define member crates with a wildcard here and NOT with explicit
44# paths because the flake.nix is written in a way such that top-level members
55-# (`my-cli` and `my-server`) are built as different derivations which avoid being
55+# (`atpblog-cli` and `atpblog-server`) are built as different derivations which avoid being
66# rebuilt if the other package's sources change.
77members = ["crates/*"]
8899[workspace.package]
1010version = "0.1.0"
1111-edition = "2021"
1111+edition = "2024"
1212license = "MPL-2.0"
1313+authors = ["orual"]
13141415[workspace.metadata.crane]
1516name = "atpblog-workspace"
1717+1818+1919+[workspace.dependencies]
2020+2121+serde = { version = "1.0", features = ["derive"] }
2222+merde = { version = "10.0.6", features = ["full"] }
2323+facet = { version = "0.9.6", features = ["camino"] }
2424+2525+minijinja = { version = "2.9.0", default-features = false }
2626+minijinja-contrib = { version = "2.9.0", default-features = false }
2727+miette = { version = "7.5.0" }
2828+owo-colors = { version = "4.2.0" }
2929+thiserror = "2.0"
3030+syntect = "5.2.0"
3131+jane-eyre = "0.6.12"
3232+n0-future = "=0.1.2"
3333+tracing = { version = "0.1.41", default-features = false, features = ["std"] }
···11+{
22+ "lexicon": 1,
33+ "id": "sh.weaver.blog.post",
44+ "defs": {
55+ "main": {
66+ "type": "record",
77+ "description": "A blog entry",
88+ "key": "tid",
99+ "record": {
1010+ "type": "object",
1111+ "required": [
1212+ "content", "title", "createdAt"
1313+ ],
1414+ "properties": {
1515+ "title": { "type": "ref", "ref": "#title" },
1616+ "tags": { "type": "ref", "ref": "#tags" },
1717+1818+ "content": {
1919+ "type": "string",
2020+ "maxLength": 200000,
2121+ "description": "The content of the blog post. This should be some flavor of Markdown."
2222+ },
2323+2424+ "createdAt": {
2525+ "type": "ref",
2626+ "ref": "#createdAt"
2727+ },
2828+ "images": {
2929+ "type": "ref",
3030+ "ref": "sh.weaver.blog.embed.images",
3131+ "description": "The set of images, if any, embedded in the blog post."
3232+ },
3333+ }
3434+ }
3535+ },
3636+3737+ "createdAt": {
3838+ "type": "string",
3939+ "format": "datetime",
4040+ "description": "The date and time when the blog post was created. This is used for sorting and displaying the post's creation date."
4141+ },
4242+ "title": {
4343+ "type": "string",
4444+ "maxLength": 420,
4545+ "description": "The title of the blog post."
4646+ },
4747+ "tags": {
4848+ "type": "array",
4949+ "items": {
5050+ "type": "string",
5151+ "maxLength": 64
5252+ },
5353+ "maxLength": 10,
5454+ "description": "An array of tags associated with the blog post. Tags can help categorize and organize posts."
5555+ }
5656+ }
5757+}
+30
lexicons/sh.weaver.embed.defs.json
···11+{
22+ "lexicon": 1,
33+ "id": "sh.weaver.embed.defs",
44+ "defs": {
55+ "percentSize": {
66+ "type": "object",
77+ "required": ["width", "height"],
88+ "properties": {
99+ "width": { "type": "integer" },
1010+ "height": { "type": "integer" },
1111+ },
1212+ "description": "Proportional size of the embed relative to the viewport in larger windows. The dimensions are percentage out of 100. Could we use more granularity? Maybe, but come on."
1313+ },
1414+ "pixelSize": {
1515+ "type": "object",
1616+ "required": ["width", "height"],
1717+ "properties": {
1818+ "width": { "type": "integer" },
1919+ "height": { "type": "integer" },
2020+ },
2121+ "description": "Pixel-exact embed size. The dimensions are logical pixels, subject to scaling, so 200px at X2 scale is 400px."
2222+ },
2323+ "record": {
2424+2525+ },
2626+ "externa": {
2727+2828+ }
2929+ }
3030+ }
+19
lexicons/sh.weaver.embed.external.json
···11+{
22+ "lexicon": 1,
33+ "id": "sh.weaver.embed.records",
44+ "description": "A set of records embedded in a blog post.",
55+ "defs": {
66+ "main": {
77+ "type": "object",
88+ "required": ["records"],
99+ "properties": {
1010+ "images": {
1111+ "type": "array",
1212+ "items": { "type": "ref", "ref": "#sh.weaver.embed.defs#external" },
1313+ "maxLength": 48
1414+ }
1515+ }
1616+ },
1717+1818+ }
1919+ }
+46
lexicons/sh.weaver.embed.images.json
···11+{
22+ "lexicon": 1,
33+ "id": "sh.weaver.embed.images",
44+ "description": "A set of images embedded in a blog post.",
55+ "defs": {
66+ "main": {
77+ "type": "object",
88+ "required": ["images"],
99+ "properties": {
1010+ "images": {
1111+ "type": "array",
1212+ "items": { "type": "ref", "ref": "#image" },
1313+ "maxLength": 48
1414+ }
1515+ }
1616+ },
1717+ "image": {
1818+ "type": "object",
1919+ "required": ["image"],
2020+ "properties": {
2121+ "image": {
2222+ "type": "blob",
2323+ "accept": ["image/*"],
2424+ "maxSize": 3000000
2525+ },
2626+ "alt": {
2727+ "type": "string",
2828+ "description": "alt text description of the image"
2929+ },
3030+ "blurhash": {
3131+ "type": "string",
3232+ "maxLength": 32,
3333+ "description": "Blurhash string for the image, used for low-resolution placeholders. This must be a valid Blurhash string."
3434+ },
3535+ "dimensions": {
3636+ "type": "union",
3737+ "refs": [
3838+ "app.bsky.embed.defs#aspectRatio",
3939+ "sh.weaver.embed.defs#percentSize",
4040+ "sh.weaver.embed.defs#pixelSize"
4141+ ]
4242+ }
4343+ }
4444+ },
4545+ }
4646+ }
+19
lexicons/sh.weaver.embed.record.json
···11+{
22+ "lexicon": 1,
33+ "id": "computer.nonbinary.embed.records",
44+ "description": "A set of records embedded in a blog post.",
55+ "defs": {
66+ "main": {
77+ "type": "object",
88+ "required": ["records"],
99+ "properties": {
1010+ "images": {
1111+ "type": "array",
1212+ "items": { "type": "ref", "ref": "#computer.nonbinary.embed.defs#record" },
1313+ "maxLength": 48
1414+ }
1515+ }
1616+ },
1717+1818+ }
1919+ }