diff --git a/.gitignore b/.gitignore index 73008fa..227c809 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.sqlite *.lock *target +*.db diff --git a/docker/python-oauth-web-app/templates/base.html b/docker/python-oauth-web-app/templates/base.html deleted file mode 100644 index 08c0a6f..0000000 --- a/docker/python-oauth-web-app/templates/base.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - atproto OAuth Web Service Example - - -
-
- {% if g.user %} - {% endif %} -
- -
-
-
- {% for message in get_flashed_messages() %} -
{{ message }}
- {% endfor %} - {% block content %}{% endblock %} -
-
- - diff --git a/docker/python-oauth-web-app/templates/home.html b/docker/python-oauth-web-app/templates/home.html deleted file mode 100644 index 80ced36..0000000 --- a/docker/python-oauth-web-app/templates/home.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends 'base.html' %} -{% block content %} -{% if g.user %} -
- -
-@{{ g.user['handle'] }} -
- -
- -{% else %} -

Login to get started!

-{% endif %} -{% endblock %} diff --git a/docker/rust-bbs/templates/index.html b/docker/rust-bbs/templates/index.html deleted file mode 100644 index fbe4b49..0000000 --- a/docker/rust-bbs/templates/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - Simple BBS - - - -
- - - -
- - - - - - - diff --git a/docker/PixelStreamingInfrastructure/Public/player.html b/github/PixelStreamingInfrastructure/Public/player.html similarity index 100% rename from docker/PixelStreamingInfrastructure/Public/player.html rename to github/PixelStreamingInfrastructure/Public/player.html diff --git a/github/frontpage/packages-rs/drainpipe/.env.local b/github/frontpage/packages-rs/drainpipe/.env.local new file mode 100644 index 0000000..efa053b --- /dev/null +++ b/github/frontpage/packages-rs/drainpipe/.env.local @@ -0,0 +1,5 @@ +DATABASE_URL="drainpipe.db" +FRONTPAGE_CONSUMER_URL="http://${cloudflared}/api/receive_hook" +FRONTPAGE_CONSUMER_SECRET=`openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32` + +#RELAY_URL=wss://syu.is diff --git a/github/frontpage/packages-rs/drainpipe/.keep b/github/frontpage/packages-rs/drainpipe/.keep new file mode 100644 index 0000000..e69de29 diff --git a/github/frontpage/packages-rs/drainpipe/Dockerfile b/github/frontpage/packages-rs/drainpipe/Dockerfile new file mode 100644 index 0000000..590140e --- /dev/null +++ b/github/frontpage/packages-rs/drainpipe/Dockerfile @@ -0,0 +1,20 @@ +FROM rust:1.78-alpine AS builder + +RUN apk add libressl-dev musl-dev sqlite-dev + +WORKDIR /usr/src/unravel +COPY . . +# TODO: Use cargo-chef to cache dependencies compilation independently of the binary +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/root/target \ + cargo build --release --package drainpipe && \ + # Move the release binary to a folder to be copied to the final image. It can't be copied directly from the target folder because it's in a cache mount + # See https://gist.github.com/noelbundick/6922d26667616e2ba5c3aff59f0824cd?permalink_comment_id=4379948#gistcomment-4379948 + mv ./target/release /root + +FROM alpine:3.14 +COPY --from=builder /root/release/drainpipe / + +ENV DATABASE_URL="/drainpipedata/drainpipe.db" + +ENTRYPOINT ["/drainpipe"] diff --git a/github/frontpage/packages-rs/drainpipe/docker-compose.yml b/github/frontpage/packages-rs/drainpipe/docker-compose.yml new file mode 100644 index 0000000..d5e214a --- /dev/null +++ b/github/frontpage/packages-rs/drainpipe/docker-compose.yml @@ -0,0 +1,9 @@ +services: + drainpipe: + build: + dockerfile: ./packages-rs/drainpipe/Dockerfile + context: ../../ + env_file: + - ./.env.local + volumes: + - ./drainpipedata:/drainpipedata diff --git a/github/frontpage/packages/frontpage/.env.local b/github/frontpage/packages/frontpage/.env.local new file mode 100644 index 0000000..0b2e67f --- /dev/null +++ b/github/frontpage/packages/frontpage/.env.local @@ -0,0 +1,14 @@ +PRIVATE_JWK=`pnpm exec tsx ./scripts/generate-jwk.mts` +PUBLIC_JWK=`pnpm exec tsx ./scripts/generate-jwk.mts` + +TURSO_CONNECTION_URL=libsql://xxx.turso.io +#TURSO_CONNECTION_URL=`turso db shell xxx-xxx` +TURSO_AUTH_TOKEN=`turso db tokens create xxx-xxx` + +DRAINPIPE_CONSUMER_SECRET=`openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32` +VERCEL_PROJECT_PRODUCTION_URL=example.com +VERCEL_BRANCH_URL=example.com + +#DRAINPIPE_CONSUMER_SECRET=secret +#TURSO_CONNECTION_URL=libsql://turso.dev.unravel.fyi +#PLC_DIRECTORY_URL=https://plc.dev.unravel.fyi diff --git a/github/frontpage/packages/frontpage/Dockerfile b/github/frontpage/packages/frontpage/Dockerfile new file mode 100644 index 0000000..66ff8e4 --- /dev/null +++ b/github/frontpage/packages/frontpage/Dockerfile @@ -0,0 +1,17 @@ +FROM node:20 + +RUN npm install -g pnpm +WORKDIR /app +RUN git clone https://github.com/likeandscribe/frontpage +WORKDIR /app/frontpage +RUN pnpm i +RUN pnpm exec turbo run --affected type-check + +WORKDIR /app/frontpage/packages/frontpage +COPY ./.env.local ./.env.local +COPY ./app ./app +COPY ./lib ./lib +RUN pnpm run db:generate +RUN pnpm run db:migrate +RUN pnpm run build +CMD [ "pnpm", "run", "start"] diff --git a/github/frontpage/packages/frontpage/compose.yml b/github/frontpage/packages/frontpage/compose.yml new file mode 100644 index 0000000..e1d7db1 --- /dev/null +++ b/github/frontpage/packages/frontpage/compose.yml @@ -0,0 +1,8 @@ +services: + frontpage: + build: + context: . + ports: + - "3000:3000" + environment: + - WATCHPACK_POLLING=true diff --git a/github/frontpage/readme.md b/github/frontpage/readme.md new file mode 100644 index 0000000..e59d560 --- /dev/null +++ b/github/frontpage/readme.md @@ -0,0 +1,226 @@ +# frontpage + +- https://frontpage.fyi +- https://bsky.app/profile/frontpage.fyi +- https://github.com/likeandscribe/frontpage + +```sh +$ git clone https://github.com/likeandscribe/frontpage +$ dir=${0:a:h}/frontpage +$ cd $dir +``` + +## first setting + +```sh +$ cd $dir +$ nvm use 20 +$ pnpm i +$ cat turbo.json +$ pnpm exec turbo run --affected type-check +``` + +```sh +$ cd $dir/packages/frontpage +$ pnpm exec tsx ./scripts/generate-jwk.mts +# pnpm run db:generate +# pnpm run db:migrate +$ cat .env.local +``` + +```sh +# frontpage/.env.local +PRIVATE_JWK=`pnpm exec tsx ./scripts/generate-jwk.mts` +PUBLIC_JWK=`pnpm exec tsx ./scripts/generate-jwk.mts` + +TURSO_CONNECTION_URL=libsql://xxx.turso.io +#TURSO_CONNECTION_URL=`turso db shell xxx-xxx` +TURSO_AUTH_TOKEN=`turso db tokens create xxx-xxx` + +DRAINPIPE_CONSUMER_SECRET=`openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32` +VERCEL_PROJECT_PRODUCTION_URL=example.com +VERCEL_BRANCH_URL=example.com + +#DRAINPIPE_CONSUMER_SECRET=secret +#TURSO_CONNECTION_URL=libsql://turso.dev.unravel.fyi +#PLC_DIRECTORY_URL=https://plc.dev.unravel.fyi +``` + +```sh +$ cd $dir/packages-rs/drainpipe +$ cargo install diesel_cli --no-default-features --features sqlite +$ diesel setup +$ diesel migration run +$ ls drainpipe.db +$ cat .env.local +``` + +```sh +# drainpipe/.env.local +DATABASE_URL="drainpipe.db" +FRONTPAGE_CONSUMER_URL="http://${cloudflared}/api/receive_hook" +FRONTPAGE_CONSUMER_SECRET=`openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | xxd --plain --cols 32` +#RELAY_URL=wss://bsky.network +#FRONTPAGE_CONSUMER_SECRET=secret +``` + +## rewrite + +```sh +$ cd $dir/packages/frontpage +$ PUBLIC_URL=example.com +$ grep -R frontpage.fyi ./app ./lib |cut -d : -f 1|sed -i "s/frontpage.fyi/$PUBLIC_URL/g" + +$ HOST_REVERT=com.unravel.example +$ grep -R unravel.frontpage ./app ./lib |cut -d : -f 1|xargs sed -i "s/fyi.unravel.frontpage/${HOST_REVERT}/g" +``` + +```sh +$ cd $dir/packages-rs/drainpipe +$ HOST_REVERT=com.unravel.example +$ grep -R fyi.unravel.frontpage ./src |cut -d : -f 1|xargs sed -i "s/fyi.unravel.frontpage/${HOST_REVERT}/g" +``` + +## deploy + +```sh +$ cd $dir/packages-rs/drainpipe +$ docker compose up +--- +$ cd $dir/packages/frontpage +$ docker compose up +``` + +## explanation + +### client-metadata.json + +the `client_id` is different between `pnpm run start` and `pnpm run dev`. see `https://localhost:3000/oauth/client-metadata.json` for this. + +### local-infra + +i think this is the server configuration required for self-hosting. + +https://github.com/likeandscribe/frontpage/tree/main/packages/frontpage/local-infra + +since plc gives an error, do the following. probably a postgres database is required. there is no need to open ports. + +```yml + plc: + image: ghcr.io/bluesky-social/did-method-plc:plc-f2ab7516bac5bc0f3f86842fa94e996bd1b3815b + container_name: plc + restart: unless-stopped + ports: + - '4000:8080' + depends_on: + - plc_db + env_file: + - ./plc.env + + plc_db: + image: postgres:16-alpine + restart: always + env_file: + - ./postgres.env + volumes: + - ./configs/postgres/init/:/docker-entrypoint-initdb.d/ + - ./data/postgres/:/var/lib/postgresql/data/ + healthcheck: + test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB" + interval: 5s + retries: 20 +``` + +```sh +# plc.env +DEBUG_MODE=1 +LOG_ENABLED=true +LOG_LEVEL=debug +LOG_DESTINATION=1 +PORT=8080 +DATABASE_URL=postgres://postgres:postgres@plc_db/plc +DB_CREDS_JSON='{"username":"postgres","password":"postgres","host":"plc_db","port":"5432","database":"plc"}' +ENABLE_MIGRATIONS=true +DB_MIGRATE_CREDS_JSON='{"username":"postgres","password":"postgres","host":"plc_db","port":"5432","database":"plc"}' +``` + +```sh +# configs/postgres/init/init.sql +-- PLC +CREATE DATABASE plc; +GRANT ALL PRIVILEGES ON DATABASE plc TO postgres; +``` + +### pds + +first, i think you need to get the pdsurl with oauth(session). if you have a session, you can perform operations such as posting. + +```sh +$ cd $dir/packages/frontpage +./lib/data/user.ts: const pdsUrl = await getPdsUrl(session.user.did); +``` + +it seems that drainpipe searches for `fyi.unravel.frontpage(collection)` in pds and commits it to firehose subscriberepos. if you change these two parts, it will not work with `frontpage.fyi`. + +```rust +// https://github.com/likeandscribe/frontpage/blob/e7444ec6c19f0ccef3776f04702c3bb033ed3bfc/packages-rs/drainpipe/src/main.rs#L66-L97 +// RELAY_URL=wss://bsky.network +let mut ws_request = format!( + "{}/xrpc/com.atproto.sync.subscribeRepos{}", + relay_url, query_string +) + +/// Process a message from the firehose. Returns the sequence number of the message or an error. +async fn process(message: Vec, ctx: &mut Context) -> Result { + let (_header, data) = firehose::read(&message).map_err(|e| ProcessError { + inner: e.into(), + seq: -1, + source: message.clone().into(), + kind: ProcessErrorKind::DecodeError, + })?; + let sequence = match data { + firehose::SubscribeRepos::Commit(commit) => { + let frontpage_ops = commit + .operations + .iter() + .filter(|op| op.path.starts_with("com.unravel.example.")) + //.filter(|op| op.path.starts_with("fyi.unravel.frontpage.")) + .collect::>(); + if !frontpage_ops.is_empty() { + process_frontpage_ops(&frontpage_ops, &commit, &ctx) + .map_err(|e| ProcessError { + seq: commit.sequence, + inner: e, + source: message.clone().into(), + kind: ProcessErrorKind::ProcessError, + }) + .await?; + } + commit.sequence + } + msg => msg.sequence(), + }; + + Ok(sequence) +} +``` + +## other + +### license view + +```html +// https://github.com/likeandscribe/frontpage/blob/de31aedf73c4e80e7376cf73c7c054437563f2ab/packages/frontpage/app/layout.tsx#L28-L52 ++
'}} /> +``` + +### admin view + +```sh +# https://github.com/likeandscribe/frontpage/blob/7fccf20fa800ba25fd57db279033ddf2cc92e9ce/packages/frontpage/lib/constants.ts +./lib/constants.ts:export const FRONTPAGE_ATPROTO_HANDLE = "admin.example.com"; + +# https://github.com/likeandscribe/frontpage/blob/cf8a4cb8bc7bab54407972964f8d39bf5e7c9182/packages/frontpage/app/(app)/layout.tsx#L55-L66 +./app/\(app\)/layout.tsx:@admin.example.com +``` + diff --git a/docker/python-oauth-web-app/Dockerfile b/github/python-oauth-web-app/Dockerfile similarity index 69% rename from docker/python-oauth-web-app/Dockerfile rename to github/python-oauth-web-app/Dockerfile index 86e031f..42dcf64 100644 --- a/docker/python-oauth-web-app/Dockerfile +++ b/github/python-oauth-web-app/Dockerfile @@ -4,4 +4,4 @@ WORKDIR /app COPY . . RUN pacman -Syu rye --noconfirm RUN rye sync -#CMD ["rye", "run", "flask", "run"] + diff --git a/github/python-oauth-web-app/app_add.py b/github/python-oauth-web-app/app_add.py new file mode 100644 index 0000000..f8e0492 --- /dev/null +++ b/github/python-oauth-web-app/app_add.py @@ -0,0 +1,3 @@ +@app.route("/about") +def aboutpage(): + return render_template("about.html") diff --git a/docker/python-oauth-web-app/compose.yml b/github/python-oauth-web-app/compose.yml similarity index 75% rename from docker/python-oauth-web-app/compose.yml rename to github/python-oauth-web-app/compose.yml index 58fa04b..f915dd5 100644 --- a/docker/python-oauth-web-app/compose.yml +++ b/github/python-oauth-web-app/compose.yml @@ -7,4 +7,4 @@ services: - "5000:5000" volumes: - ./demo.sqlite:/app/demo.sqlite - command: rye run flask run + command: rye run flask run --host=0.0.0.0 diff --git a/github/python-oauth-web-app/templates/about.html b/github/python-oauth-web-app/templates/about.html new file mode 100644 index 0000000..f9a1a42 --- /dev/null +++ b/github/python-oauth-web-app/templates/about.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} +{% block content %} + +

service

+

This service allows you to comment on live broadcasts using your atproto account.

+ +

system

+

Display posts to BBS using atproto oauth.

+

This service is generated using bluesky/cookbook.

+

Authentication information will be deleted periodically.

+
+ +

サービス

+

このサービスはlive配信にatprotoアカウントを使ってコメントができます。

+

システム

+

atproto oauthを使用してbbsへの書き込みを許可します。

+

このサービスはbluesky/cookbookを使用して生成されています。

+

認証情報は定期的に削除されます。

+ +{% endblock %} diff --git a/github/python-oauth-web-app/templates/base.html b/github/python-oauth-web-app/templates/base.html new file mode 100644 index 0000000..710fd4d --- /dev/null +++ b/github/python-oauth-web-app/templates/base.html @@ -0,0 +1,114 @@ + + + + + + + + + + o.syui.ai + + +
+
+ {% if g.user %} + {% endif %} +
+ +
+ +
+
+ {% for message in get_flashed_messages() %} +
{{ message }}
+ {% endfor %} + {% block content %}{% endblock %} +
+
+ + +
©syui
+ + diff --git a/github/python-oauth-web-app/templates/bsky_post.html b/github/python-oauth-web-app/templates/bsky_post.html new file mode 100644 index 0000000..acec60e --- /dev/null +++ b/github/python-oauth-web-app/templates/bsky_post.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+ + +
+{% endblock %} diff --git a/github/python-oauth-web-app/templates/error.html b/github/python-oauth-web-app/templates/error.html new file mode 100644 index 0000000..76fc860 --- /dev/null +++ b/github/python-oauth-web-app/templates/error.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block title %}Error{% endblock %} + +{% block content %} +

