In-browser Markdown editor

Overview

StackEdit

Build Status NPM version

Full-featured, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.

https://stackedit.io/

Ecosystem

Build

# install dependencies
npm install

# serve with hot reload at localhost:8080
npm start

# build for production with minification
npm run build

# build for production and view the bundle analyzer report
npm run build --report

Deploy with Helm

StackEdit Helm chart allows easy StackEdit deployment to any Kubernetes cluster. You can use it to configure deployment with your existing ingress controller and cert-manager.

# Add the StackEdit Helm repository
helm repo add stackedit https://benweet.github.io/stackedit-charts/

# Update your local Helm chart repository cache
helm repo update

# Deploy StackEdit chart to your cluster
helm install --name stackedit stackedit/stackedit \
  --set dropboxAppKey=$DROPBOX_API_KEY \
  --set dropboxAppKeyFull=$DROPBOX_FULL_ACCESS_API_KEY \
  --set googleClientId=$GOOGLE_CLIENT_ID \
  --set googleApiKey=$GOOGLE_API_KEY \
  --set githubClientId=$GITHUB_CLIENT_ID \
  --set githubClientSecret=$GITHUB_CLIENT_SECRET \
  --set wordpressClientId=\"$WORDPRESS_CLIENT_ID\" \
  --set wordpressSecret=$WORDPRESS_CLIENT_SECRET

Later, to upgrade StackEdit to the latest version:

helm repo update
helm upgrade stackedit stackedit/stackedit

If you want to uninstall StackEdit:

helm delete --purge stackedit

If you want to use your existing ingress controller and cert-manager issuer:

# See https://docs.cert-manager.io/en/latest/tutorials/acme/quick-start/index.html
helm install --name stackedit stackedit/stackedit \
  --set dropboxAppKey=$DROPBOX_API_KEY \
  --set dropboxAppKeyFull=$DROPBOX_FULL_ACCESS_API_KEY \
  --set googleClientId=$GOOGLE_CLIENT_ID \
  --set googleApiKey=$GOOGLE_API_KEY \
  --set githubClientId=$GITHUB_CLIENT_ID \
  --set githubClientSecret=$GITHUB_CLIENT_SECRET \
  --set wordpressClientId=\"$WORDPRESS_CLIENT_ID\" \
  --set wordpressSecret=$WORDPRESS_CLIENT_SECRET \
  --set ingress.enabled=true \
  --set ingress.annotations."kubernetes\.io/ingress\.class"=nginx \
  --set ingress.annotations."cert-manager\.io/cluster-issuer"=letsencrypt-prod \
  --set ingress.hosts[0].host=stackedit.example.com \
  --set ingress.hosts[0].paths[0]=/ \
  --set ingress.tls[0].secretName=stackedit-tls \
  --set ingress.tls[0].hosts[0]=stackedit.example.com
