The Ambassadors
      • 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
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners 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
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Help
Menu
Options
Engagement control 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
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners 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
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    ###### tags: `guides` `resources` # Ultimate Symbol Node Guide [![hackmd-github-sync-badge](https://hackmd.io/Z7ErI0IZQ5Wer1s5-6wjpw/badge)](https://hackmd.io/Z7ErI0IZQ5Wer1s5-6wjpw) ## How to run a Symbol Node on CentOS 8 (for beginners) #### From Zero to Hero. Guide by [CB](http://xym.farm). This time I will explain and show you step by step how to prepare and run a Symbol Node on a RS (root server) with CentOS 8. First thing you have to know is that you don't need to hold XYM to run a Symbol Node on your own or rented server. ### Other useful Symbol node guides: :::spoiler * *Running a Symbol node official guide* https://docs.symbolplatform.com/guides/network/running-a-symbol-node.html * *The 23 € Symbol Node by* Fernando Boucquez https://dev.to/fboucquez/the-23-symbol-node-3c41 * *How to setup a $40 Symbol Node on Allnodes* by Allnodes (Min. 10k XYM required) https://help.allnodes.com/en/articles/5119173-how-to-setup-a-symbol-harvester-node-or-supernode-on-allnodes * *Symbol Node Resource Guide* by Sekoya Labs https://medium.com/@sekoyalabs/symbol-node-resource-guide-41237e10a07b * *How to Run Symbol Node with Docker Desktop Windows 10* by Hexagon https://community.nem.io/cboard/activity/38154-how-to-run-symbol-node-with-docker-desktop-windows-10/ ::: --- Ok, so assuming you’ve decided to follow my guide, here we go: First off, you need a server running CentOS 8. If you already have one, skip to "**Connecting to your server**". Make sure to check the Hardware requirements before you rent a server. ### Minimum node specifications :::spoiler | Requirement | Peer node | API node | | ----------- | ------------- | ------------- | | CPU | 2 cores | 4 cores | | RAM | 8GB | 16GB | | Disk size | 500 GB | 750 GB | | Disk speed | 1500 IOPS SSD | 1500 IOPS SSD | ::: --- ### Recommended node specifications :::spoiler | Requirement | Peer node | API node | Dual & Voting node | | ----------- | ------------- | ------------- | ------------------ | | CPU | 4 cores | 8 cores | 8 cores | | RAM | 16GB | 32GB | 32GB | | Disk size | 500 GB | 750 GB | 750 GB | | Disk speed | 1500 IOPS SSD | 1500 IOPS SSD | 1500 IOPS SSD | ::: --- ### A list of websites from where you can rent a root server based on your needs. :::spoiler Only Netcup and Contabo servers have been tested so far. It’s better and essential that we don’t rent our servers all from the same place and try to spread across the globe, so if you live in the USA, you could try to host a server in the USA or close by. Some websites might even require some time to process your information (KYC) before you are able to start with your node’s installation. ### https://www.netcup.eu/vserver/ AMD EPYC™ 7702 - RS 2000 G9 starting at €16 / month (stable – tested on mainnet and testnet) - GER - 16 GB DDR4 RAM (ECC) - 4 dedicated cores - 320 GB SSD ![](https://i.imgur.com/uKHKaSv.png) -- #### https://contabo.com/en/vps VPS S SSD starting at €4,99 / month - GER, US (central), US (east), US (west), ASIA - CPU Cores: 4 - 8 GB - 200 GB SSD ![](https://i.imgur.com/QpXFA8n.png) -- #### https://zap-hosting.com/en/shop/product/linux-rootserver/ Root linux server starting at €12,90 / month (I haven’t tested it yet - make your custom server based on your needs or requirements) - GER, UK, FIN, USA, CA, BRA, AU, ASIA - CPU Cores: 4 - 16GB DDR4 RAM - 320 GB SSD ![](https://i.imgur.com/kpgNkjI.png) --- #### https://www.strato.nl/server/dedicated-server-linux/ AMD Opteron 4180 - DEDICATED LINUX SERVER D200 starting at €31 / month - NL - 6 x 2,6 GHz - 16 GB RAM - 2 TB HDD ![](https://i.imgur.com/zfN7uRC.png) ::: --- *I suggest you follow the next steps after you have access to your server control panel. Usually you get a welcome email from your hosting.* Some servers might come with a preinstalled OS, so you’ll have to go in your SCP (server control panel), media / images and install CentOS 8 ### How to install CentOS 8 from your server's control panel :::spoiler ![](https://i.imgur.com/rQKdZFY.png) Access your SCP by going to https://www.servercontrolpanel.de From here you go to Media / Images / Distribution → CentOS 8 (Minimal...) ![](https://i.imgur.com/TRxsYDQ.png) Next click Minimal / minimal system with ssh preinstalled ![](https://i.imgur.com/UOEHlUG.png) Now you have 2 options: small partition layout for individual use one big partition with Os as root partition. Installation may take longer to finish I went for one big partition, because if you remember, you need at least 750 GB (peer 500 GB and api 750 GB) to run a dual node, based on the minimum requirements, but for the moment you can get it running without a problem with a 320GB HDD. Later we’ll have to upgrade to a much more powerful server or if your platform permits it, just modify your plan. ![](https://i.imgur.com/4VLpOhE.png) If you proceed with this all the data on your server will be deleted and you will get a fresh copy of CentOS 8. In the next step you’ll have to type in your SCP login password and click on reinstall. **“If you start the reinstall, all data on the hard disk will be purged. The server will be reinstalled with the values displayed above.”** ![](https://i.imgur.com/lYtmLHM.png) Server stopped copy of image running ![](https://i.imgur.com/M97jFOs.png) Starting server ![](https://i.imgur.com/h5nbNZk.png) Installation running (you can close the window that popped-up) ![](https://i.imgur.com/zszYhLp.png) If you’re wondering what is that pop-up, it’s exactly what’s happening on your server right now: files and packages are being installed... Installation running wait or do other things meanwhile ![](https://i.imgur.com/4inE0ss.png) Installation finished. ![](https://i.imgur.com/C5KyYU5.png) Now that CentOS 8 is running on your server, you know your ip/hostname and root password, we can proceed to the next step. What’s the next step? Connecting to your server. ::: --- ### Connecting to your server :::spoiler You can connect to your server either by using your console “ssh root@YourIP” ![](https://i.imgur.com/1WV0DOX.png) or by using a small program called Putty. You can download it from putty.org I’m always using Putty because old habits die hard :) ![](https://i.imgur.com/VpAk8ez.png) Write your server’s ip/hostname or copy/paste it in the “Host Name (or IP address)” field, and click Open. ``` Login as: root root@YourIP’s password: Paste your password with right click ``` Copy / Paste (right click) the root password you got in your email or in the control panel window of your CentOS 8 installation. After you’ve successfully logged in with your root username, your screen should look similar to this: ![](https://i.imgur.com/IRNhwOu.png) ::: --- #### For the next steps make sure you copy / paste each command, one at a time. **Make sure you don't type any extra characters or spaces. The smallest changes in code will result in error.** ### Creating a new user account :::spoiler ### Use following command to create the user account symbolnode: `adduser symbolnode` Set the password for the freshly created user account with the following command: `passwd symbolnode` [enter new password twice] Add the user to the sudo-enabled usergroup (we need the sudo command for installation later) and switch to the symbolnode useraccount: ``` usermod -aG wheel symbolnode su - symbolnode ``` ::: ### Install environment requirements :::spoiler ### Install and configure docker with the following commands: `sudo yum install -y yum-utils` ``` sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ``` `sudo yum install docker-ce docker-ce-cli containerd.io -y` `sudo usermod -aG docker symbolnode` `sudo systemctl start docker` `sudo systemctl enable docker` Install docker-compose with the following commands: `sudo dnf install curl` `sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose` `sudo chmod +x /usr/local/bin/docker-compose` Install node.js with the following commands: `sudo dnf module enable nodejs:12` `sudo dnf install nodejs -y` Install Nano with following command: `sudo yum install nano` **Reboot your server and login with the symbolnode user account we have created earlier.** Verify environment requirements To verify that the environment installations were successful, we can run following commands: For docker, run: `sudo docker run hello-world` The output should be similar to: *Hello from Docker! This message shows that your installation appears to be working correctly. [...] For more examples and ideas, visit: https://docs.docker.com/get-started/* For docker-compose, run: `docker-compose version` The output should be similar to: *docker-compose version 1.28.5, build c4eb3a1f docker-py version: 4.4.4 CPython version: 3.7.10 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019* For node.js, run: `node --version` The output should be similar to: *V12.21.0* Once you have verified your docker-compose version and node version, you can continue with the installation of symbol-bootstrap. ::: ### Install and configure symbol-bootstrap :::spoiler ### Use the following command to install symbol-bootstrap: `sudo npm install -g symbol-bootstrap` Before we run it, we will create a custom configuration file *custom.yml* with *Nano*. In this file we need to add the following: *maxUnlockedAccounts* - is the maximum number of users allowed to harvest on your node *friendlyName* - is the name of your node *host* - is the IP address of your node (can also be a domain name that you link to your server's ip) *BeneficiaryAddress* - is the Symbol Account which will get the node operator fee. *minFeeMultiplier* - is the minimum fee multiplier accepted by the node being queried Run the following command to create and open your *custom.yml*: `nano custom.yml` Paste your config, for example: ``` maxUnlockedAccounts: 100 nodes: - friendlyName: 'Name Of Your Node' host: IP or Hostname beneficiaryAddress: YourSymbolAddress minFeeMultiplier: 10 ``` When you are done editing press *CTRL + O* to write the new changes to your custm.yml file and press *ENTER*. *CTRL + X* to quit file. Since 31 Mar 2021 TransactionSelectionStrategy's new default value is oldest so we don’t need to add it in the custom.yml For more configuration properties, check Configuring node properties — Symbol Documentation 16 Now we are finally ready to run symbol-bootstrap with custom.yml for the first time! To do so, use the following command: `symbol-bootstrap start -p mainnet -a dual -c custom.yml` [enter password] ***Enter a strong password, this password will be used to encypt files on your node, including the private keys of the node accounts Let it run for 2-3 minutes, then stop it by pressing CTRL + C. Before we run it again, we want to save our node accounts (including private keys).*** To do so, decrypt the addresses.yml file with the following command: `symbol-bootstrap decrypt --source target/addresses.yml --destination plain-addresses.yml` [enter the password you have just used to encrypt the files] This will create a new file plain-addresses.yml which is readable. Open the plain-addresses.yml with following command: `nano plain-addresses.yml` Write down the privatekeys of every account, you can use them to restore the accounts in case you have to. After you have all information written down, close it by pressing *CTRL + X*. **Don't forget to remove this file from the server with following command**: `rm plain-addresses.yml` ### Running the node After installation and configuration you are ready to run your node Use following command: `symbol-bootstrap start -p mainnet -a dual -c custom.yml -d` [enter the password you have used to encrypt the files] -p mainnet states that we are using the mainnet -a dual states that we are running a dual (peer and API) node -c custom states that we are using a custom configuration file -d detached mode, symbol bootstrap will run in the background. To check if your symbol-bootstrap was installed correctly run: `symbol-bootstrap verify` To get a full list of different presets, check [Using Symbol Bootstrap — Symbol Documentation](https://docs.symbolplatform.com/guides/network/using-symbol-bootstrap.html) Validate the setup Connect to your node via web, check that the following URLs return valid data. http://YourNodesIP:3000/node/info for node health. http://YourNodesIP:3000/chain/info for node connection to the mainnet. ::: ### Updating symbol-bootstrap :::spoiler **You don't need to update your symbol-bootstrap if you've just installed it.** ### To update the version of symbol-bootstrap, use following commands: `symbol-bootstrap stop` `cp -r target target_backup` `sudo npm install -g symbol-bootstrap` `symbol-bootstrap start -p mainnet -a dual -c custom.yml --upgrade -d` Check the version by running: `symbol-bootstrap --help` If update was successful, remove backup of target folder: `rm -r target_backup` ::: --- ### Useful commands :::spoiler To stop your node use: `symbol-bootstrap stop` To check if symbol-bootstrap runs without problems use: `symbol-bootstrap healthCheck` To update your config, use: ```nano custom.yml``` It’s recommended to backup the target folder before you do this in case you mess things up. When you are done editing press CTRL + O to write the new changes to your custm.yml file and press ENTER. CTRL + X to quit file and run: ```symbol-bootstrap stop``` ```symbol-bootstrap start -p mainnet -a dual -c custom.yml --upgrade -d``` To start fresh with symbol-bootstrap, for example if you experience problems with the config, use following commands: `symbol-bootstrap stop` `docker system prune -a` `sudo rm -r target` ::: --- ### How to link your node's IP to a hostname / domain name :::spoiler First you need a domain. If you don't have one, get one. 1. Create a subdomain like node.YourDomain.com from your domain's hosting website. Example: node.YourDomain.com 2. Redirect it to http://YourNodeIP Example: http://202.101.250.1 ![](https://i.imgur.com/sBsuk9o.png) 3. From your DNS Zone Editor, edit your subdomain's ip to YourNode'sIP (without http) ![](https://i.imgur.com/uIub2Si.png) 4. Check if the redirect works. It might take from a few minutes to a few hours. Example: node.YourDomain.com:3000/node/health If you see something like this, it means the redirect has been done and working. ![](https://i.imgur.com/p9UlG9d.png) 5. Go to your Customer Control Panel in your server's host. In my case it's https://www.customercontrolpanel.de 6. Change your rDNS to your newly created subdomain for your node Example: node.YourDomain.com ![](https://i.imgur.com/hMFrHiS.png) 7. Login to your server using symbolnode username 8. Write `nano custom.yml` to edit your custom.yml file. ![](https://i.imgur.com/O2mYa0D.png) 9. Change host from YourIP to YourDomain ![](https://i.imgur.com/fbO0Sev.png) 10. Once you are done editing your custom.yml file, CTRL + O to save, ENTER, CTRL + X to exit 12. Now you'll have to restart your symbol-bootstrap To do this copy / paste the following commands one at a time. `symbol-bootstrap stop` Wait for bootstrap to stop `symbol-bootstrap start -p mainnet -a dual -c custom.yml --upgrade -d` Wait for bootstrap to start To check if symbol-bootstrap runs without problems use: `symbol-bootstrap healthCheck` ![](https://i.imgur.com/puPZTeA.png) 12. Go to [Symbol Explorer](http://explorer.symbolblockchain.io/nodes) and look for your node. ![](https://i.imgur.com/56zTlfv.png) It might take a few minutes for the changes to take place so don't get impatient if you don't see it right away. ::: --- ### How to promote your Symbol node :::spoiler 1. Create a social media page dedicated to your node or use your own social media accounts to promote it. 2. Add your node's link in your bio and say something like: "Delegate to my node: ip/hostname:3000" 3. Make a dedicated and simple website for your node. 4. Talk about harvesting and share your node's hostname/ip with your followers, friends and other community members. Example: http://xym.farm ::: ### How to get your node listed on https://symbol-tools.com/symbolTools/view/tool/nodeList.html :::spoiler ![](https://i.imgur.com/1XX8oGq.png) 1. Send a minimum transaction of 10XYM to NBQTX4-XC7U3C-ZEVJU3-32KMFU-HO4KSR-N665FS-B2A including a message like the one you will see below. **The transaction must be sent from the node's main symbol address, not from the beneficiary address.** You can find your node's main address on http://explorer.symbolblockchain.io/nodes ![](https://i.imgur.com/Qb2GUzb.jpg) *If you already have access to your node's main address keep following the guide, otherwise skip to the next step and come back when you have access to your main node's address.* #### To: NBQTX4-XC7U3C-ZEVJU3-32KMFU-HO4KSR-N665FS-B2A #### Mosaic (1/1): 10 (XYM) #### Message: {"limitHarvesterCount": "Number of max harvesters", "twitterAccount": "YourTwitterAccount", "comment": "Description of your node or any information you want to share with your potential future harvesters", "detailUrl": "YourNodeHostname"} * limitHarvesterCount - max harvesters * twitteraccount without @ * comment: your node's description * detailUrl: URL of the webpage that describes the details of your node or any other webpage. 2. To get on top of the list as you can see in the picture below, send a transaction from the **node's main symbol account** to the same address. NBQTX4-XC7U3C-ZEVJU3-32KMFU-HO4KSR-N665FS-B2A Every XYM you donate to the developers of this tool gets you higher in "rank". ![](https://i.imgur.com/fZ0vAxb.png) Here you can see the ranking for people who donated XYM: "XYM donations list for the last two weeks" https://symbol-tools.com/symbolTools/view/tool/donateAdGuide.html ![](https://i.imgur.com/4iLPy5l.png) If want to have your node on top of the list, you'll have to donate more than the one who's on the spot you wish to be on. ::: --- ### How to get your node's main address private key and add it in your Symbol Wallet :::spoiler In order to send a transaction from your node's main symbol address, you need the private key. If you don't have it, you can get it by connecting to your server with your symbolnode username and by using the following commands: `cd target` - accessing target folder `symbol-bootstrap decrypt --source addresses.yml --destination decrypt.yml` - decrypting adresses.yml [Enter password] `nano decrypt.yml` - accessing decrypt.yml file Copy your the private key for your main node's address and press *CTRL + X* to quit file. `rm decrypt.yml` - removing decrypt.yml `exit` - exit console Now you need to import your private key in your Symbol Wallet so you can send the needed transaction. 1. Login in your Symbol Wallet using your Symbol profile 2. Go to Accounts 3. Press " + Add an account" ![](https://i.imgur.com/y8OlPaB.png) 5. Select the type of account: I want to import an existing account private key ![](https://i.imgur.com/jYjEDIN.png) 7. Name your account, enter private key and your symbol wallet password and click "Confirm". Your node's main account will show under "Private key accounts". After adding your node's main address in your Symbol Wallet, go back to the last step and continue the guide on "How to get your node listed on https://symbol-tools.com/symbolTools/view/tool/nodeList.html" ::: --- ### How to monitor your node on Telegram with [@XymHarvestMonitorbot](https://t.me/XymHarvestMonitorbot) :::spoiler This bot will help you monitor your node and wallet. You will get notified every time: * Your node's health check has failed / was succesful ![](https://i.imgur.com/ZcODuPh.png) * One of your delegated harvesters has harvested a block on your node ![](https://i.imgur.com/OiGiR7e.png) * You received a new transaction ![](https://i.imgur.com/g2zFf9C.png) * You gain or lose a harvester ![](https://i.imgur.com/bHktD3l.png) DM [@XymHarvestingMonitorbot](https://t.me/XymHarvestMonitorbot) and click START. Next type `/language` and Click on `/language 0 英語`. Your language has changed from Japanese to English. ![](https://i.imgur.com/fNfUvPz.png) 英語 = English in Japanese ### Node commands: `/addnode` domain name - Add one of your nodes `/nodestatus` - Check node status `/removenode` - Remove one of your nodes ### Wallet commands: `/add` address name - Add one of your wallets `/update` :address :newname - Change the name of a wallet `/remove` :address - Remove one of your wallets `/addresses` - List the addresses of all wallets grouped by the users `/balance` - List the balances of all wallets `/harvest` - List the harvestcount & totalfee of all wallets `/setserver` - Set Delegated ServerName ### Other commands: `/language` - 表示言語を変更します。 `/notify` - Change notification mode `/txnotify` - Change transaction notification mode `/tweet` - Change tweet link mode ::: ---

    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