⚠️ Error {{ status_code }} ⚠️

+{% if err.description %} +

{{ err.description }}

+{% else %} +

Something went wrong!

+{% endif %} +

Start Over

+{% endblock %} diff --git a/github/python-oauth-web-app/templates/favicon.png b/github/python-oauth-web-app/templates/favicon.png new file mode 100644 index 0000000..6aeb218 Binary files /dev/null and b/github/python-oauth-web-app/templates/favicon.png differ diff --git a/github/python-oauth-web-app/templates/favicon.svg b/github/python-oauth-web-app/templates/favicon.svg new file mode 100644 index 0000000..bca17d6 --- /dev/null +++ b/github/python-oauth-web-app/templates/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/github/python-oauth-web-app/templates/home.html b/github/python-oauth-web-app/templates/home.html new file mode 100644 index 0000000..1d56aaf --- /dev/null +++ b/github/python-oauth-web-app/templates/home.html @@ -0,0 +1,29 @@ +{% extends 'base.html' %} +{% block content %} + +
+
+
+ +
+
+
+ {% if g.user %} + @{{ g.user['handle'] }} +
+ +
+ {% else %} +
+ + +
+
+

write comment using oauth atproto.

+
+ {% endif %} +
+ +
+ +{% endblock %} diff --git a/github/python-oauth-web-app/templates/login.html b/github/python-oauth-web-app/templates/login.html new file mode 100644 index 0000000..a000403 --- /dev/null +++ b/github/python-oauth-web-app/templates/login.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Login with atproto

+
+

Provide your handle or DID to authorize an existing account with PDS. +
You can also supply a PDS/entryway URL (eg, https://pds.example.com).

+
+ + +
+
+
+{% endblock %} diff --git a/docker/restreamer/compose.yaml b/github/restreamer/compose.yaml similarity index 100% rename from docker/restreamer/compose.yaml rename to github/restreamer/compose.yaml diff --git a/docker/rust-bbs/Cargo.toml b/github/rust-bbs/Cargo.toml similarity index 100% rename from docker/rust-bbs/Cargo.toml rename to github/rust-bbs/Cargo.toml diff --git a/docker/rust-bbs/Dockerfile b/github/rust-bbs/Dockerfile similarity index 54% rename from docker/rust-bbs/Dockerfile rename to github/rust-bbs/Dockerfile index 910bd0b..658c0fa 100644 --- a/docker/rust-bbs/Dockerfile +++ b/github/rust-bbs/Dockerfile @@ -1,7 +1,8 @@ FROM syui/aios WORKDIR /app -COPY . . +COPY ./src ./src +COPY ./templates ./templates +COPY ./Cargo.toml ./Cargo.toml RUN cargo build --release -COPY ./templates /templates CMD ["/app/target/release/rust-bbs"] diff --git a/docker/rust-bbs/compose.yml b/github/rust-bbs/compose.yml similarity index 81% rename from docker/rust-bbs/compose.yml rename to github/rust-bbs/compose.yml index 3b65404..d4e3dd7 100644 --- a/docker/rust-bbs/compose.yml +++ b/github/rust-bbs/compose.yml @@ -2,6 +2,6 @@ services: web: build: . ports: - - "8782:8782" + - 8080:8080 volumes: - ./sqlite.db:/app/sqlite.db diff --git a/docker/rust-bbs/src/main.rs b/github/rust-bbs/src/main.rs similarity index 82% rename from docker/rust-bbs/src/main.rs rename to github/rust-bbs/src/main.rs index 3ac4d66..a970690 100644 --- a/docker/rust-bbs/src/main.rs +++ b/github/rust-bbs/src/main.rs @@ -79,13 +79,13 @@ async fn submit_post( .unwrap_or_else(|_| web::Query(QueryParams { handle: None })); //let handle = query.handle.clone().filter(|h| !h.is_empty()); //println!("Debug: Extracted handle: {:?}", handle); - let handle = if !form.handle.is_empty() { - form.handle.clone() - } else { - query.handle.clone().unwrap_or_default() - }; +let handle = if !form.handle.is_empty() { + form.handle.clone() +} else { + query.handle.clone().unwrap_or_default() +}; - println!("Debug: Using handle: {:?}", handle); +println!("Debug: Using handle: {:?}", handle); let conn = Connection::open("sqlite.db") .map_err(|_| ErrorInternalServerError("Database connection failed"))?; @@ -94,19 +94,19 @@ async fn submit_post( &[&form.handle, &form.content], ); match result { - Ok(_) => { - let redirect_url = if !handle.is_empty() { - format!("/?handle={}", handle) - } else { - "/".to_string() - }; - Ok(HttpResponse::SeeOther() - .append_header(("Location", + Ok(_) => { + let redirect_url = if !handle.is_empty() { + format!("/?handle={}", handle) + } else { + "/".to_string() + }; + Ok(HttpResponse::SeeOther() + .append_header(("Location", redirect_url)) - .finish()) - }, + .finish()) + }, - //Ok(_) => Ok(web::Redirect::to("/").see_other()), + //Ok(_) => Ok(web::Redirect::to("/" + "?handle=" + handle).see_other()), Err(_) => Err(ErrorInternalServerError("Failed to insert post")), } } @@ -121,7 +121,7 @@ async fn main() -> std::io::Result<()> { .route("/post", web::get().to(post_form)) .route("/submit", web::post().to(submit_post)) }) - .bind("0.0.0.0:8782")? - .run() - .await + .bind("0.0.0.0:8080")? + .run() + .await } diff --git a/github/rust-bbs/templates/index.html b/github/rust-bbs/templates/index.html new file mode 100644 index 0000000..135db2c --- /dev/null +++ b/github/rust-bbs/templates/index.html @@ -0,0 +1,79 @@ + + + + Simple BBS + + +
+
+ + + +
+
+
+
    + {% for post in posts %} +
  • {{ post }}
  • + {% endfor %} +
+
+ + + + + + + diff --git a/docker/rust-bbs/templates/post.html b/github/rust-bbs/templates/post.html similarity index 100% rename from docker/rust-bbs/templates/post.html rename to github/rust-bbs/templates/post.html diff --git a/slidev/.gitignore b/github/slidev/.gitignore similarity index 100% rename from slidev/.gitignore rename to github/slidev/.gitignore diff --git a/slidev/.npmrc b/github/slidev/.npmrc similarity index 100% rename from slidev/.npmrc rename to github/slidev/.npmrc diff --git a/slidev/README.md b/github/slidev/README.md similarity index 100% rename from slidev/README.md rename to github/slidev/README.md diff --git a/slidev/components/Counter.vue b/github/slidev/components/Counter.vue similarity index 100% rename from slidev/components/Counter.vue rename to github/slidev/components/Counter.vue diff --git a/slidev/netlify.toml b/github/slidev/netlify.toml similarity index 100% rename from slidev/netlify.toml rename to github/slidev/netlify.toml diff --git a/slidev/package.json b/github/slidev/package.json similarity index 100% rename from slidev/package.json rename to github/slidev/package.json diff --git a/slidev/pages/imported-slides.md b/github/slidev/pages/imported-slides.md similarity index 100% rename from slidev/pages/imported-slides.md rename to github/slidev/pages/imported-slides.md diff --git a/slidev/slides.md b/github/slidev/slides.md similarity index 100% rename from slidev/slides.md rename to github/slidev/slides.md diff --git a/slidev/snippets/external.ts b/github/slidev/snippets/external.ts similarity index 100% rename from slidev/snippets/external.ts rename to github/slidev/snippets/external.ts diff --git a/slidev/vercel.json b/github/slidev/vercel.json similarity index 100% rename from slidev/vercel.json rename to github/slidev/vercel.json diff --git a/issue/screenshots/issue-9-0001.png b/img/issue-9-0001.png similarity index 100% rename from issue/screenshots/issue-9-0001.png rename to img/issue-9-0001.png diff --git a/issue/screenshots/issue-9-0002.png b/img/issue-9-0002.png similarity index 100% rename from issue/screenshots/issue-9-0002.png rename to img/issue-9-0002.png diff --git a/issue/screenshots/issue-9-0003.png b/img/issue-9-0003.png similarity index 100% rename from issue/screenshots/issue-9-0003.png rename to img/issue-9-0003.png diff --git a/issue/screenshots/issue-9-0004.png b/img/issue-9-0004.png similarity index 100% rename from issue/screenshots/issue-9-0004.png rename to img/issue-9-0004.png diff --git a/img/wiki-frontpage-0001.png b/img/wiki-frontpage-0001.png new file mode 100644 index 0000000..7990327 Binary files /dev/null and b/img/wiki-frontpage-0001.png differ diff --git a/readme.md b/readme.md index 3174ea3..3fe3d49 100644 --- a/readme.md +++ b/readme.md @@ -17,4 +17,13 @@ |v0.2 β|support web| |v0.3 β|support vmc| +## service + +|title|url| +|---|---| +|game|https://ue.syui.ai| +|live|https://live.syui.ai| +|chat|https://o.syui.ai| + +- https://o.syui.ai/post/syui.ai/3l7lj463zbo2m