Comments
  • StackEdit 4 beta preview

    StackEdit 4 beta preview

    This is a dedicated ticket for any feedback on StackEdit 4 beta preview (https://stackedit-beta.herokuapp.com/).

    Your feedback is much appreciated!

    If you like it, say it. If you don't, or you haven't noticed any difference, say it. If you have any suggestion, I'm happy to hear it. If you just found a bug, declare a new issue.

    If you like StackEdit, please give it 5 stars on the Chrome Web Store...

    Cheers!

    info 
    opened by benweet 108
  • Custom keyboard shortcuts

    Custom keyboard shortcuts

    Hi,

    Is there a way to create new keyboard shortcuts to insert snippets of text? This would be useful for the equation editor. Can the "UserCustom extension" be used for that? Thanks for the help.

    question 
    opened by ghuba 30
  • Integrate MathJax and Prettify on a blog

    Integrate MathJax and Prettify on a blog

    It is a great thing to preview math formula by MathJax in StackEdit, but there is still a problem when I try to publish it to WordPress.

    For example if I type:

    $$f(a)=\frac{1}{2\pi i}\oint_\gamma\frac{f(z)}{z-a}dz$$
    

    then this works well in preview, but when I publish to WordPress, the same code becomes(I think the better way is to keep it in the RAW form, rather than the form produced by MathJax, In fact you will see that in WordPress, the formula looks ugly compared with the preview):

    <span class="MathJax_Preview"></span><div class="MathJax_Display" role="textbox" aria-readonly="true" style="text-align: center;"><span class="MathJax" id="MathJax-Element-1-Frame" style=""><nobr><span class="math" id="MathJax-Span-1" style="width: 12.503em; display: inline-block;"><span style="display: inline-block; position: relative; width: 9.472em; height: 0px; font-size: 132%;"><span style="position: absolute; clip: rect(0.598em 1000.003em 3.412em -0.43em); top: -2.216em; left: 0.003em;"><span class="mrow" id="MathJax-Span-2"><span class="mi" id="MathJax-Span-3" style="font-family: MathJax_Math; font-style: italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.057em;"></span></span><span class="mo" id="MathJax-Span-4" style="font-family: MathJax_Main;">(</span><span class="mi" id="MathJax-Span-5" style="font-family: MathJax_Math; font-style: italic;">a</span><span class="mo" id="MathJax-Span-6" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-7" style="font-family: MathJax_Main; padding-left: 0.273em;">=</span><span class="mfrac" id="MathJax-Span-8" style="padding-left: 0.381em; padding-right: 0.111em;"><span style="display: inline-block; position: relative; width: 1.626em; height: 0px;"><span style="position: absolute; clip: rect(1.356em 1000.003em 2.33em -0.376em); top: -2.865em; left: 50%; margin-left: -0.268em;"><span class="mn" id="MathJax-Span-9" style="font-family: MathJax_Main;">1</span><span style="display: inline-block; width: 0px; height: 2.167em;"></span></span><span style="position: absolute; clip: rect(1.41em 1000.003em 2.384em -0.43em); top: -1.512em; left: 50%; margin-left: -0.755em;"><span class="mrow" id="MathJax-Span-10"><span class="mn" id="MathJax-Span-11" style="font-family: MathJax_Main;">2</span><span class="mi" id="MathJax-Span-12" style="font-family: MathJax_Math; font-style: italic;">π<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-13" style="font-family: MathJax_Math; font-style: italic;">i</span></span><span style="display: inline-block; width: 0px; height: 2.221em;"></span></span><span style="position: absolute; clip: rect(0.869em 1000.003em 1.247em -0.484em); top: -1.296em; left: 0.003em;"><span style="border-left-width: 1.626em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.25px; vertical-align: 0.003em;"></span><span style="display: inline-block; width: 0px; height: 1.085em;"></span></span></span></span><span class="msubsup" id="MathJax-Span-14" style="padding-left: 0.165em;"><span style="display: inline-block; position: relative; width: 1.085em; height: 0px;"><span style="position: absolute; clip: rect(0.652em 1000.003em 3.195em -0.43em); top: -2.162em; left: 0.003em;"><span class="mo" id="MathJax-Span-15" style="font-family: MathJax_Size2; vertical-align: 0.003em;">∮<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.381em;"></span></span><span style="display: inline-block; width: 0px; height: 2.167em;"></span></span><span style="position: absolute; top: -1.242em; left: 0.598em;"><span class="mi" id="MathJax-Span-16" style="font-size: 70.7%; font-family: MathJax_Math; font-style: italic;">γ<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span style="display: inline-block; width: 0px; height: 2.167em;"></span></span></span></span><span class="mfrac" id="MathJax-Span-17" style="padding-left: 0.273em; padding-right: 0.111em;"><span style="display: inline-block; position: relative; width: 2.167em; height: 0px;"><span style="position: absolute; clip: rect(1.301em 1000.003em 2.654em -0.43em); top: -2.919em; left: 50%; margin-left: -0.701em;"><span class="mrow" id="MathJax-Span-18"><span class="mi" id="MathJax-Span-19" style="font-family: MathJax_Math; font-style: italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.057em;"></span></span><span class="mo" id="MathJax-Span-20" style="font-family: MathJax_Main;">(</span><span class="mi" id="MathJax-Span-21" style="font-family: MathJax_Math; font-style: italic;">z<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-22" style="font-family: MathJax_Main;">)</span></span><span style="display: inline-block; width: 0px; height: 2.221em;"></span></span><span style="position: absolute; clip: rect(1.626em 1000.003em 2.384em -0.43em); top: -1.512em; left: 50%; margin-left: -1.025em;"><span class="mrow" id="MathJax-Span-23"><span class="mi" id="MathJax-Span-24" style="font-family: MathJax_Math; font-style: italic;">z<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-25" style="font-family: MathJax_Main; padding-left: 0.219em;">−</span><span class="mi" id="MathJax-Span-26" style="font-family: MathJax_Math; font-style: italic; padding-left: 0.219em;">a</span></span><span style="display: inline-block; width: 0px; height: 2.221em;"></span></span><span style="position: absolute; clip: rect(0.869em 1000.003em 1.247em -0.484em); top: -1.296em; left: 0.003em;"><span style="border-left-width: 2.167em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.25px; vertical-align: 0.003em;"></span><span style="display: inline-block; width: 0px; height: 1.085em;"></span></span></span></span><span class="mi" id="MathJax-Span-27" style="font-family: MathJax_Math; font-style: italic; padding-left: 0.165em;">d<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-28" style="font-family: MathJax_Math; font-style: italic;">z<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span></span><span style="display: inline-block; width: 0px; height: 2.221em;"></span></span></span><span style="border-left-width: 0.004em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 3.504em; vertical-align: -1.425em;"></span></span></nobr></span></div><script type="math/tex; mode=display" id="MathJax-Element-1">f(a)=\frac{1}{2\pi i}\oint_\gamma\frac{f(z)}{z-a}dz</script></p>
    
    question 
    opened by vanabel 27
  • Sync/save not working

    Sync/save not working

    Haven't used StackEdit in about a month, and (in Chrome) it constantly tries to save (status bar keeps blinking), but it's not saving anything. Same problem when trying to sync back to Google Drive or just using StackEdit in the browser.

    Anyone else seeing this same issue?

    Been a (paying) fan of StackEdit for a while now, and it would suck if this thing's broken.

    opened by gary73 25
  • Google Drive Based Real Time Collaboration

    Google Drive Based Real Time Collaboration

    I must say, you created something which is amazing. This is the best tool for students or anyone who needs to work with both code and math.

    Yet, here are real issues with real time editing of multiple users. Actually, it just doesn't work. The only collaboration model which works is one editor per session.

    First of all, could a real time collaboration like in the native Google Drive application could ever be implemented? Doe Google supply the needed API?

    Second of all, to avoid all "Out of Sync" issues, could you implement one editor per open document? I will explain, Let's say User A shares a file with users B and C (All have edit permissions). At first the document is closed, no one has opened it.

    Let's say B opened the document (Too bad Google Drive doesn't have open as Viewer and open as Editor). Then until he closes it all others have only view permission.

    Once B closes the nest one which opens it first gets the "Editing" permissions.

    By the way, there is a "View" mode of the document. How can I share only "View" mode with other for a file I have on Google Drive?

    Namely I want someone to open the link I give him and see this beautiful blue screen. This is so beautiful!!!

    opened by RoyiAvital 25
  • The editor is being slow lately

    The editor is being slow lately

    Starting a few days ago, the editor has been slow and not responsive to what I am typing. It would sometimes take a few seconds before it catches up, and the screen would pause for a short second or two before you can type or move the cursor around again.

    opened by bbhenry 25
  • Error in Chrome: Mismatched anonymous define() module

    Error in Chrome: Mismatched anonymous define() module

    Uncaught Error: Mismatched anonymous define() module: function (){return $}
    http://requirejs.org/docs/errors.html#mismatch
    

    image

    Chrome

    Version 47.0.2526.111 m

    Tried flushing cookies and localStorage.

    Works fine in Firefox.

    opened by Schweinepriester 21
  • Real simultaneous collaboration

    Real simultaneous collaboration

    I recently switched from google drive documents to stack edit, but I sync documents with google drive. One thing I love about google docs is the ability to work in real time with colleagues and friends on documents.

    Thats not really well solved in stackedit so far. You always have to refresh the page and changes get overwritten and dumped.

    It would be really helpful if you see the cursor of your collaborators. Perhaps you'll find something useful here:

    http://stackoverflow.com/questions/10274181/online-real-time-shared-javascript-console https://github.com/sveith/jinfinote

    I'd really appreciate this feature. Thanks so far for your great work.

    enhancement 
    opened by schickling 20
  • Can we define some new rules for markdown engine?

    Can we define some new rules for markdown engine?

    It seems quite strange we want to add some new behavior to the markdown engine. But it is really reasonable to do so in some case: the main reason is to make the markdown more excellent.

    In my situation, I want to add some theorem style css, this can be done as:

    <div class="thm" style="border: solid 1px #ccc"><strong>Theorem.</strong> 
    When we have a dream, please don't let it go easily!
    </div>
    

    But what I like to do this is by:

    \begin{thm}
    When we have a dream, please don't let it go easily!
    \end{thm} 
    

    Thus, my question is that can we add some self-defined rule, that markdown can translate the \begin{thm} to <div class="thm" style="border:solid 1px #ccc"> and the \end{thm} to </div>?

    If, furthermore, we can define some css style somewhere, then the \begin{thm} only need to rendered as <div class="thm">.

    This is quite convenient when it combined with my LaTeX2HTML plugin (preview it in wp) for Wordpress.

    question 
    opened by vanabel 19
  • Unable to post update to couchdb

    Unable to post update to couchdb

    I'm using a couchdb instance through couchappy to save documents, and have been getting the following error recently:

    Error 403: Update time is in the future, please check your clock!
    

    Console trace:

    | Call | Line | | --- | --- | | Uncaught Error: Error 403: Update time is in the future, please check your clock! | main.js:25982 | | u | main.js:25982 | | (anonymous function) | main.js:26014 | | ot.Callbacks.d | main.js:1113 | | ot.Callbacks.p.fireWith | main.js:1156 | | i | main.js:2327 | | ot.ajaxTransport.ot.support.cors.e.crossDomain.send.n | main.js:2485 |

    opened by chrisjlebron 18
  • NEW SSL platform https://stackedit.io

    NEW SSL platform https://stackedit.io

    The new secured platform has been set up: https://stackedit.io, along with the new version 2.2, which includes:

    • New spell check extension, supporting english, french, german, spanish languages for now
    • Support for SmartyPants in the PageDown Extra extension
    • Keyboard shortcuts setting pane
    • YAML front matter parsing and interpreted for Blogger, WordPress and Tumblr publications
    • Enhanced support for enter/tab keys in list items
    • Better authorization management (especially for Google services)
    • Possibility to import/export documents and settings
    • Bug fixes
    info 
    opened by benweet 18
  • Unable to synchronize to Github

    Unable to synchronize to Github

    Hello Team,

    I have a private repository. I have been using Stackedit (online version) for long time. Recently I am not able to open from Github or create any new file on Github using StackEdit application. I get following error for the rest api in my browser network console: 401 error.

    API: /repos/{owner}/{repo}/contents/{path}

    {
        "message": "Bad credentials",
        "documentation_url": "https://docs.github.com/rest"
    }
    

    I revoked the access from Githhub and authorised it again. But this isn't resolved the issue.

    Thank you,

    opened by sanjayabc1234 1
  • New repository for stackedit

    New repository for stackedit

    Due to the inactivity of the maintainer I created this repository. Feel free to contribute and help me upgrade all dependencies to the latest version and try to merge all open pull requests.

    opened by SamTV12345 1
  • Pushing existing files in StackEdit to a new Github repository

    Pushing existing files in StackEdit to a new Github repository

    • I have a large number of folders and files already written in StackEdit
    • These are housed within the default "Main Workspace"
    • The "Main Workspace" is synced with Google Drive

    I'd now like to "push" these files to a Github repo, but so far I've only been able to find options to "pull" an existing repo into StackEdit. I could individually Publish each file to the location I need on Github one at a time, but there are over 100 files so it'd be pretty time-consuming.

    Is there a workflow for pushing a large number of existing files from StackEdit to Github, please?

    Thanks!

    opened by astringfield 0
  • Gitlab Integration Error

    Gitlab Integration Error

    Whilst attempting to integrate with Gitlab, I have found an issue:

    After adding all the details, I click 'OK' to complete Gitlab integration from stackedit and stackedit opens a new window to authorize:

    https://gitlab.com/oauth/authorize?client_id=XXXX&response_type=token&scope=api&state=SSPaTC2Ee7Ias9da&redirect_uri=https%3A%2F%2Fstackedit.io%2Foauth2%2Fcallback (client_id has been replaced in this example)

    However, Gitlab returns an error here, saying:

    An error has occurred The authorization server does not support this response type.

    opened by ocundale 1
