Todaka Satoshi
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # ポートフォリオ(散歩くじ)レビュー ## サービスURL https://www.walking-lot.com/ ## 概要 - 「散歩くじ」は散歩の行先と目的をくじ引きのように提案するサービスです。 - 行先のタイプと出発地点を登録することで、くじの結果(行先とアクティビティ)が表示されます。 - 行先は、出発地点から半径約2km以内のスポットをランダムに取得して提示します。 - アクティビティは、予め用意したものの中から行先のタイプに応じたものをランダムで選択し、提示します。 - また、「寄り道スポット」として、目的地の他にも同様のスポットをユーザーに提示します。 - くじの結果はSNSで共有することができます。 # レビュー ## Kei 大前提として、操作方法もシンプルで手軽に遊べる面白いアプリだと思いました!! 全体的なやわらかいデザイン的もアプリの雰囲気とマッチしていると思います!くじを引くボタン押すと、何が出るんだろう?とワクワクする感覚がありました! レビューをいくつか書かせていただきましたが多々間違っている箇所もあるかもしれません🙇‍ ### UI - スマホで右上メニュークリックで表示するモーダルがメインビジュアル内のテキストやボタンよりも下層に配置されている? ![](https://i.imgur.com/ykVSnth.png) - くじの結果が好みではないのでもう一度引き直したい、という需要もあるかもしれないので、出発地点の変更はせずにもう一度くじを引く機能が有っても良いかもしれません! - 出発地点の検索サジェストですが、住所が最後まで見えるようになると嬉しいです!デザインの都合上難しいかもしれませんが… ![](https://i.imgur.com/2gTw5xx.png) - くじ引きに失敗したとき(「行きたい場所のタイプ」を選択せずにくじを引いてしまった場合や、くじを引いた結果スポットが見つからなかった場合)に出発地点の情報が消えてしまい、改めて入れ直す手間があるので、出発地点情報は保持できると良いと思いました!(よくあるフォームのvalidationに引っかかったとしても値が保持されているイメージ) - 404ページを実装しても良いのかなと思いました! ![](https://i.imgur.com/bB5GLYU.png) ### コード - routes.rbの上部にあるルーティング一覧表示ですが、調べたところannotationの機能ですかね?こんなことできるなんて初めて知りました! - 管理者権限はアクティビティ管理だけですかね?ユーザー一覧などは見られない?rails_adminを使って実装されていたらすいません(使ったことがないもので) - [Notifications::ReadsController#create](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/notifications/reads_controller.rb#L4-L9)の中で`update!`メソッドが使われている?だとするとcreateアクションではなくてupdateアクションで良い気がします! - ↑のコントローラーの使い方、[この記事](https://postd.cc/how-dhh-organizes-his-rails-controllers/)や[この記事](https://tech.kitchhike.com/entry/2017/03/07/190739)を思い出しました! - ただの入力間違いだとは思いますが[エンドポイント設計](https://github.com/satoshitodaka/my_portfolio/blob/master/%E6%95%A3%E6%AD%A9%E3%81%8F%E3%81%98/summary.md#%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC)では「通知を既読にする」機能のHTTPリクエストがGETになっていました(エンドポイント設計と実際の実装では若干変更ありましたかね?エンドポイント設計ではnamespaceがmypageになっているので) - Lotモデルのset_destinatioメソッド内の[最後のif文](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/models/lot.rb#L58-L62)は`if...elsif`ではなく`if...else`で書ける?もしそうであれば三項演算子を使って短くできそう ```ruby= self.photo_url = destination_informations['photos'] ? destination_informations['photos'][0]['photo_reference'] : 'no_image' ``` - [ここ](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/lots_controller.rb#L8-L12)も以下のように三項演算子使える? ```ruby= # app/controllers/lots_controller.rb @lot = current_user ? current_user.lots.new(lot_params) : Lot.new(lot_params) ``` - 好みの問題かもしれませんが、関連先のテーブルを作成するときは`new`ではなく`build`メソッドを使うイメージなのですがどうでしょう?(エイリアスなのでどちらでも良いという結論になりそう笑)→例えば[ここ](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/lots_controller.rb#L9) - (自信無いのでだいそんさんに解説してもらいたいです🙇‍)[LotsController#create](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/lots_controller.rb#L14-L32) の中でif文がネストしているため、もっと綺麗に書けないかなと思うのですが、以下のような書き方はできますか?(すいません、renderの返り値に関して自信無いです) ```ruby= render :new, status: :unprocessable_entity and return unless @lot.valid? # renderの引数が2つあるのでこのままではandが機能しないかもしれません if @lot.nearby_locations['status'] == 'OK' # 省略 elsif @lot.nearby_locations['status'] = 'ZERO_RESULTS' # 省略 end ``` - ↑の`if...elsif`文ですが`if..else`文で書いていない理由がありますかね?`nearby_locations['status']`には`'OK'`と`'ZERO_RESULTS'`以外が入ることは無いのでしょうか? - Admin::ActivitiesController内の[create_notification_about_activity_updatedメソッド](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/admin/activities_controller.rb#L37-L43) ですが、少しメソッド名が長い気がするので`create_notification`だけでも良いと思います!あと、呼び出しもとで引数に@activityを指定されていますが、インスタンス変数なのでメソッド内から直接参照できると思うので引数は不要かと思います(規定として、インスタンス変数はメソッド内から直接参照しない方が良いというものがあったらすいません) - [Mypage::ActivitiesController#destroy](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/mypage/activities_controller.rb#L45-L46)が空?(ルーティングは定義されているっぽい) - [Mypage::ActivitiesControllerの2つのプライベートメソッド](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/mypage/activities_controller.rb#L53-L67) が似てるのでひとつにできないですかね?呼び出しもとの引数が長くなって微妙かもですが…([create_notification_about_activity_updatedメソッド](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/admin/activities_controller.rb#L37-L43) も似ているので、`app/controllers/concernes`配下にmoduleを作ってincludeしても良いかもしれません) ```ruby= # 以下のメソッドを定義し、引数を指定して呼び出す def create_notification(title, url) notification = Notification.create!( title: title, url: url ) notification.notify(User.admin) end ``` - 配列化したものを[ここ](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/models/notification.rb#L19)で平坦化された理由を教えていただきたいです!([ここ](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/admin/activities_controller.rb#L42)で指定した引数を配列化したいということですかね?) ## sari ユーザー登録なしでも大部分のサービスを楽しめたり、使い方やヒントが随所に設置されていたりと、ユーザー目線の心配りを感じました。 アクティビティもわくわくします。 一度実際に使って散歩したいと思います! ### UI - フッターメニューのアイコンに文字が添えられていると初見でも迷いづらいかなと思います。 (私が以前dysonさんから指摘された内容です…🙋) - 使い方ページのページ内リンクの飛び先が、少しずれているようです。ヘッダーメニュー分の高さを含めたらピッタリになるかと思います - 使い方ページの番号部分が、フッターメニューより上層に表示されているようです。 <img src="https://i.imgur.com/PvymxZ2.png" width="300px"> - 散歩くじで提案される散歩コースの往復の所要時間の目安がどこかに書かれていると、散歩くじを使えるタイミングが分かってありがたいです。もしくは、散歩の所要時間をユーザーが選択できて、それに応じてGoogle Map APIへのリクエストのパラメータを変えるとか? - 寄り道スポットが0個の場合の表示は、寄り道スポットの欄まるごと非表示に? <img src="https://i.imgur.com/bPIieE7.png" width="300px"> ### コード - `OtherPlace` = 「寄り道スポット」というより「目的地の第二、第三候補」に表現として近いのかなと感じました! 「寄り道」というと、個人的には出発地点と目的地点の中点を中心とした円内にある点、のようなイメージです。目的地と逆の方向でそこそこ歩くような地点が寄り道として提案されるとギャップを感じそうです。 - 散歩くじの結果の出し方は、 [出発地から半径2km以内で目的地として条件に合う検索結果](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/models/lot.rb#L41)のうち[3件までランダムに取得して配列に入れ](https://github.com/satoshitodaka/walking_lot/blob/46ba77e078481882f7df269b0d9ff72d7d12fc34/app/controllers/lots_controller.rb#L52)、1個目を「目的地」、2~3個目を「寄り道スポット」に設定している、という理解です。 - 「寄り道スポット」の提案される範囲と寄り道の個人的なイメージ。 例)出発点:渋谷駅、目的地:目黒川、寄り道スポット:明治神宮 <img src="https://i.imgur.com/jLjjoVD.jpg" width="600px"> ## だいそん ### サービス面 - 使い方ページがあって親切で良い - 使い方がシンプルで良い - ハードルが高いですね笑 - [![Image from Gyazo](https://i.gyazo.com/c42e39bf42262412504c2d58690c79c8.png)](https://gyazo.com/c42e39bf42262412504c2d58690c79c8) - 寄り道、良いですね - [![Image from Gyazo](https://i.gyazo.com/0331bc88ba48861f1d7fdcdb1ca4d557.jpg)](https://gyazo.com/0331bc88ba48861f1d7fdcdb1ca4d557) - クリックして詳細に飛べないんでしょうか? - UIはなんだかんだテンプレートを使うのが良い気がする。 ### 実装面 - ルーティングの定義が書かれてて読みやすい - https://github.dev/satoshitodaka/walking_lot/blob/5255ab3dacae35d1d97a55da5cfb9b577758a80a/config/routes.rb#L118 - が、rails標準のルーティングは省いてもいいかも。active storageとかation mailboxとか。 - コントローラではなくモデルか何かに書いた方が良いかも - https://github.dev/satoshitodaka/walking_lot/blob/5255ab3dacae35d1d97a55da5cfb9b577758a80a/app/controllers/lots_controller.rb#L52-L62 - 2000は定数で持っておいた方が良いかも。そして距離を引数で受け取るようにするもあり。 - https://github.dev/satoshitodaka/walking_lot/blob/5255ab3dacae35d1d97a55da5cfb9b577758a80a/app/models/lot.rb#L41-L48 ```rb= DEFAULT_RADIUS = 2000 def get_nearby_locations(radius: DEFAULT_RADIUS) ``` みたいなイメージ。(動くかどうかは未検証です) - このバリーでションって必要でしたっけ? - https://github.dev/satoshitodaka/walking_lot/blob/5255ab3dacae35d1d97a55da5cfb9b577758a80a/app/models/lot.rb#L37-L38 - `self.photo_url = 'no_image'`はバグの温床になりそうな気がした - https://github.dev/satoshitodaka/walking_lot/blob/5255ab3dacae35d1d97a55da5cfb9b577758a80a/app/models/lot.rb#L61-L62 - createアクションが肥大化してる - https://github.com/satoshitodaka/walking_lot/blob/main/app/controllers/lots_controller.rb#L6-L34 ```rb= def create ActiveRecord::Base.transaction do if current_user @lot = current_user.lots.new(lot_params) else @lot = Lot.new(lot_params) end if @lot.valid? @lot.get_nearby_locations if @lot.nearby_locations['status'] == 'OK' @place_order_numbers = set_place_order_number(@lot) @lot.set_destination(@place_order_numbers) @lot.save LotActivity.create_with_lot(@lot) # 従属するモデルLotActivityを生成 OtherPlace.create_with_lot(@lot, @place_order_numbers) # 従属するモデルOtherPlaceを生成 redirect_to lot_path(@lot), success: 'くじを作成しました' elsif @lot.nearby_locations['status'] = 'ZERO_RESULTS' flash.now[:info] = '近くにスポットがありませんでした。条件を変えてもう一度引いてください。' render :new, status: :unprocessable_entity end else render :new, status: :unprocessable_entity end end end ``` こんな感じで書けるようになったらベターかなと思いました。 ```rb= def create @lot_form = LotForm.new(lot_params: lot_params, current_user: current_user) if @lot_form.save redirect_to lot_path(@lot_form.lot), success: 'くじを作成しました' else flash.now[:info] = @lot_form.errors.full_messages render :new, status: :unprocessable_entity end end ``` ```rb= class LotForm include ActiveModel::Model attributes :current_user attributes :lot def initialize(lot_params:, current_user:) self.lot = Lot.new(lot_params) self.current_user = current_user end def save # ここでゴリゴリロジック描く # 失敗した時 errors.add(:base, "なんかエラーメッセージ") end end ``` ## junnosuke 使っていて楽しかったです。UIだけレビューさせていただきます。 コードまで追えませんでした。すみません。 ### UI - 使い方のフローでページに遷移するところを少し下に調整したほうが良さそうです。(上部が隠れてしまってる?) - さんぽクジのところのUIで真っ白だと同化して見辛いかなと感じました。→枠線が太くするor背景色をつける - (できたら)くじで選ばれたところまでのルートと時間とか出ると助かる→マップにアクセスすると見れるが、その前で見れたらいいかなと思います。 - アクティビティーに見出しがあるといいかなと。 [![Image from Gyazo](https://i.gyazo.com/b97aa0271222aff02aaf5cf866f105ea.png)](https://gyazo.com/b97aa0271222aff02aaf5cf866f105ea) - 出発地を選択して、いきたい場所のタイプを入れ忘れた時に、出発地が消えちゃって再入力が必要になるので、エラーになった時、データが残っていると助かります。 ## かろりーな 先日出先で使ってみました!楽しかったです。 - テキストで出発地点を入力する→地図上のピンを押して設定→くじを引く になると思うのですが、テキストで出発地点を入力するとそのまま出発地も設定できたら嬉しいなと思いました。 [![Image from Gyazo](https://i.gyazo.com/dbd11678bf783bcd76324a5c2c369c87.png)](https://gyazo.com/dbd11678bf783bcd76324a5c2c369c87) ## みけた みなさん書かれているとおり、気軽に試せて、楽しいアプリだなと思いました! 早速試そうと思います! 以下のページについてユーザー視点で気になったところを記載します!(https://www.walking-lot.com/lots/new) - 「左の所在地を入力する → 出てくる複数のピンから選んでクリック → くじを引く」というステップを踏む中で、「出てくる複数のピンから選んでクリック」が必要なことに気づきづらい。以下のような対策をするといいかも。 - 登録のヒントをクリックすると、gifの動画出てくる - くじを引くが「出てくる複数のピンから選んでクリック」まで活性化されない - どこまで情報がサーバー側に送信されるのか、保存されるのか気になるので、そのあたりを明記してくれるとありがたい - 範囲指定をユーザー側で指定できるとありがたい - 「アクティビティにチャレンジする」の部分が、若干唐突に出てくるような気がして、初見だと何を指しているのか意味が分かりづらかったです あと、散歩のススメのページが好きです。Wantedlyだと給与や条件面をあえて求人ページに書けない仕様になっているようですが、2kmというところでFIXになっている背景には、もしかしたらそうした理由があるのかなと想像しました。 https://www.walking-lot.com/tips_to_enjoy ## maru 面白いアプリですね! ちょっと触ってみた感想を一般ユーザー目線でレビューさせていただきます。 - 出発地点の登録部分で、「マップ上で指定してください」という説明があると親切かなと思いました。出発地が「自動入力されます」とありますが、感覚的に出発地の部分に直接入力したくなりました。どうしたら自動入力されるのかがわかりづらいかも? - 地図上で「ここから歩く」を押したときに、ボタンの見た目に変化がないので出発地に反映されているかどうかがわかりづらいと思いました。何回も押してしまいました。 - 散歩くじの引き直しをすると出発地点が消えるのは私も気になりました。 - 寄り道スポットのみの引き直しもできたら、より良いかなと思います。目的地が気に入っても寄り道スポットが気に入らない場合が考えられるので。 - 以前おっしゃっていた散歩アクティビティが記載されている部分にタイトルがあると良いなと思います。アクティビティの部分がどういう意味なのか初見ユーザーは分かりづらいと思います。 - 散歩のメリットを紹介しているのいいですね! - 頑張ってください!

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully