···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.knot.listKeys
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ KnotListKeysNSID = "sh.tangled.knot.listKeys"
1515+)
1616+1717+// KnotListKeys_Output is the output of a sh.tangled.knot.listKeys call.
1818+type KnotListKeys_Output struct {
1919+ // cursor: Pagination cursor for next page
2020+ Cursor *string `json:"cursor,omitempty" cborgen:"cursor,omitempty"`
2121+ Keys []*KnotListKeys_PublicKey `json:"keys" cborgen:"keys"`
2222+}
2323+2424+// KnotListKeys_PublicKey is a "publicKey" in the sh.tangled.knot.listKeys schema.
2525+type KnotListKeys_PublicKey struct {
2626+ // createdAt: Key upload timestamp
2727+ CreatedAt string `json:"createdAt" cborgen:"createdAt"`
2828+ // did: DID associated with the public key
2929+ Did string `json:"did" cborgen:"did"`
3030+ // key: Public key contents
3131+ Key string `json:"key" cborgen:"key"`
3232+}
3333+3434+// KnotListKeys calls the XRPC method "sh.tangled.knot.listKeys".
3535+//
3636+// cursor: Pagination cursor
3737+// limit: Maximum number of keys to return
3838+func KnotListKeys(ctx context.Context, c util.LexClient, cursor string, limit int64) (*KnotListKeys_Output, error) {
3939+ var out KnotListKeys_Output
4040+4141+ params := map[string]interface{}{}
4242+ if cursor != "" {
4343+ params["cursor"] = cursor
4444+ }
4545+ if limit != 0 {
4646+ params["limit"] = limit
4747+ }
4848+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.listKeys", params, nil, &out); err != nil {
4949+ return nil, err
5050+ }
5151+5252+ return &out, nil
5353+}
+30
api/tangled/knotversion.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.knot.version
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ KnotVersionNSID = "sh.tangled.knot.version"
1515+)
1616+1717+// KnotVersion_Output is the output of a sh.tangled.knot.version call.
1818+type KnotVersion_Output struct {
1919+ Version string `json:"version" cborgen:"version"`
2020+}
2121+2222+// KnotVersion calls the XRPC method "sh.tangled.knot.version".
2323+func KnotVersion(ctx context.Context, c util.LexClient) (*KnotVersion_Output, error) {
2424+ var out KnotVersion_Output
2525+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.version", nil, nil, &out); err != nil {
2626+ return nil, err
2727+ }
2828+2929+ return &out, nil
3030+}
+42
api/tangled/labeldefinition.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.label.definition
66+77+import (
88+ "github.com/bluesky-social/indigo/lex/util"
99+)
1010+1111+const (
1212+ LabelDefinitionNSID = "sh.tangled.label.definition"
1313+)
1414+1515+func init() {
1616+ util.RegisterType("sh.tangled.label.definition", &LabelDefinition{})
1717+} //
1818+// RECORDTYPE: LabelDefinition
1919+type LabelDefinition struct {
2020+ LexiconTypeID string `json:"$type,const=sh.tangled.label.definition" cborgen:"$type,const=sh.tangled.label.definition"`
2121+ // color: The hex value for the background color for the label. Appviews may choose to respect this.
2222+ Color *string `json:"color,omitempty" cborgen:"color,omitempty"`
2323+ CreatedAt string `json:"createdAt" cborgen:"createdAt"`
2424+ // multiple: Whether this label can be repeated for a given entity, eg.: [reviewer:foo, reviewer:bar]
2525+ Multiple *bool `json:"multiple,omitempty" cborgen:"multiple,omitempty"`
2626+ // name: The display name of this label.
2727+ Name string `json:"name" cborgen:"name"`
2828+ // scope: The areas of the repo this label may apply to, eg.: sh.tangled.repo.issue. Appviews may choose to respect this.
2929+ Scope []string `json:"scope" cborgen:"scope"`
3030+ // valueType: The type definition of this label. Appviews may allow sorting for certain types.
3131+ ValueType *LabelDefinition_ValueType `json:"valueType" cborgen:"valueType"`
3232+}
3333+3434+// LabelDefinition_ValueType is a "valueType" in the sh.tangled.label.definition schema.
3535+type LabelDefinition_ValueType struct {
3636+ // enum: Closed set of values that this label can take.
3737+ Enum []string `json:"enum,omitempty" cborgen:"enum,omitempty"`
3838+ // format: An optional constraint that can be applied on string concrete types.
3939+ Format string `json:"format" cborgen:"format"`
4040+ // type: The concrete type of this label's value.
4141+ Type string `json:"type" cborgen:"type"`
4242+}
+34
api/tangled/labelop.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.label.op
66+77+import (
88+ "github.com/bluesky-social/indigo/lex/util"
99+)
1010+1111+const (
1212+ LabelOpNSID = "sh.tangled.label.op"
1313+)
1414+1515+func init() {
1616+ util.RegisterType("sh.tangled.label.op", &LabelOp{})
1717+} //
1818+// RECORDTYPE: LabelOp
1919+type LabelOp struct {
2020+ LexiconTypeID string `json:"$type,const=sh.tangled.label.op" cborgen:"$type,const=sh.tangled.label.op"`
2121+ Add []*LabelOp_Operand `json:"add" cborgen:"add"`
2222+ Delete []*LabelOp_Operand `json:"delete" cborgen:"delete"`
2323+ PerformedAt string `json:"performedAt" cborgen:"performedAt"`
2424+ // subject: The subject (task, pull or discussion) of this label. Appviews may apply a `scope` check and refuse this op.
2525+ Subject string `json:"subject" cborgen:"subject"`
2626+}
2727+2828+// LabelOp_Operand is a "operand" in the sh.tangled.label.op schema.
2929+type LabelOp_Operand struct {
3030+ // key: ATURI to the label definition
3131+ Key string `json:"key" cborgen:"key"`
3232+ // value: Stringified value of the label. This is first unstringed by appviews and then interpreted as a concrete value.
3333+ Value string `json:"value" cborgen:"value"`
3434+}
+41
api/tangled/repoarchive.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.archive
66+77+import (
88+ "bytes"
99+ "context"
1010+1111+ "github.com/bluesky-social/indigo/lex/util"
1212+)
1313+1414+const (
1515+ RepoArchiveNSID = "sh.tangled.repo.archive"
1616+)
1717+1818+// RepoArchive calls the XRPC method "sh.tangled.repo.archive".
1919+//
2020+// format: Archive format
2121+// prefix: Prefix for files in the archive
2222+// ref: Git reference (branch, tag, or commit SHA)
2323+// repo: Repository identifier in format 'did:plc:.../repoName'
2424+func RepoArchive(ctx context.Context, c util.LexClient, format string, prefix string, ref string, repo string) ([]byte, error) {
2525+ buf := new(bytes.Buffer)
2626+2727+ params := map[string]interface{}{}
2828+ if format != "" {
2929+ params["format"] = format
3030+ }
3131+ if prefix != "" {
3232+ params["prefix"] = prefix
3333+ }
3434+ params["ref"] = ref
3535+ params["repo"] = repo
3636+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.archive", params, nil, buf); err != nil {
3737+ return nil, err
3838+ }
3939+4040+ return buf.Bytes(), nil
4141+}
+80
api/tangled/repoblob.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.blob
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoBlobNSID = "sh.tangled.repo.blob"
1515+)
1616+1717+// RepoBlob_LastCommit is a "lastCommit" in the sh.tangled.repo.blob schema.
1818+type RepoBlob_LastCommit struct {
1919+ Author *RepoBlob_Signature `json:"author,omitempty" cborgen:"author,omitempty"`
2020+ // hash: Commit hash
2121+ Hash string `json:"hash" cborgen:"hash"`
2222+ // message: Commit message
2323+ Message string `json:"message" cborgen:"message"`
2424+ // shortHash: Short commit hash
2525+ ShortHash *string `json:"shortHash,omitempty" cborgen:"shortHash,omitempty"`
2626+ // when: Commit timestamp
2727+ When string `json:"when" cborgen:"when"`
2828+}
2929+3030+// RepoBlob_Output is the output of a sh.tangled.repo.blob call.
3131+type RepoBlob_Output struct {
3232+ // content: File content (base64 encoded for binary files)
3333+ Content string `json:"content" cborgen:"content"`
3434+ // encoding: Content encoding
3535+ Encoding *string `json:"encoding,omitempty" cborgen:"encoding,omitempty"`
3636+ // isBinary: Whether the file is binary
3737+ IsBinary *bool `json:"isBinary,omitempty" cborgen:"isBinary,omitempty"`
3838+ LastCommit *RepoBlob_LastCommit `json:"lastCommit,omitempty" cborgen:"lastCommit,omitempty"`
3939+ // mimeType: MIME type of the file
4040+ MimeType *string `json:"mimeType,omitempty" cborgen:"mimeType,omitempty"`
4141+ // path: The file path
4242+ Path string `json:"path" cborgen:"path"`
4343+ // ref: The git reference used
4444+ Ref string `json:"ref" cborgen:"ref"`
4545+ // size: File size in bytes
4646+ Size *int64 `json:"size,omitempty" cborgen:"size,omitempty"`
4747+}
4848+4949+// RepoBlob_Signature is a "signature" in the sh.tangled.repo.blob schema.
5050+type RepoBlob_Signature struct {
5151+ // email: Author email
5252+ Email string `json:"email" cborgen:"email"`
5353+ // name: Author name
5454+ Name string `json:"name" cborgen:"name"`
5555+ // when: Author timestamp
5656+ When string `json:"when" cborgen:"when"`
5757+}
5858+5959+// RepoBlob calls the XRPC method "sh.tangled.repo.blob".
6060+//
6161+// path: Path to the file within the repository
6262+// raw: Return raw file content instead of JSON response
6363+// ref: Git reference (branch, tag, or commit SHA)
6464+// repo: Repository identifier in format 'did:plc:.../repoName'
6565+func RepoBlob(ctx context.Context, c util.LexClient, path string, raw bool, ref string, repo string) (*RepoBlob_Output, error) {
6666+ var out RepoBlob_Output
6767+6868+ params := map[string]interface{}{}
6969+ params["path"] = path
7070+ if raw {
7171+ params["raw"] = raw
7272+ }
7373+ params["ref"] = ref
7474+ params["repo"] = repo
7575+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.blob", params, nil, &out); err != nil {
7676+ return nil, err
7777+ }
7878+7979+ return &out, nil
8080+}
+59
api/tangled/repobranch.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.branch
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoBranchNSID = "sh.tangled.repo.branch"
1515+)
1616+1717+// RepoBranch_Output is the output of a sh.tangled.repo.branch call.
1818+type RepoBranch_Output struct {
1919+ Author *RepoBranch_Signature `json:"author,omitempty" cborgen:"author,omitempty"`
2020+ // hash: Latest commit hash on this branch
2121+ Hash string `json:"hash" cborgen:"hash"`
2222+ // isDefault: Whether this is the default branch
2323+ IsDefault *bool `json:"isDefault,omitempty" cborgen:"isDefault,omitempty"`
2424+ // message: Latest commit message
2525+ Message *string `json:"message,omitempty" cborgen:"message,omitempty"`
2626+ // name: Branch name
2727+ Name string `json:"name" cborgen:"name"`
2828+ // shortHash: Short commit hash
2929+ ShortHash *string `json:"shortHash,omitempty" cborgen:"shortHash,omitempty"`
3030+ // when: Timestamp of latest commit
3131+ When string `json:"when" cborgen:"when"`
3232+}
3333+3434+// RepoBranch_Signature is a "signature" in the sh.tangled.repo.branch schema.
3535+type RepoBranch_Signature struct {
3636+ // email: Author email
3737+ Email string `json:"email" cborgen:"email"`
3838+ // name: Author name
3939+ Name string `json:"name" cborgen:"name"`
4040+ // when: Author timestamp
4141+ When string `json:"when" cborgen:"when"`
4242+}
4343+4444+// RepoBranch calls the XRPC method "sh.tangled.repo.branch".
4545+//
4646+// name: Branch name to get information for
4747+// repo: Repository identifier in format 'did:plc:.../repoName'
4848+func RepoBranch(ctx context.Context, c util.LexClient, name string, repo string) (*RepoBranch_Output, error) {
4949+ var out RepoBranch_Output
5050+5151+ params := map[string]interface{}{}
5252+ params["name"] = name
5353+ params["repo"] = repo
5454+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.branch", params, nil, &out); err != nil {
5555+ return nil, err
5656+ }
5757+5858+ return &out, nil
5959+}
+39
api/tangled/repobranches.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.branches
66+77+import (
88+ "bytes"
99+ "context"
1010+1111+ "github.com/bluesky-social/indigo/lex/util"
1212+)
1313+1414+const (
1515+ RepoBranchesNSID = "sh.tangled.repo.branches"
1616+)
1717+1818+// RepoBranches calls the XRPC method "sh.tangled.repo.branches".
1919+//
2020+// cursor: Pagination cursor
2121+// limit: Maximum number of branches to return
2222+// repo: Repository identifier in format 'did:plc:.../repoName'
2323+func RepoBranches(ctx context.Context, c util.LexClient, cursor string, limit int64, repo string) ([]byte, error) {
2424+ buf := new(bytes.Buffer)
2525+2626+ params := map[string]interface{}{}
2727+ if cursor != "" {
2828+ params["cursor"] = cursor
2929+ }
3030+ if limit != 0 {
3131+ params["limit"] = limit
3232+ }
3333+ params["repo"] = repo
3434+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.branches", params, nil, buf); err != nil {
3535+ return nil, err
3636+ }
3737+3838+ return buf.Bytes(), nil
3939+}
+35
api/tangled/repocompare.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.compare
66+77+import (
88+ "bytes"
99+ "context"
1010+1111+ "github.com/bluesky-social/indigo/lex/util"
1212+)
1313+1414+const (
1515+ RepoCompareNSID = "sh.tangled.repo.compare"
1616+)
1717+1818+// RepoCompare calls the XRPC method "sh.tangled.repo.compare".
1919+//
2020+// repo: Repository identifier in format 'did:plc:.../repoName'
2121+// rev1: First revision (commit, branch, or tag)
2222+// rev2: Second revision (commit, branch, or tag)
2323+func RepoCompare(ctx context.Context, c util.LexClient, repo string, rev1 string, rev2 string) ([]byte, error) {
2424+ buf := new(bytes.Buffer)
2525+2626+ params := map[string]interface{}{}
2727+ params["repo"] = repo
2828+ params["rev1"] = rev1
2929+ params["rev2"] = rev2
3030+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.compare", params, nil, buf); err != nil {
3131+ return nil, err
3232+ }
3333+3434+ return buf.Bytes(), nil
3535+}
+30
api/tangled/repodeleteBranch.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.deleteBranch
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoDeleteBranchNSID = "sh.tangled.repo.deleteBranch"
1515+)
1616+1717+// RepoDeleteBranch_Input is the input argument to a sh.tangled.repo.deleteBranch call.
1818+type RepoDeleteBranch_Input struct {
1919+ Branch string `json:"branch" cborgen:"branch"`
2020+ Repo string `json:"repo" cborgen:"repo"`
2121+}
2222+2323+// RepoDeleteBranch calls the XRPC method "sh.tangled.repo.deleteBranch".
2424+func RepoDeleteBranch(ctx context.Context, c util.LexClient, input *RepoDeleteBranch_Input) error {
2525+ if err := c.LexDo(ctx, util.Procedure, "application/json", "sh.tangled.repo.deleteBranch", nil, input, nil); err != nil {
2626+ return err
2727+ }
2828+2929+ return nil
3030+}
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.getDefaultBranch
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoGetDefaultBranchNSID = "sh.tangled.repo.getDefaultBranch"
1515+)
1616+1717+// RepoGetDefaultBranch_Output is the output of a sh.tangled.repo.getDefaultBranch call.
1818+type RepoGetDefaultBranch_Output struct {
1919+ Author *RepoGetDefaultBranch_Signature `json:"author,omitempty" cborgen:"author,omitempty"`
2020+ // hash: Latest commit hash on default branch
2121+ Hash string `json:"hash" cborgen:"hash"`
2222+ // message: Latest commit message
2323+ Message *string `json:"message,omitempty" cborgen:"message,omitempty"`
2424+ // name: Default branch name
2525+ Name string `json:"name" cborgen:"name"`
2626+ // shortHash: Short commit hash
2727+ ShortHash *string `json:"shortHash,omitempty" cborgen:"shortHash,omitempty"`
2828+ // when: Timestamp of latest commit
2929+ When string `json:"when" cborgen:"when"`
3030+}
3131+3232+// RepoGetDefaultBranch_Signature is a "signature" in the sh.tangled.repo.getDefaultBranch schema.
3333+type RepoGetDefaultBranch_Signature struct {
3434+ // email: Author email
3535+ Email string `json:"email" cborgen:"email"`
3636+ // name: Author name
3737+ Name string `json:"name" cborgen:"name"`
3838+ // when: Author timestamp
3939+ When string `json:"when" cborgen:"when"`
4040+}
4141+4242+// RepoGetDefaultBranch calls the XRPC method "sh.tangled.repo.getDefaultBranch".
4343+//
4444+// repo: Repository identifier in format 'did:plc:.../repoName'
4545+func RepoGetDefaultBranch(ctx context.Context, c util.LexClient, repo string) (*RepoGetDefaultBranch_Output, error) {
4646+ var out RepoGetDefaultBranch_Output
4747+4848+ params := map[string]interface{}{}
4949+ params["repo"] = repo
5050+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.getDefaultBranch", params, nil, &out); err != nil {
5151+ return nil, err
5252+ }
5353+5454+ return &out, nil
5555+}
+61
api/tangled/repolanguages.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.languages
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoLanguagesNSID = "sh.tangled.repo.languages"
1515+)
1616+1717+// RepoLanguages_Language is a "language" in the sh.tangled.repo.languages schema.
1818+type RepoLanguages_Language struct {
1919+ // color: Hex color code for this language
2020+ Color *string `json:"color,omitempty" cborgen:"color,omitempty"`
2121+ // extensions: File extensions associated with this language
2222+ Extensions []string `json:"extensions,omitempty" cborgen:"extensions,omitempty"`
2323+ // fileCount: Number of files in this language
2424+ FileCount *int64 `json:"fileCount,omitempty" cborgen:"fileCount,omitempty"`
2525+ // name: Programming language name
2626+ Name string `json:"name" cborgen:"name"`
2727+ // percentage: Percentage of total codebase (0-100)
2828+ Percentage int64 `json:"percentage" cborgen:"percentage"`
2929+ // size: Total size of files in this language (bytes)
3030+ Size int64 `json:"size" cborgen:"size"`
3131+}
3232+3333+// RepoLanguages_Output is the output of a sh.tangled.repo.languages call.
3434+type RepoLanguages_Output struct {
3535+ Languages []*RepoLanguages_Language `json:"languages" cborgen:"languages"`
3636+ // ref: The git reference used
3737+ Ref string `json:"ref" cborgen:"ref"`
3838+ // totalFiles: Total number of files analyzed
3939+ TotalFiles *int64 `json:"totalFiles,omitempty" cborgen:"totalFiles,omitempty"`
4040+ // totalSize: Total size of all analyzed files in bytes
4141+ TotalSize *int64 `json:"totalSize,omitempty" cborgen:"totalSize,omitempty"`
4242+}
4343+4444+// RepoLanguages calls the XRPC method "sh.tangled.repo.languages".
4545+//
4646+// ref: Git reference (branch, tag, or commit SHA)
4747+// repo: Repository identifier in format 'did:plc:.../repoName'
4848+func RepoLanguages(ctx context.Context, c util.LexClient, ref string, repo string) (*RepoLanguages_Output, error) {
4949+ var out RepoLanguages_Output
5050+5151+ params := map[string]interface{}{}
5252+ if ref != "" {
5353+ params["ref"] = ref
5454+ }
5555+ params["repo"] = repo
5656+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.languages", params, nil, &out); err != nil {
5757+ return nil, err
5858+ }
5959+6060+ return &out, nil
6161+}
+45
api/tangled/repolog.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.log
66+77+import (
88+ "bytes"
99+ "context"
1010+1111+ "github.com/bluesky-social/indigo/lex/util"
1212+)
1313+1414+const (
1515+ RepoLogNSID = "sh.tangled.repo.log"
1616+)
1717+1818+// RepoLog calls the XRPC method "sh.tangled.repo.log".
1919+//
2020+// cursor: Pagination cursor (commit SHA)
2121+// limit: Maximum number of commits to return
2222+// path: Path to filter commits by
2323+// ref: Git reference (branch, tag, or commit SHA)
2424+// repo: Repository identifier in format 'did:plc:.../repoName'
2525+func RepoLog(ctx context.Context, c util.LexClient, cursor string, limit int64, path string, ref string, repo string) ([]byte, error) {
2626+ buf := new(bytes.Buffer)
2727+2828+ params := map[string]interface{}{}
2929+ if cursor != "" {
3030+ params["cursor"] = cursor
3131+ }
3232+ if limit != 0 {
3333+ params["limit"] = limit
3434+ }
3535+ if path != "" {
3636+ params["path"] = path
3737+ }
3838+ params["ref"] = ref
3939+ params["repo"] = repo
4040+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.log", params, nil, buf); err != nil {
4141+ return nil, err
4242+ }
4343+4444+ return buf.Bytes(), nil
4545+}
+39
api/tangled/repotags.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.tags
66+77+import (
88+ "bytes"
99+ "context"
1010+1111+ "github.com/bluesky-social/indigo/lex/util"
1212+)
1313+1414+const (
1515+ RepoTagsNSID = "sh.tangled.repo.tags"
1616+)
1717+1818+// RepoTags calls the XRPC method "sh.tangled.repo.tags".
1919+//
2020+// cursor: Pagination cursor
2121+// limit: Maximum number of tags to return
2222+// repo: Repository identifier in format 'did:plc:.../repoName'
2323+func RepoTags(ctx context.Context, c util.LexClient, cursor string, limit int64, repo string) ([]byte, error) {
2424+ buf := new(bytes.Buffer)
2525+2626+ params := map[string]interface{}{}
2727+ if cursor != "" {
2828+ params["cursor"] = cursor
2929+ }
3030+ if limit != 0 {
3131+ params["limit"] = limit
3232+ }
3333+ params["repo"] = repo
3434+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.tags", params, nil, buf); err != nil {
3535+ return nil, err
3636+ }
3737+3838+ return buf.Bytes(), nil
3939+}
+82
api/tangled/repotree.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.repo.tree
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ RepoTreeNSID = "sh.tangled.repo.tree"
1515+)
1616+1717+// RepoTree_LastCommit is a "lastCommit" in the sh.tangled.repo.tree schema.
1818+type RepoTree_LastCommit struct {
1919+ // hash: Commit hash
2020+ Hash string `json:"hash" cborgen:"hash"`
2121+ // message: Commit message
2222+ Message string `json:"message" cborgen:"message"`
2323+ // when: Commit timestamp
2424+ When string `json:"when" cborgen:"when"`
2525+}
2626+2727+// RepoTree_Output is the output of a sh.tangled.repo.tree call.
2828+type RepoTree_Output struct {
2929+ // dotdot: Parent directory path
3030+ Dotdot *string `json:"dotdot,omitempty" cborgen:"dotdot,omitempty"`
3131+ Files []*RepoTree_TreeEntry `json:"files" cborgen:"files"`
3232+ // parent: The parent path in the tree
3333+ Parent *string `json:"parent,omitempty" cborgen:"parent,omitempty"`
3434+ // readme: Readme for this file tree
3535+ Readme *RepoTree_Readme `json:"readme,omitempty" cborgen:"readme,omitempty"`
3636+ // ref: The git reference used
3737+ Ref string `json:"ref" cborgen:"ref"`
3838+}
3939+4040+// RepoTree_Readme is a "readme" in the sh.tangled.repo.tree schema.
4141+type RepoTree_Readme struct {
4242+ // contents: Contents of the readme file
4343+ Contents string `json:"contents" cborgen:"contents"`
4444+ // filename: Name of the readme file
4545+ Filename string `json:"filename" cborgen:"filename"`
4646+}
4747+4848+// RepoTree_TreeEntry is a "treeEntry" in the sh.tangled.repo.tree schema.
4949+type RepoTree_TreeEntry struct {
5050+ // is_file: Whether this entry is a file
5151+ Is_file bool `json:"is_file" cborgen:"is_file"`
5252+ // is_subtree: Whether this entry is a directory/subtree
5353+ Is_subtree bool `json:"is_subtree" cborgen:"is_subtree"`
5454+ Last_commit *RepoTree_LastCommit `json:"last_commit,omitempty" cborgen:"last_commit,omitempty"`
5555+ // mode: File mode
5656+ Mode string `json:"mode" cborgen:"mode"`
5757+ // name: Relative file or directory name
5858+ Name string `json:"name" cborgen:"name"`
5959+ // size: File size in bytes
6060+ Size int64 `json:"size" cborgen:"size"`
6161+}
6262+6363+// RepoTree calls the XRPC method "sh.tangled.repo.tree".
6464+//
6565+// path: Path within the repository tree
6666+// ref: Git reference (branch, tag, or commit SHA)
6767+// repo: Repository identifier in format 'did:plc:.../repoName'
6868+func RepoTree(ctx context.Context, c util.LexClient, path string, ref string, repo string) (*RepoTree_Output, error) {
6969+ var out RepoTree_Output
7070+7171+ params := map[string]interface{}{}
7272+ if path != "" {
7373+ params["path"] = path
7474+ }
7575+ params["ref"] = ref
7676+ params["repo"] = repo
7777+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.repo.tree", params, nil, &out); err != nil {
7878+ return nil, err
7979+ }
8080+8181+ return &out, nil
8282+}
+30
api/tangled/tangledowner.go
···11+// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.
22+33+package tangled
44+55+// schema: sh.tangled.owner
66+77+import (
88+ "context"
99+1010+ "github.com/bluesky-social/indigo/lex/util"
1111+)
1212+1313+const (
1414+ OwnerNSID = "sh.tangled.owner"
1515+)
1616+1717+// Owner_Output is the output of a sh.tangled.owner call.
1818+type Owner_Output struct {
1919+ Owner string `json:"owner" cborgen:"owner"`
2020+}
2121+2222+// Owner calls the XRPC method "sh.tangled.owner".
2323+func Owner(ctx context.Context, c util.LexClient) (*Owner_Output, error) {
2424+ var out Owner_Output
2525+ if err := c.LexDo(ctx, util.Query, "", "sh.tangled.owner", nil, nil, &out); err != nil {
2626+ return nil, err
2727+ }
2828+2929+ return &out, nil
3030+}
+3-2
api/tangled/tangledrepo.go
···2222 Description *string `json:"description,omitempty" cborgen:"description,omitempty"`
2323 // knot: knot where the repo was created
2424 Knot string `json:"knot" cborgen:"knot"`
2525+ // labels: List of labels that this repo subscribes to
2626+ Labels []string `json:"labels,omitempty" cborgen:"labels,omitempty"`
2527 // name: name of the repo
2626- Name string `json:"name" cborgen:"name"`
2727- Owner string `json:"owner" cborgen:"owner"`
2828+ Name string `json:"name" cborgen:"name"`
2829 // source: source of the repo
2930 Source *string `json:"source,omitempty" cborgen:"source,omitempty"`
3031 // spindle: CI runner to send jobs to and receive results from
···11+package models
22+33+import (
44+ "time"
55+66+ "github.com/bluesky-social/indigo/atproto/syntax"
77+)
88+99+type Spindle struct {
1010+ Id int
1111+ Owner syntax.DID
1212+ Instance string
1313+ Verified *time.Time
1414+ Created time.Time
1515+ NeedsUpgrade bool
1616+}
1717+1818+type SpindleMember struct {
1919+ Id int
2020+ Did syntax.DID // owner of the record
2121+ Rkey string // rkey of the record
2222+ Instance string
2323+ Subject syntax.DID // the member being added
2424+ Created time.Time
2525+}
+17
appview/models/star.go
···11+package models
22+33+import (
44+ "time"
55+66+ "github.com/bluesky-social/indigo/atproto/syntax"
77+)
88+99+type Star struct {
1010+ StarredByDid string
1111+ RepoAt syntax.ATURI
1212+ Created time.Time
1313+ Rkey string
1414+1515+ // optionally, populate this when querying for reverse mappings
1616+ Repo *Repo
1717+}
···11+package pages
22+33+import (
44+ "html/template"
55+ "tangled.org/core/appview/config"
66+ "tangled.org/core/idresolver"
77+ "testing"
88+)
99+1010+func TestPages_funcMap(t *testing.T) {
1111+ tests := []struct {
1212+ name string // description of this test case
1313+ // Named input parameters for receiver constructor.
1414+ config *config.Config
1515+ res *idresolver.Resolver
1616+ want template.FuncMap
1717+ }{
1818+ // TODO: Add test cases.
1919+ }
2020+ for _, tt := range tests {
2121+ t.Run(tt.name, func(t *testing.T) {
2222+ p := NewPages(tt.config, tt.res)
2323+ got := p.funcMap()
2424+ // TODO: update the condition below to compare got with tt.want.
2525+ if true {
2626+ t.Errorf("funcMap() = %v, want %v", got, tt.want)
2727+ }
2828+ })
2929+ }
3030+}
+156
appview/pages/legal/privacy.md
···11+**Last updated:** September 26, 2025
22+33+This Privacy Policy describes how Tangled ("we," "us," or "our")
44+collects, uses, and shares your personal information when you use our
55+platform and services (the "Service").
66+77+## 1. Information We Collect
88+99+### Account Information
1010+1111+When you create an account, we collect:
1212+1313+- Your chosen username
1414+- Email address
1515+- Profile information you choose to provide
1616+- Authentication data
1717+1818+### Content and Activity
1919+2020+We store:
2121+2222+- Code repositories and associated metadata
2323+- Issues, pull requests, and comments
2424+- Activity logs and usage patterns
2525+- Public keys for authentication
2626+2727+## 2. Data Location and Hosting
2828+2929+### EU Data Hosting
3030+3131+**All Tangled service data is hosted within the European Union.**
3232+Specifically:
3333+3434+- **Personal Data Servers (PDS):** Accounts hosted on Tangled PDS
3535+ (*.tngl.sh) are located in Finland
3636+- **Application Data:** All other service data is stored on EU-based
3737+ servers
3838+- **Data Processing:** All data processing occurs within EU
3939+ jurisdiction
4040+4141+### External PDS Notice
4242+4343+**Important:** If your account is hosted on Bluesky's PDS or other
4444+self-hosted Personal Data Servers (not *.tngl.sh), we do not control
4545+that data. The data protection, storage location, and privacy
4646+practices for such accounts are governed by the respective PDS
4747+provider's policies, not this Privacy Policy. We only control data
4848+processing within our own services and infrastructure.
4949+5050+## 3. Third-Party Data Processors
5151+5252+We only share your data with the following third-party processors:
5353+5454+### Resend (Email Services)
5555+5656+- **Purpose:** Sending transactional emails (account verification,
5757+ notifications)
5858+- **Data Shared:** Email address and necessary message content
5959+6060+### Cloudflare (Image Caching)
6161+6262+- **Purpose:** Caching and optimizing image delivery
6363+- **Data Shared:** Public images and associated metadata for caching
6464+ purposes
6565+6666+### Posthog (Usage Metrics Tracking)
6767+6868+- **Purpose:** Tracking usage and platform metrics
6969+- **Data Shared:** Anonymous usage data, IP addresses, DIDs, and browser
7070+ information
7171+7272+## 4. How We Use Your Information
7373+7474+We use your information to:
7575+7676+- Provide and maintain the Service
7777+- Process your transactions and requests
7878+- Send you technical notices and support messages
7979+- Improve and develop new features
8080+- Ensure security and prevent fraud
8181+- Comply with legal obligations
8282+8383+## 5. Data Sharing and Disclosure
8484+8585+We do not sell, trade, or rent your personal information. We may share
8686+your information only in the following circumstances:
8787+8888+- With the third-party processors listed above
8989+- When required by law or legal process
9090+- To protect our rights, property, or safety, or that of our users
9191+- In connection with a merger, acquisition, or sale of assets (with
9292+ appropriate protections)
9393+9494+## 6. Data Security
9595+9696+We implement appropriate technical and organizational measures to
9797+protect your personal information against unauthorized access,
9898+alteration, disclosure, or destruction. However, no method of
9999+transmission over the Internet is 100% secure.
100100+101101+## 7. Data Retention
102102+103103+We retain your personal information for as long as necessary to provide
104104+the Service and fulfill the purposes outlined in this Privacy Policy,
105105+unless a longer retention period is required by law.
106106+107107+## 8. Your Rights
108108+109109+Under applicable data protection laws, you have the right to:
110110+111111+- Access your personal information
112112+- Correct inaccurate information
113113+- Request deletion of your information
114114+- Object to processing of your information
115115+- Data portability
116116+- Withdraw consent (where applicable)
117117+118118+## 9. Cookies and Tracking
119119+120120+We use cookies and similar technologies to:
121121+122122+- Maintain your login session
123123+- Remember your preferences
124124+- Analyze usage patterns to improve the Service
125125+126126+You can control cookie settings through your browser preferences.
127127+128128+## 10. Children's Privacy
129129+130130+The Service is not intended for children under 16 years of age. We do
131131+not knowingly collect personal information from children under 16. If
132132+we become aware that we have collected such information, we will take
133133+steps to delete it.
134134+135135+## 11. International Data Transfers
136136+137137+While all our primary data processing occurs within the EU, some of our
138138+third-party processors may process data outside the EU. When this
139139+occurs, we ensure appropriate safeguards are in place, such as Standard
140140+Contractual Clauses or adequacy decisions.
141141+142142+## 12. Changes to This Privacy Policy
143143+144144+We may update this Privacy Policy from time to time. We will notify you
145145+of any changes by posting the new Privacy Policy on this page and
146146+updating the "Last updated" date.
147147+148148+## 13. Contact Information
149149+150150+If you have any questions about this Privacy Policy or wish to exercise
151151+your rights, please contact us through our platform or via email.
152152+153153+---
154154+155155+This Privacy Policy complies with the EU General Data Protection
156156+Regulation (GDPR) and other applicable data protection laws.
+107
appview/pages/legal/terms.md
···11+**Last updated:** September 26, 2025
22+33+Welcome to Tangled. These Terms of Service ("Terms") govern your access
44+to and use of the Tangled platform and services (the "Service")
55+operated by us ("Tangled," "we," "us," or "our").
66+77+## 1. Acceptance of Terms
88+99+By accessing or using our Service, you agree to be bound by these Terms.
1010+If you disagree with any part of these terms, then you may not access
1111+the Service.
1212+1313+## 2. Account Registration
1414+1515+To use certain features of the Service, you must register for an
1616+account. You agree to provide accurate, current, and complete
1717+information during the registration process and to update such
1818+information to keep it accurate, current, and complete.
1919+2020+## 3. Account Termination
2121+2222+> **Important Notice**
2323+>
2424+> **We reserve the right to terminate, suspend, or restrict access to
2525+> your account at any time, for any reason, or for no reason at all, at
2626+> our sole discretion.** This includes, but is not limited to,
2727+> termination for violation of these Terms, inappropriate conduct, spam,
2828+> abuse, or any other behavior we deem harmful to the Service or other
2929+> users.
3030+>
3131+> Account termination may result in the loss of access to your
3232+> repositories, data, and other content associated with your account. We
3333+> are not obligated to provide advance notice of termination, though we
3434+> may do so in our discretion.
3535+3636+## 4. Acceptable Use
3737+3838+You agree not to use the Service to:
3939+4040+- Violate any applicable laws or regulations
4141+- Infringe upon the rights of others
4242+- Upload, store, or share content that is illegal, harmful, threatening,
4343+ abusive, harassing, defamatory, vulgar, obscene, or otherwise
4444+ objectionable
4545+- Engage in spam, phishing, or other deceptive practices
4646+- Attempt to gain unauthorized access to the Service or other users'
4747+ accounts
4848+- Interfere with or disrupt the Service or servers connected to the
4949+ Service
5050+5151+## 5. Content and Intellectual Property
5252+5353+You retain ownership of the content you upload to the Service. By
5454+uploading content, you grant us a non-exclusive, worldwide, royalty-free
5555+license to use, reproduce, modify, and distribute your content as
5656+necessary to provide the Service.
5757+5858+## 6. Privacy
5959+6060+Your privacy is important to us. Please review our [Privacy
6161+Policy](/privacy), which also governs your use of the Service.
6262+6363+## 7. Disclaimers
6464+6565+The Service is provided on an "AS IS" and "AS AVAILABLE" basis. We make
6666+no warranties, expressed or implied, and hereby disclaim and negate all
6767+other warranties including without limitation, implied warranties or
6868+conditions of merchantability, fitness for a particular purpose, or
6969+non-infringement of intellectual property or other violation of rights.
7070+7171+## 8. Limitation of Liability
7272+7373+In no event shall Tangled, nor its directors, employees, partners,
7474+agents, suppliers, or affiliates, be liable for any indirect,
7575+incidental, special, consequential, or punitive damages, including
7676+without limitation, loss of profits, data, use, goodwill, or other
7777+intangible losses, resulting from your use of the Service.
7878+7979+## 9. Indemnification
8080+8181+You agree to defend, indemnify, and hold harmless Tangled and its
8282+affiliates, officers, directors, employees, and agents from and against
8383+any and all claims, damages, obligations, losses, liabilities, costs,
8484+or debt, and expenses (including attorney's fees).
8585+8686+## 10. Governing Law
8787+8888+These Terms shall be interpreted and governed by the laws of Finland,
8989+without regard to its conflict of law provisions.
9090+9191+## 11. Changes to Terms
9292+9393+We reserve the right to modify or replace these Terms at any time. If a
9494+revision is material, we will try to provide at least 30 days notice
9595+prior to any new terms taking effect.
9696+9797+## 12. Contact Information
9898+9999+If you have any questions about these Terms of Service, please contact
100100+us through our platform or via email.
101101+102102+---
103103+104104+These terms are effective as of the last updated date shown above and
105105+will remain in effect except with respect to any changes in their
106106+provisions in the future, which will be in effect immediately after
107107+being posted on this page.
+17-7
appview/pages/markup/format.go
···11package markup
2233-import "strings"
33+import (
44+ "regexp"
55+)
4657type Format string
68···1012)
11131214var FileTypes map[Format][]string = map[Format][]string{
1313- FormatMarkdown: []string{".md", ".markdown", ".mdown", ".mkdn", ".mkd"},
1515+ FormatMarkdown: {".md", ".markdown", ".mdown", ".mkdn", ".mkd"},
1616+}
1717+1818+var FileTypePatterns = map[Format]*regexp.Regexp{
1919+ FormatMarkdown: regexp.MustCompile(`(?i)\.(md|markdown|mdown|mkdn|mkd)$`),
2020+}
2121+2222+var ReadmePattern = regexp.MustCompile(`(?i)^readme(\.(md|markdown|txt))?$`)
2323+2424+func IsReadmeFile(filename string) bool {
2525+ return ReadmePattern.MatchString(filename)
1426}
15271628func GetFormat(filename string) Format {
1717- for format, extensions := range FileTypes {
1818- for _, extension := range extensions {
1919- if strings.HasSuffix(filename, extension) {
2020- return format
2121- }
2929+ for format, pattern := range FileTypePatterns {
3030+ if pattern.MatchString(filename) {
3131+ return format
2232 }
2333 }
2434 // default format
···11+{{ define "banner" }}
22+<div class="flex items-center justify-center mx-auto w-full bg-red-100 dark:bg-red-900 border border-red-200 dark:border-red-800 rounded-b drop-shadow-sm text-red-800 dark:text-red-200">
33+ <details class="group p-2">
44+ <summary class="list-none cursor-pointer">
55+ <div class="flex gap-4 items-center">
66+ <span class="group-open:hidden inline">{{ i "triangle-alert" "w-4 h-4" }}</span>
77+ <span class="hidden group-open:inline">{{ i "x" "w-4 h-4" }}</span>
88+99+ <span class="group-open:hidden inline">Some services that you administer require an update. Click to show more.</span>
1010+ <span class="hidden group-open:inline">Some services that you administer will have to be updated to be compatible with Tangled.</span>
1111+ </div>
1212+ </summary>
1313+1414+ {{ if .Registrations }}
1515+ <ul class="list-disc mx-12 my-2">
1616+ {{range .Registrations}}
1717+ <li>Knot: {{ .Domain }}</li>
1818+ {{ end }}
1919+ </ul>
2020+ {{ end }}
2121+2222+ {{ if .Spindles }}
2323+ <ul class="list-disc mx-12 my-2">
2424+ {{range .Spindles}}
2525+ <li>Spindle: {{ .Instance }}</li>
2626+ {{ end }}
2727+ </ul>
2828+ {{ end }}
2929+3030+ <div class="mx-6">
3131+ These services may not be fully accessible until upgraded.
3232+ <a class="underline text-red-800 dark:text-red-200"
3333+ href="https://tangled.org/@tangled.org/core/tree/master/docs/migrations.md">
3434+ Click to read the upgrade guide</a>.
3535+ </div>
3636+ </details>
3737+</div>
3838+{{ end }}
+224
appview/pages/templates/brand/brand.html
···11+{{ define "title" }}brand{{ end }}
22+33+{{ define "content" }}
44+<div class="grid grid-cols-10">
55+ <header class="col-span-full md:col-span-10 px-6 py-2 mb-4">
66+ <h1 class="text-2xl font-bold dark:text-white mb-1">Brand</h1>
77+ <p class="text-gray-600 dark:text-gray-400 mb-1">
88+ Assets and guidelines for using Tangled's logo and brand elements.
99+ </p>
1010+ </header>
1111+1212+ <main class="col-span-full md:col-span-10 bg-white dark:bg-gray-800 drop-shadow-sm rounded p-6 md:px-10">
1313+ <div class="space-y-16">
1414+1515+ <!-- Introduction Section -->
1616+ <section>
1717+ <p class="text-gray-600 dark:text-gray-400 mb-2">
1818+ Tangled's logo and mascot is <strong>Dolly</strong>, the first ever <em>cloned</em> mammal. Please
1919+ follow the below guidelines when using Dolly and the logotype.
2020+ </p>
2121+ <p class="text-gray-600 dark:text-gray-400 mb-2">
2222+ All assets are served as SVGs, and can be downloaded by right-clicking and clicking "Save image as".
2323+ </p>
2424+ </section>
2525+2626+ <!-- Black Logotype Section -->
2727+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
2828+ <div class="order-2 lg:order-1">
2929+ <div class="border border-gray-200 dark:border-gray-700 p-8 sm:p-16 bg-gray-50 dark:bg-gray-100 rounded">
3030+ <img src="https://assets.tangled.network/tangled_logotype_black_on_trans.svg"
3131+ alt="Tangled logo - black version"
3232+ class="w-full max-w-sm mx-auto" />
3333+ </div>
3434+ </div>
3535+ <div class="order-1 lg:order-2">
3636+ <h2 class="text-xl font-semibold dark:text-white mb-3">Black logotype</h2>
3737+ <p class="text-gray-600 dark:text-gray-400 mb-4">For use on light-colored backgrounds.</p>
3838+ <p class="text-gray-700 dark:text-gray-300">
3939+ This is the preferred version of the logotype, featuring dark text and elements, ideal for light
4040+ backgrounds and designs.
4141+ </p>
4242+ </div>
4343+ </section>
4444+4545+ <!-- White Logotype Section -->
4646+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
4747+ <div class="order-2 lg:order-1">
4848+ <div class="bg-black p-8 sm:p-16 rounded">
4949+ <img src="https://assets.tangled.network/tangled_logotype_white_on_trans.svg"
5050+ alt="Tangled logo - white version"
5151+ class="w-full max-w-sm mx-auto" />
5252+ </div>
5353+ </div>
5454+ <div class="order-1 lg:order-2">
5555+ <h2 class="text-xl font-semibold dark:text-white mb-3">White logotype</h2>
5656+ <p class="text-gray-600 dark:text-gray-400 mb-4">For use on dark-colored backgrounds.</p>
5757+ <p class="text-gray-700 dark:text-gray-300">
5858+ This version features white text and elements, ideal for dark backgrounds
5959+ and inverted designs.
6060+ </p>
6161+ </div>
6262+ </section>
6363+6464+ <!-- Mark Only Section -->
6565+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
6666+ <div class="order-2 lg:order-1">
6767+ <div class="grid grid-cols-2 gap-2">
6868+ <!-- Black mark on light background -->
6969+ <div class="border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-100 p-8 sm:p-12 rounded">
7070+ <img src="https://assets.tangled.network/tangled_dolly_face_only_black_on_trans.svg"
7171+ alt="Dolly face - black version"
7272+ class="w-full max-w-16 mx-auto" />
7373+ </div>
7474+ <!-- White mark on dark background -->
7575+ <div class="bg-black p-8 sm:p-12 rounded">
7676+ <img src="https://assets.tangled.network/tangled_dolly_face_only_white_on_trans.svg"
7777+ alt="Dolly face - white version"
7878+ class="w-full max-w-16 mx-auto" />
7979+ </div>
8080+ </div>
8181+ </div>
8282+ <div class="order-1 lg:order-2">
8383+ <h2 class="text-xl font-semibold dark:text-white mb-3">Mark only</h2>
8484+ <p class="text-gray-600 dark:text-gray-400 mb-4">
8585+ When a smaller 1:1 logo or icon is needed, Dolly's face may be used on its own.
8686+ </p>
8787+ <p class="text-gray-700 dark:text-gray-300 mb-4">
8888+ <strong class="font-semibold">Note</strong>: for situations where the background
8989+ is unknown, use the black version for ideal contrast in most environments.
9090+ </p>
9191+ </div>
9292+ </section>
9393+9494+ <!-- Colored Backgrounds Section -->
9595+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
9696+ <div class="order-2 lg:order-1">
9797+ <div class="grid grid-cols-2 gap-2">
9898+ <!-- Pastel Green background -->
9999+ <div class="bg-green-500 p-8 sm:p-12 rounded">
100100+ <img src="https://assets.tangled.network/tangled_dolly_face_only_white_on_trans.svg"
101101+ alt="Tangled logo on pastel green background"
102102+ class="w-full max-w-16 mx-auto" />
103103+ </div>
104104+ <!-- Pastel Blue background -->
105105+ <div class="bg-blue-500 p-8 sm:p-12 rounded">
106106+ <img src="https://assets.tangled.network/tangled_dolly_face_only_white_on_trans.svg"
107107+ alt="Tangled logo on pastel blue background"
108108+ class="w-full max-w-16 mx-auto" />
109109+ </div>
110110+ <!-- Pastel Yellow background -->
111111+ <div class="bg-yellow-500 p-8 sm:p-12 rounded">
112112+ <img src="https://assets.tangled.network/tangled_dolly_face_only_white_on_trans.svg"
113113+ alt="Tangled logo on pastel yellow background"
114114+ class="w-full max-w-16 mx-auto" />
115115+ </div>
116116+ <!-- Pastel Red background -->
117117+ <div class="bg-red-500 p-8 sm:p-12 rounded">
118118+ <img src="https://assets.tangled.network/tangled_dolly_face_only_white_on_trans.svg"
119119+ alt="Tangled logo on pastel red background"
120120+ class="w-full max-w-16 mx-auto" />
121121+ </div>
122122+ </div>
123123+ </div>
124124+ <div class="order-1 lg:order-2">
125125+ <h2 class="text-xl font-semibold dark:text-white mb-3">Colored backgrounds</h2>
126126+ <p class="text-gray-600 dark:text-gray-400 mb-4">
127127+ White logo mark on colored backgrounds.
128128+ </p>
129129+ <p class="text-gray-700 dark:text-gray-300 mb-4">
130130+ The white logo mark provides contrast on colored backgrounds.
131131+ Perfect for more fun design contexts.
132132+ </p>
133133+ </div>
134134+ </section>
135135+136136+ <!-- Black Logo on Pastel Backgrounds Section -->
137137+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
138138+ <div class="order-2 lg:order-1">
139139+ <div class="grid grid-cols-2 gap-2">
140140+ <!-- Pastel Green background -->
141141+ <div class="bg-green-200 p-8 sm:p-12 rounded">
142142+ <img src="https://assets.tangled.network/tangled_dolly_face_only_black_on_trans.svg"
143143+ alt="Tangled logo on pastel green background"
144144+ class="w-full max-w-16 mx-auto" />
145145+ </div>
146146+ <!-- Pastel Blue background -->
147147+ <div class="bg-blue-200 p-8 sm:p-12 rounded">
148148+ <img src="https://assets.tangled.network/tangled_dolly_face_only_black_on_trans.svg"
149149+ alt="Tangled logo on pastel blue background"
150150+ class="w-full max-w-16 mx-auto" />
151151+ </div>
152152+ <!-- Pastel Yellow background -->
153153+ <div class="bg-yellow-200 p-8 sm:p-12 rounded">
154154+ <img src="https://assets.tangled.network/tangled_dolly_face_only_black_on_trans.svg"
155155+ alt="Tangled logo on pastel yellow background"
156156+ class="w-full max-w-16 mx-auto" />
157157+ </div>
158158+ <!-- Pastel Pink background -->
159159+ <div class="bg-pink-200 p-8 sm:p-12 rounded">
160160+ <img src="https://assets.tangled.network/tangled_dolly_face_only_black_on_trans.svg"
161161+ alt="Tangled logo on pastel pink background"
162162+ class="w-full max-w-16 mx-auto" />
163163+ </div>
164164+ </div>
165165+ </div>
166166+ <div class="order-1 lg:order-2">
167167+ <h2 class="text-xl font-semibold dark:text-white mb-3">Lighter backgrounds</h2>
168168+ <p class="text-gray-600 dark:text-gray-400 mb-4">
169169+ Dark logo mark on lighter, pastel backgrounds.
170170+ </p>
171171+ <p class="text-gray-700 dark:text-gray-300 mb-4">
172172+ The dark logo mark works beautifully on pastel backgrounds,
173173+ providing crisp contrast.
174174+ </p>
175175+ </div>
176176+ </section>
177177+178178+ <!-- Recoloring Section -->
179179+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
180180+ <div class="order-2 lg:order-1">
181181+ <div class="bg-yellow-100 border border-yellow-200 p-8 sm:p-16 rounded">
182182+ <img src="https://assets.tangled.network/tangled_logotype_black_on_trans.svg"
183183+ alt="Recolored Tangled logotype in gray/sand color"
184184+ class="w-full max-w-sm mx-auto opacity-60 sepia contrast-75 saturate-50" />
185185+ </div>
186186+ </div>
187187+ <div class="order-1 lg:order-2">
188188+ <h2 class="text-xl font-semibold dark:text-white mb-3">Recoloring</h2>
189189+ <p class="text-gray-600 dark:text-gray-400 mb-4">
190190+ Custom coloring of the logotype is permitted.
191191+ </p>
192192+ <p class="text-gray-700 dark:text-gray-300 mb-4">
193193+ Recoloring the logotype is allowed as long as readability is maintained.
194194+ </p>
195195+ <p class="text-gray-700 dark:text-gray-300 text-sm">
196196+ <strong>Example:</strong> Gray/sand colored logotype on a light yellow/tan background.
197197+ </p>
198198+ </div>
199199+ </section>
200200+201201+ <!-- Silhouette Section -->
202202+ <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
203203+ <div class="order-2 lg:order-1">
204204+ <div class="border border-gray-200 dark:border-gray-700 p-8 sm:p-16 bg-gray-50 dark:bg-gray-100 rounded">
205205+ <img src="https://assets.tangled.network/tangled_dolly_silhouette.svg"
206206+ alt="Dolly silhouette"
207207+ class="w-full max-w-32 mx-auto" />
208208+ </div>
209209+ </div>
210210+ <div class="order-1 lg:order-2">
211211+ <h2 class="text-xl font-semibold dark:text-white mb-3">Dolly silhouette</h2>
212212+ <p class="text-gray-600 dark:text-gray-400 mb-4">A minimalist version of Dolly.</p>
213213+ <p class="text-gray-700 dark:text-gray-300">
214214+ The silhouette can be used where a subtle brand presence is needed,
215215+ or as a background element. Works on any background color with proper contrast.
216216+ For example, we use this as the site's favicon.
217217+ </p>
218218+ </div>
219219+ </section>
220220+221221+ </div>
222222+ </main>
223223+</div>
224224+{{ end }}
+1-1
appview/pages/templates/errors/404.html
···1717 The page you're looking for doesn't exist. It may have been moved, deleted, or you have the wrong URL.
1818 </p>
1919 <div class="flex flex-col sm:flex-row gap-3 justify-center items-center mt-6">
2020- <a href="javascript:history.back()" class="btn px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline text-gray-600 dark:text-gray-300 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700">
2020+ <a href="javascript:history.back()" class="btn no-underline hover:no-underline gap-2">
2121 {{ i "arrow-left" "w-4 h-4" }}
2222 go back
2323 </a>
+8-15
appview/pages/templates/errors/500.html
···55 <div class="bg-white dark:bg-gray-800 rounded-lg drop-shadow-sm p-8 max-w-lg mx-auto">
66 <div class="mb-6">
77 <div class="w-16 h-16 mx-auto mb-4 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center">
88- {{ i "alert-triangle" "w-8 h-8 text-red-500 dark:text-red-400" }}
88+ {{ i "triangle-alert" "w-8 h-8 text-red-500 dark:text-red-400" }}
99 </div>
1010 </div>
1111-1111+1212 <div class="space-y-4">
1313 <h1 class="text-2xl sm:text-3xl font-bold text-gray-900 dark:text-white">
1414 500 — internal server error
1515 </h1>
1616 <p class="text-gray-600 dark:text-gray-300">
1717- Something went wrong on our end. We've been notified and are working to fix the issue.
1818- </p>
1919- <div class="bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded p-3 text-sm text-yellow-800 dark:text-yellow-200">
2020- <div class="flex items-center gap-2">
2121- {{ i "info" "w-4 h-4" }}
2222- <span class="font-medium">we're on it!</span>
2323- </div>
2424- <p class="mt-1">Our team has been automatically notified about this error.</p>
2525- </div>
1717+ We encountered an error while processing your request. Please try again later.
1818+ </p>
2619 <div class="flex flex-col sm:flex-row gap-3 justify-center items-center mt-6">
2727- <button onclick="location.reload()" class="btn-create px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline hover:text-white">
2020+ <button onclick="location.reload()" class="btn-create gap-2">
2821 {{ i "refresh-cw" "w-4 h-4" }}
2922 try again
3023 </button>
3131- <a href="/" class="btn px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline text-gray-600 dark:text-gray-300 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700">
3232- {{ i "home" "w-4 h-4" }}
2424+ <a href="/" class="btn no-underline hover:no-underline gap-2">
2525+ {{ i "arrow-left" "w-4 h-4" }}
3326 back to home
3427 </a>
3528 </div>
3629 </div>
3730 </div>
3831</div>
3939-{{ end }}3232+{{ end }}
+2-2
appview/pages/templates/errors/503.html
···1717 We were unable to reach the knot hosting this repository. The service may be temporarily unavailable.
1818 </p>
1919 <div class="flex flex-col sm:flex-row gap-3 justify-center items-center mt-6">
2020- <button onclick="location.reload()" class="btn-create px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline hover:text-white">
2020+ <button onclick="location.reload()" class="btn-create gap-2">
2121 {{ i "refresh-cw" "w-4 h-4" }}
2222 try again
2323 </button>
2424- <a href="/" class="btn px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline text-gray-600 dark:text-gray-300 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700">
2424+ <a href="/" class="btn gap-2 no-underline hover:no-underline">
2525 {{ i "arrow-left" "w-4 h-4" }}
2626 back to timeline
2727 </a>
+1-1
appview/pages/templates/errors/knot404.html
···1717 The repository you were looking for could not be found. The knot serving the repository may be unavailable.
1818 </p>
1919 <div class="flex flex-col sm:flex-row gap-3 justify-center items-center mt-6">
2020- <a href="/" class="btn px-4 py-2 rounded flex items-center gap-2 no-underline hover:no-underline">
2020+ <a href="/" class="btn flex items-center gap-2 no-underline hover:no-underline">
2121 {{ i "arrow-left" "w-4 h-4" }}
2222 back to timeline
2323 </a>
···11-{{ define "knots/fragments/banner" }}
22-<div class="w-full px-6 py-2 -z-15 bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border border-yellow-200 dark:border-yellow-800 rounded-b drop-shadow-sm">
33- A knot ({{range $i, $r := .Registrations}}{{if ne $i 0}}, {{end}}{{ $r.Domain }}{{ end }})
44- that you administer is presently read-only. Consider upgrading this knot to
55- continue creating repositories on it.
66- <a href="https://tangled.sh/@tangled.sh/core/blob/master/docs/migrations/knot-1.7.0.md">Click to read the upgrade guide</a>.
77-</div>
88-{{ end }}
99-
···11{{ define "title" }}knots{{ end }}
2233{{ define "content" }}
44-<div class="px-6 py-4">
44+<div class="px-6 py-4 flex items-center justify-between gap-4 align-bottom">
55 <h1 class="text-xl font-bold dark:text-white">Knots</h1>
66+ <span class="flex items-center gap-1">
77+ {{ i "book" "w-3 h-3" }}
88+ <a href="https://tangled.org/@tangled.org/core/blob/master/docs/knot-hosting.md">docs</a>
99+ </span>
610</div>
711812<section class="bg-white dark:bg-gray-800 p-6 rounded relative w-full mx-auto drop-shadow-sm dark:text-white">
···1519{{ end }}
16201721{{ define "about" }}
1818- <section class="rounded flex flex-col gap-2">
1919- <p class="dark:text-gray-300">
2020- Knots are lightweight headless servers that enable users to host Git repositories with ease.
2121- Knots are designed for either single or multi-tenant use which is perfect for self-hosting on a Raspberry Pi at home, or larger “community” servers.
2222- When creating a repository, you can choose a knot to store it on.
2323- <a href="https://tangled.sh/@tangled.sh/core/blob/master/docs/knot-hosting.md">
2424- Checkout the documentation if you're interested in self-hosting.
2525- </a>
2222+<section class="rounded">
2323+ <p class="text-gray-500 dark:text-gray-400">
2424+ Knots are lightweight headless servers that enable users to host Git repositories with ease.
2525+ When creating a repository, you can choose a knot to store it on.
2626 </p>
2727- </section>
2727+2828+2929+</section>
2830{{ end }}
29313032{{ define "list" }}
···11-{{ define "title" }} privacy policy {{ end }}
22-{{ define "content" }}
33-<div class="max-w-4xl mx-auto px-4 py-8">
44- <div class="bg-white dark:bg-gray-800 rounded-lg shadow-sm p-8">
55- <div class="prose prose-gray dark:prose-invert max-w-none">
66- <h1>Privacy Policy</h1>
77-88- <p><strong>Last updated:</strong> {{ now.Format "January 2, 2006" }}</p>
99-1010- <p>This Privacy Policy describes how Tangled ("we," "us," or "our") collects, uses, and shares your personal information when you use our platform and services (the "Service").</p>
11+{{ define "title" }}privacy policy{{ end }}
1121212- <h2>1. Information We Collect</h2>
1313-1414- <h3>Account Information</h3>
1515- <p>When you create an account, we collect:</p>
1616- <ul>
1717- <li>Your chosen username</li>
1818- <li>Email address</li>
1919- <li>Profile information you choose to provide</li>
2020- <li>Authentication data</li>
2121- </ul>
33+{{ define "content" }}
44+<div class="grid grid-cols-10">
55+ <header class="col-span-full md:col-span-10 px-6 py-2 mb-4">
66+ <h1 class="text-2xl font-bold dark:text-white mb-1">Privacy Policy</h1>
77+ <p class="text-gray-600 dark:text-gray-400 mb-1">
88+ Learn how we collect, use, and protect your personal information.
99+ </p>
1010+ </header>
22112323- <h3>Content and Activity</h3>
2424- <p>We store:</p>
2525- <ul>
2626- <li>Code repositories and associated metadata</li>
2727- <li>Issues, pull requests, and comments</li>
2828- <li>Activity logs and usage patterns</li>
2929- <li>Public keys for authentication</li>
3030- </ul>
3131-3232- <h2>2. Data Location and Hosting</h2>
3333- <div class="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4 my-6">
3434- <h3 class="text-blue-800 dark:text-blue-200 font-semibold mb-2">EU Data Hosting</h3>
3535- <p class="text-blue-700 dark:text-blue-300">
3636- <strong>All Tangled service data is hosted within the European Union.</strong> Specifically:
3737- </p>
3838- <ul class="text-blue-700 dark:text-blue-300 mt-2">
3939- <li><strong>Personal Data Servers (PDS):</strong> Accounts hosted on Tangled PDS (*.tngl.sh) are located in Finland</li>
4040- <li><strong>Application Data:</strong> All other service data is stored on EU-based servers</li>
4141- <li><strong>Data Processing:</strong> All data processing occurs within EU jurisdiction</li>
4242- </ul>
4343- </div>
4444-4545- <div class="bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4 my-6">
4646- <h3 class="text-yellow-800 dark:text-yellow-200 font-semibold mb-2">External PDS Notice</h3>
4747- <p class="text-yellow-700 dark:text-yellow-300">
4848- <strong>Important:</strong> If your account is hosted on Bluesky's PDS or other self-hosted Personal Data Servers (not *.tngl.sh), we do not control that data. The data protection, storage location, and privacy practices for such accounts are governed by the respective PDS provider's policies, not this Privacy Policy. We only control data processing within our own services and infrastructure.
4949- </p>
5050- </div>
5151-5252- <h2>3. Third-Party Data Processors</h2>
5353- <p>We only share your data with the following third-party processors:</p>
5454-5555- <h3>Resend (Email Services)</h3>
5656- <ul>
5757- <li><strong>Purpose:</strong> Sending transactional emails (account verification, notifications)</li>
5858- <li><strong>Data Shared:</strong> Email address and necessary message content</li>
5959- <li><strong>Location:</strong> EU-compliant email delivery service</li>
6060- </ul>
6161-6262- <h3>Cloudflare (Image Caching)</h3>
6363- <ul>
6464- <li><strong>Purpose:</strong> Caching and optimizing image delivery</li>
6565- <li><strong>Data Shared:</strong> Public images and associated metadata for caching purposes</li>
6666- <li><strong>Location:</strong> Global CDN with EU data protection compliance</li>
6767- </ul>
6868-6969- <h2>4. How We Use Your Information</h2>
7070- <p>We use your information to:</p>
7171- <ul>
7272- <li>Provide and maintain the Service</li>
7373- <li>Process your transactions and requests</li>
7474- <li>Send you technical notices and support messages</li>
7575- <li>Improve and develop new features</li>
7676- <li>Ensure security and prevent fraud</li>
7777- <li>Comply with legal obligations</li>
7878- </ul>
7979-8080- <h2>5. Data Sharing and Disclosure</h2>
8181- <p>We do not sell, trade, or rent your personal information. We may share your information only in the following circumstances:</p>
8282- <ul>
8383- <li>With the third-party processors listed above</li>
8484- <li>When required by law or legal process</li>
8585- <li>To protect our rights, property, or safety, or that of our users</li>
8686- <li>In connection with a merger, acquisition, or sale of assets (with appropriate protections)</li>
8787- </ul>
8888-8989- <h2>6. Data Security</h2>
9090- <p>We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the Internet is 100% secure.</p>
9191-9292- <h2>7. Data Retention</h2>
9393- <p>We retain your personal information for as long as necessary to provide the Service and fulfill the purposes outlined in this Privacy Policy, unless a longer retention period is required by law.</p>
9494-9595- <h2>8. Your Rights</h2>
9696- <p>Under applicable data protection laws, you have the right to:</p>
9797- <ul>
9898- <li>Access your personal information</li>
9999- <li>Correct inaccurate information</li>
100100- <li>Request deletion of your information</li>
101101- <li>Object to processing of your information</li>
102102- <li>Data portability</li>
103103- <li>Withdraw consent (where applicable)</li>
104104- </ul>
105105-106106- <h2>9. Cookies and Tracking</h2>
107107- <p>We use cookies and similar technologies to:</p>
108108- <ul>
109109- <li>Maintain your login session</li>
110110- <li>Remember your preferences</li>
111111- <li>Analyze usage patterns to improve the Service</li>
112112- </ul>
113113- <p>You can control cookie settings through your browser preferences.</p>
114114-115115- <h2>10. Children's Privacy</h2>
116116- <p>The Service is not intended for children under 16 years of age. We do not knowingly collect personal information from children under 16. If we become aware that we have collected such information, we will take steps to delete it.</p>
117117-118118- <h2>11. International Data Transfers</h2>
119119- <p>While all our primary data processing occurs within the EU, some of our third-party processors may process data outside the EU. When this occurs, we ensure appropriate safeguards are in place, such as Standard Contractual Clauses or adequacy decisions.</p>
120120-121121- <h2>12. Changes to This Privacy Policy</h2>
122122- <p>We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last updated" date.</p>
123123-124124- <h2>13. Contact Information</h2>
125125- <p>If you have any questions about this Privacy Policy or wish to exercise your rights, please contact us through our platform or via email.</p>
126126-127127- <div class="mt-8 pt-6 border-t border-gray-200 dark:border-gray-700 text-sm text-gray-600 dark:text-gray-400">
128128- <p>This Privacy Policy complies with the EU General Data Protection Regulation (GDPR) and other applicable data protection laws.</p>
129129- </div>
130130- </div>
1212+ <main class="col-span-full md:col-span-10 bg-white dark:bg-gray-800 drop-shadow-sm rounded p-6 md:px-10">
1313+ <div class="prose prose-gray dark:prose-invert max-w-none">
1414+ {{ .Content }}
13115 </div>
1616+ </main>
13217</div>
13318{{ end }}
+11-64
appview/pages/templates/legal/terms.html
···11{{ define "title" }}terms of service{{ end }}
2233{{ define "content" }}
44-<div class="max-w-4xl mx-auto px-4 py-8">
55- <div class="bg-white dark:bg-gray-800 rounded-lg shadow-sm p-8">
66- <div class="prose prose-gray dark:prose-invert max-w-none">
77- <h1>Terms of Service</h1>
88-99- <p><strong>Last updated:</strong> {{ now.Format "January 2, 2006" }}</p>
1010-1111- <p>Welcome to Tangled. These Terms of Service ("Terms") govern your access to and use of the Tangled platform and services (the "Service") operated by us ("Tangled," "we," "us," or "our").</p>
1212-1313- <h2>1. Acceptance of Terms</h2>
1414- <p>By accessing or using our Service, you agree to be bound by these Terms. If you disagree with any part of these terms, then you may not access the Service.</p>
1515-1616- <h2>2. Account Registration</h2>
1717- <p>To use certain features of the Service, you must register for an account. You agree to provide accurate, current, and complete information during the registration process and to update such information to keep it accurate, current, and complete.</p>
1818-1919- <h2>3. Account Termination</h2>
2020- <div class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 my-6">
2121- <h3 class="text-red-800 dark:text-red-200 font-semibold mb-2">Important Notice</h3>
2222- <p class="text-red-700 dark:text-red-300">
2323- <strong>We reserve the right to terminate, suspend, or restrict access to your account at any time, for any reason, or for no reason at all, at our sole discretion.</strong> This includes, but is not limited to, termination for violation of these Terms, inappropriate conduct, spam, abuse, or any other behavior we deem harmful to the Service or other users.
2424- </p>
2525- <p class="text-red-700 dark:text-red-300 mt-2">
2626- Account termination may result in the loss of access to your repositories, data, and other content associated with your account. We are not obligated to provide advance notice of termination, though we may do so in our discretion.
2727- </p>
2828- </div>
44+<div class="grid grid-cols-10">
55+ <header class="col-span-full md:col-span-10 px-6 py-2 mb-4">
66+ <h1 class="text-2xl font-bold dark:text-white mb-1">Terms of Service</h1>
77+ <p class="text-gray-600 dark:text-gray-400 mb-1">
88+ A few things you should know.
99+ </p>
1010+ </header>
29113030- <h2>4. Acceptable Use</h2>
3131- <p>You agree not to use the Service to:</p>
3232- <ul>
3333- <li>Violate any applicable laws or regulations</li>
3434- <li>Infringe upon the rights of others</li>
3535- <li>Upload, store, or share content that is illegal, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, or otherwise objectionable</li>
3636- <li>Engage in spam, phishing, or other deceptive practices</li>
3737- <li>Attempt to gain unauthorized access to the Service or other users' accounts</li>
3838- <li>Interfere with or disrupt the Service or servers connected to the Service</li>
3939- </ul>
4040-4141- <h2>5. Content and Intellectual Property</h2>
4242- <p>You retain ownership of the content you upload to the Service. By uploading content, you grant us a non-exclusive, worldwide, royalty-free license to use, reproduce, modify, and distribute your content as necessary to provide the Service.</p>
4343-4444- <h2>6. Privacy</h2>
4545- <p>Your privacy is important to us. Please review our <a href="/privacy" class="text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300">Privacy Policy</a>, which also governs your use of the Service.</p>
4646-4747- <h2>7. Disclaimers</h2>
4848- <p>The Service is provided on an "AS IS" and "AS AVAILABLE" basis. We make no warranties, expressed or implied, and hereby disclaim and negate all other warranties including without limitation, implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property or other violation of rights.</p>
4949-5050- <h2>8. Limitation of Liability</h2>
5151- <p>In no event shall Tangled, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your use of the Service.</p>
5252-5353- <h2>9. Indemnification</h2>
5454- <p>You agree to defend, indemnify, and hold harmless Tangled and its affiliates, officers, directors, employees, and agents from and against any and all claims, damages, obligations, losses, liabilities, costs, or debt, and expenses (including attorney's fees).</p>
5555-5656- <h2>10. Governing Law</h2>
5757- <p>These Terms shall be interpreted and governed by the laws of Finland, without regard to its conflict of law provisions.</p>
5858-5959- <h2>11. Changes to Terms</h2>
6060- <p>We reserve the right to modify or replace these Terms at any time. If a revision is material, we will try to provide at least 30 days notice prior to any new terms taking effect.</p>
6161-6262- <h2>12. Contact Information</h2>
6363- <p>If you have any questions about these Terms of Service, please contact us through our platform or via email.</p>
6464-6565- <div class="mt-8 pt-6 border-t border-gray-200 dark:border-gray-700 text-sm text-gray-600 dark:text-gray-400">
6666- <p>These terms are effective as of the last updated date shown above and will remain in effect except with respect to any changes in their provisions in the future, which will be in effect immediately after being posted on this page.</p>
6767- </div>
6868- </div>
1212+ <main class="col-span-full md:col-span-10 bg-white dark:bg-gray-800 drop-shadow-sm rounded p-6 md:px-10">
1313+ <div class="prose prose-gray dark:prose-invert max-w-none">
1414+ {{ .Content }}
6915 </div>
1616+ </main>
7017</div>
7118{{ end }}
···4848redis-server
4949```
50505151-## running a knot
5151+## running knots and spindles
52525353An end-to-end knot setup requires setting up a machine with
5454`sshd`, `AuthorizedKeysCommand`, and git user, which is
5555quite cumbersome. So the nix flake provides a
5656`nixosConfiguration` to do so.
57575858-To begin, grab your DID from http://localhost:3000/settings.
5959-Then, set `TANGLED_VM_KNOT_OWNER` and
6060-`TANGLED_VM_SPINDLE_OWNER` to your DID.
5858+<details>
5959+ <summary><strong>MacOS users will have to setup a Nix Builder first</strong></summary>
6060+6161+ In order to build Tangled's dev VM on macOS, you will
6262+ first need to set up a Linux Nix builder. The recommended
6363+ way to do so is to run a [`darwin.linux-builder`
6464+ VM](https://nixos.org/manual/nixpkgs/unstable/#sec-darwin-builder)
6565+ and to register it in `nix.conf` as a builder for Linux
6666+ with the same architecture as your Mac (`linux-aarch64` if
6767+ you are using Apple Silicon).
6868+6969+ > IMPORTANT: You must build `darwin.linux-builder` somewhere other than inside
7070+ > the tangled repo so that it doesn't conflict with the other VM. For example,
7171+ > you can do
7272+ >
7373+ > ```shell
7474+ > cd $(mktemp -d buildervm.XXXXX) && nix run nixpkgs#darwin.linux-builder
7575+ > ```
7676+ >
7777+ > to store the builder VM in a temporary dir.
7878+ >
7979+ > You should read and follow [all the other intructions][darwin builder vm] to
8080+ > avoid subtle problems.
8181+8282+ Alternatively, you can use any other method to set up a
8383+ Linux machine with `nix` installed that you can `sudo ssh`
8484+ into (in other words, root user on your Mac has to be able
8585+ to ssh into the Linux machine without entering a password)
8686+ and that has the same architecture as your Mac. See
8787+ [remote builder
8888+ instructions](https://nix.dev/manual/nix/2.28/advanced-topics/distributed-builds.html#requirements)
8989+ for how to register such a builder in `nix.conf`.
61906262-If you don't want to [set up a spindle](#running-a-spindle),
6363-you can use any placeholder value.
9191+ > WARNING: If you'd like to use
9292+ > [`nixos-lima`](https://github.com/nixos-lima/nixos-lima) or
9393+ > [Orbstack](https://orbstack.dev/), note that setting them up so that `sudo
9494+ > ssh` works can be tricky. It seems to be [possible with
9595+ > Orbstack](https://github.com/orgs/orbstack/discussions/1669).
64966565-You can now start a lightweight NixOS VM like so:
9797+</details>
9898+9999+To begin, grab your DID from http://localhost:3000/settings.
100100+Then, set `TANGLED_VM_KNOT_OWNER` and
101101+`TANGLED_VM_SPINDLE_OWNER` to your DID. You can now start a
102102+lightweight NixOS VM like so:
6610367104```bash
68105nix run --impure .#vm
···74111with `ssh` exposed on port 2222.
7511276113Once the services are running, head to
7777-http://localhost:3000/knots and hit verify (and similarly,
7878-http://localhost:3000/spindles to verify your spindle). It
7979-should verify the ownership of the services instantly if
8080-everything went smoothly.
114114+http://localhost:3000/knots and hit verify. It should
115115+verify the ownership of the services instantly if everything
116116+went smoothly.
8111782118You can push repositories to this VM with this ssh config
83119block on your main machine:
···97133git push local-dev main
98134```
99135100100-## running a spindle
136136+### running a spindle
101137102138The above VM should already be running a spindle on
103139`localhost:6555`. Head to http://localhost:3000/spindles and
···119155# litecli has a nicer REPL interface:
120156litecli /var/lib/spindle/spindle.db
121157```
158158+159159+If for any reason you wish to disable either one of the
160160+services in the VM, modify [nix/vm.nix](/nix/vm.nix) and set
161161+`services.tangled-spindle.enable` (or
162162+`services.tangled-knot.enable`) to `false`.
+2-2
docs/knot-hosting.md
···1919First, clone this repository:
20202121```
2222-git clone https://tangled.sh/@tangled.sh/core
2222+git clone https://tangled.org/@tangled.org/core
2323```
24242525Then, build the `knot` CLI. This is the knot administration and operation tool.
···130130131131You should now have a running knot server! You can finalize
132132your registration by hitting the `verify` button on the
133133-[/knots](https://tangled.sh/knots) page. This simply creates
133133+[/knots](https://tangled.org/knots) page. This simply creates
134134a record on your PDS to announce the existence of the knot.
135135136136### custom paths
-35
docs/migrations/knot-1.7.0.md
···11-# Upgrading from v1.7.0
22-33-After v1.7.0, knot secrets have been deprecated. You no
44-longer need a secret from the appview to run a knot. All
55-authorized commands to knots are managed via [Inter-Service
66-Authentication](https://atproto.com/specs/xrpc#inter-service-authentication-jwt).
77-Knots will be read-only until upgraded.
88-99-Upgrading is quite easy, in essence:
1010-1111-- `KNOT_SERVER_SECRET` is no more, you can remove this
1212- environment variable entirely
1313-- `KNOT_SERVER_OWNER` is now required on boot, set this to
1414- your DID. You can find your DID in the
1515- [settings](https://tangled.sh/settings) page.
1616-- Restart your knot once you have replaced the environment
1717- variable
1818-- Head to the [knot dashboard](https://tangled.sh/knots) and
1919- hit the "retry" button to verify your knot. This simply
2020- writes a `sh.tangled.knot` record to your PDS.
2121-2222-## Nix
2323-2424-If you use the nix module, simply bump the flake to the
2525-latest revision, and change your config block like so:
2626-2727-```diff
2828- services.tangled-knot = {
2929- enable = true;
3030- server = {
3131-- secretFile = /path/to/secret;
3232-+ owner = "did:plc:foo";
3333- };
3434- };
3535-```
+59
docs/migrations.md
···11+# Migrations
22+33+This document is laid out in reverse-chronological order.
44+Newer migration guides are listed first, and older guides
55+are further down the page.
66+77+## Upgrading from v1.8.x
88+99+After v1.8.2, the HTTP API for knot and spindles have been
1010+deprecated and replaced with XRPC. Repositories on outdated
1111+knots will not be viewable from the appview. Upgrading is
1212+straightforward however.
1313+1414+For knots:
1515+1616+- Upgrade to latest tag (v1.9.0 or above)
1717+- Head to the [knot dashboard](https://tangled.org/knots) and
1818+ hit the "retry" button to verify your knot
1919+2020+For spindles:
2121+2222+- Upgrade to latest tag (v1.9.0 or above)
2323+- Head to the [spindle
2424+ dashboard](https://tangled.org/spindles) and hit the
2525+ "retry" button to verify your spindle
2626+2727+## Upgrading from v1.7.x
2828+2929+After v1.7.0, knot secrets have been deprecated. You no
3030+longer need a secret from the appview to run a knot. All
3131+authorized commands to knots are managed via [Inter-Service
3232+Authentication](https://atproto.com/specs/xrpc#inter-service-authentication-jwt).
3333+Knots will be read-only until upgraded.
3434+3535+Upgrading is quite easy, in essence:
3636+3737+- `KNOT_SERVER_SECRET` is no more, you can remove this
3838+ environment variable entirely
3939+- `KNOT_SERVER_OWNER` is now required on boot, set this to
4040+ your DID. You can find your DID in the
4141+ [settings](https://tangled.org/settings) page.
4242+- Restart your knot once you have replaced the environment
4343+ variable
4444+- Head to the [knot dashboard](https://tangled.org/knots) and
4545+ hit the "retry" button to verify your knot. This simply
4646+ writes a `sh.tangled.knot` record to your PDS.
4747+4848+If you use the nix module, simply bump the flake to the
4949+latest revision, and change your config block like so:
5050+5151+```diff
5252+ services.tangled-knot = {
5353+ enable = true;
5454+ server = {
5555+- secretFile = /path/to/secret;
5656++ owner = "did:plc:foo";
5757+ };
5858+ };
5959+```
+1-1
docs/spindle/openbao.md
···4444### production
45454646You would typically use a systemd service with a configuration file. Refer to
4747-[@tangled.sh/infra](https://tangled.sh/@tangled.sh/infra) for how this can be
4747+[@tangled.org/infra](https://tangled.org/@tangled.org/infra) for how this can be
4848achieved using Nix.
49495050Then, initialize the bao server:
+3-3
docs/spindle/pipeline.md
···2121 - `manual`: The workflow can be triggered manually.
2222- `branch`: This is a **required** field that defines which branches the workflow should run for. If used with the `push` event, commits to the branch(es) listed here will trigger the workflow. If used with the `pull_request` event, updates to pull requests targeting the branch(es) listed here will trigger the workflow. This field has no effect with the `manual` event.
23232424-For example, if you'd like define a workflow that runs when commits are pushed to the `main` and `develop` branches, or when pull requests that target the `main` branch are updated, or manually, you can do so with:
2424+For example, if you'd like to define a workflow that runs when commits are pushed to the `main` and `develop` branches, or when pull requests that target the `main` branch are updated, or manually, you can do so with:
25252626```yaml
2727when:
···7373 - nodejs
7474 - go
7575 # custom registry
7676- git+https://tangled.sh/@example.com/my_pkg:
7676+ git+https://tangled.org/@example.com/my_pkg:
7777 - my_pkg
7878```
7979···141141 - nodejs
142142 - go
143143 # custom registry
144144- git+https://tangled.sh/@example.com/my_pkg:
144144+ git+https://tangled.org/@example.com/my_pkg:
145145 - my_pkg
146146147147environment:
···119119 // we have f1 and f2, combine them
120120 combined, err := combineFiles(f1, f2)
121121 if err != nil {
122122- fmt.Println(err)
122122+ // fmt.Println(err)
123123 }
124124125125 // combined can be nil commit 2 reverted all changes from commit 1
···11# tangled
2233Hello Tanglers! This is the codebase for
44-[Tangled](https://tangled.sh)—a code collaboration platform built
44+[Tangled](https://tangled.org)—a code collaboration platform built
55on the [AT Protocol](https://atproto.com).
6677-Read the introduction to Tangled [here](https://blog.tangled.sh/intro). Join the
88-[Discord](https://chat.tangled.sh) or IRC at [#tangled on
77+Read the introduction to Tangled [here](https://blog.tangled.org/intro). Join the
88+[Discord](https://chat.tangled.org) or IRC at [#tangled on
99libera.chat](https://web.libera.chat/#tangled).
10101111## docs
···1717## security
18181919If you've identified a security issue in Tangled, please email
2020-[security@tangled.sh](mailto:security@tangled.sh) with details!
2020+[security@tangled.org](mailto:security@tangled.org) with details!