Releases(v5.14.0)
Owner
Benoit Schweblin
Benoit Schweblin
In-browser Markdown editor

StackEdit Full-featured, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites

Benoit Schweblin 19.9k Jan 9, 2023
🍞📝 Markdown WYSIWYG Editor. GFM Standard + Chart & UML Extensible.

TOAST UI Editor v3 major update planning ?? ?? ?? TOAST UI Editor is planning a v3 major update for 2021. You can see our detail RoadMap here! GFM Mar

NHN 15.5k Jan 3, 2023
A simple, beautiful, and embeddable JavaScript Markdown editor. Delightful editing for beginners and experts alike. Features built-in autosaving and spell checking.

SimpleMDE - Markdown Editor A drop-in JavaScript textarea replacement for writing beautiful and understandable Markdown. The WYSIWYG-esque editor allo

Sparksuite 9.3k Jan 4, 2023
:notebook: Our cool, secure, and offline-first Markdown editor.

Monod Hi! I'm Monod, the Markdown Editor! Monod is a (relatively) secure and offline-first Markdown editor we have built at TailorDev in order to lear

TailorDev 877 Dec 4, 2022
A markdown editor using Electron, ReactJS, Vite, CodeMirror, and Remark

updated: Saturday, 5th February 2022 A modern looking application built with Electron-Vite-React ?? ✨ Markdown Editor Introduction This application s

Kryptonite 5 Sep 7, 2022
Override the rich text editor in Strapi admin with ToastUI Editor.

strapi-plugin-wysiwyg-tui-editor ⚠️ This is a strapi v4 plugin which does not support any earlier version! A Strapi plugin to replace the default rich

Zhuo Chen 12 Dec 23, 2022
A chrome extension which helps change ace editor to monaco editor in web pages, supporting all features including autocompletes.

Monaco-It Monaco-It is a chrome extension turning Ace Editor into Monaco Editor, supporting all features including autocompletes. 一些中文说明 Supported Lan

null 3 May 17, 2022
In-browser code editor

CodeMirror CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with over 10

CodeMirror 25.6k Dec 30, 2022
A browser based code editor

Monaco Editor The Monaco Editor is the code editor which powers VS Code, with the features better described here. Please note that this repository con

Microsoft 32.4k Jan 3, 2023
A browser based code editor

Monaco Editor The Monaco Editor is the code editor which powers VS Code, with the features better described here. Please note that this repository con

Microsoft 24.6k May 17, 2021
Browser-based code editor created to edit local or server files online

notIDE Browser-based code editor created to edit local or server files online. Features Autosave while editing Syntax highlight using ace editor Creat

Mr Crypster 15 Nov 21, 2022
In-browser code editor (version 5, legacy)

CodeMirror CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with over 10

CodeMirror 25.6k Jan 5, 2023
enjoy live editing (+markdown)

Pen Editor LIVE DEMO: http://sofish.github.io/pen Markdown is supported Build status: 0. source code You can clone the source code from github, or usi

小鱼 4.8k Dec 24, 2022
Easily convert markdown files to PDF

ezPDF What's this? This is a simple markdown to pdf parser that supports custom CSS stylesheets. In the future, ezPDF will allow you to preview files

Matheus 12 Oct 11, 2022
A file based wiki that uses markdown

wikmd What is it? It’s a file-based wiki that aims to simplicity. The documents are completely written in Markdown which is an easy markup language th

linbreux 161 Jan 2, 2023
The next generation Javascript WYSIWYG HTML Editor.

Froala Editor V3 Froala WYSIWYG HTML Editor is one of the most powerful JavaScript rich text editors ever. Slim - only add the plugins that you need (

Froala 5k Jan 1, 2023
Simple rich text editor (contentEditable) for jQuery UI

Hallo - contentEditable for jQuery UI Hallo is a very simple in-place rich text editor for web pages. It uses jQuery UI and the HTML5 contentEditable

Henri Bergius 2.4k Dec 17, 2022
A modern, simple and elegant WYSIWYG rich text editor.

jQuery-Notebook A simple, clean and elegant WYSIWYG rich text editor for web aplications Note: Check out the fully functional demo and examples here.

Raphael Cruzeiro 1.7k Dec 12, 2022
Ace (Ajax.org Cloud9 Editor)

Ace (Ajax.org Cloud9 Editor) Note: The new site at http://ace.c9.io contains all the info below along with an embedding guide and all the other resour

Ajax.org B.V. 25.2k Jan 4, 2023