diff --git a/src/Markdeep/Markdeep.class.st b/src/Markdeep/Markdeep.class.st
new file mode 100644
index 0000000..47b8a32
--- /dev/null
+++ b/src/Markdeep/Markdeep.class.st
@@ -0,0 +1,303 @@
+"
+I model a Mardeep file as described in https://casual-effects.com/markdeep/
+"
+Class {
+ #name : #Markdeep,
+ #superclass : #Object,
+ #instVars : [
+ 'title',
+ 'body',
+ 'tocStyle',
+ 'comments',
+ 'tail',
+ 'language',
+ 'config',
+ 'metadata',
+ 'head',
+ 'navTop'
+ ],
+ #category : #Markdeep
+}
+
+{ #category : #'as yet unclassified' }
+Markdeep class >> fromMarkdownFile: aFileReference [
+ ^ self new fromMarkdownFile: aFileReference.
+]
+
+{ #category : #'instance creation' }
+Markdeep >> authors [
+ self metadata at: 'authors' ifPresent: [:k | ^ '**', k, '**' ].
+ ^ ''.
+]
+
+{ #category : #'instance creation' }
+Markdeep >> authorsString [
+ self authors
+ ifNil: [ ^ '' ] ifNotNil: [ ^ ' ', self authors ]
+]
+
+{ #category : #accessing }
+Markdeep >> body [
+ ^ body
+]
+
+{ #category : #accessing }
+Markdeep >> body: anObject [
+ body := anObject
+]
+
+{ #category : #accessing }
+Markdeep >> comments [
+ ^ comments ifNil: [ ^ comments := true ]
+]
+
+{ #category : #accessing }
+Markdeep >> comments: aBoolean [
+ "I tell if comments are enabled by default or not."
+ comments := aBoolean
+]
+
+{ #category : #utilities }
+Markdeep >> commentsProvider [
+ "I return the url of the default service that provides annotation support.
+ I am used to add such support in the contents of the Markdeep page."
+ ^ 'https://hypothes.is'
+]
+
+{ #category : #utilities }
+Markdeep >> commentsProviderStrings [
+ "I associate a comments service provider with the string that is required to be added
+ to the document to enable such provider."
+ | providers |
+ providers := Dictionary new.
+ providers at: 'https://hypothes.is' put: '
+'.
+ ^ providers
+
+
+]
+
+{ #category : #utilities }
+Markdeep >> commentsSupport [
+ "I enable comments of the page."
+
+ self comments ifFalse: [ ^ self ].
+ ^ self commentsProviderStrings at: self commentsProvider
+]
+
+{ #category : #accessing }
+Markdeep >> config [
+
+ ^ config
+]
+
+{ #category : #accessing }
+Markdeep >> config: aDictionary [
+
+ config := aDictionary
+]
+
+{ #category : #'instance creation' }
+Markdeep >> contents [
+ | output |
+ output := '' writeStream.
+ output
+ nextPutAll: self headContents; lf; lf;
+ nextPutAll: ' **', self title, '**'; lf;
+ nextPutAll: self authorsString ; lf;
+ nextPutAll: ' ', self version; lf;
+ nextPutAll: self navTop; lf; lf;
+ nextPutAll: self body; lf; lf;
+ nextPutAll: self tail; lf; lf; lf; lf;
+ nextPutAll: self commentsSupport.
+ ^ output contents.
+]
+
+{ #category : #persistence }
+Markdeep >> exportAsFile [
+ | newFile |
+ self markdownFile ifNil: [ self inform: 'Define an input Markdown file or use #exportAsFileOn: instead.' ].
+ newFile := (self markdownFile fullName, '.html') asFileReference.
+ self exportAsFileOn: newFile.
+]
+
+{ #category : #persistence }
+Markdeep >> exportAsFileOn: aFileReference [
+ aFileReference ensureDelete.
+ aFileReference exists ifFalse: [ aFileReference ensureCreateFile ].
+ aFileReference writeStreamDo: [ :stream |
+ stream nextPutAll: self contents ].
+ self inform: 'Exported as: ', String cr, aFileReference fullName.
+ ^ aFileReference
+]
+
+{ #category : #utilities }
+Markdeep >> fontAwesomeHeader [
+ "I enable the font awesome support in the document header"
+
+ ^ ''
+]
+
+{ #category : #'instance creation' }
+Markdeep >> fromMarkdownFile: aFileReference [
+ "I create a Markdeep document from a given Markdown file."
+ self processMarkdownFor: aFileReference.
+ ^ self.
+]
+
+{ #category : #accessing }
+Markdeep >> gtTextFor: aView [
+
+ ^ aView textEditor
+ title: 'Text';
+ text: [ self contents ]
+]
+
+{ #category : #accessing }
+Markdeep >> head [
+ ^ head ifNil: [ head := OrderedCollection new.
+ head add: self fontAwesomeHeader; yourself ]
+]
+
+{ #category : #accessing }
+Markdeep >> head: anOrderedCollection [
+ head := anOrderedCollection
+]
+
+{ #category : #'instance creation' }
+Markdeep >> headContents [
+
+ ^ String streamContents: [ :stream |
+ stream
+ nextPutAll: '';
+ nextPut: Character lf.
+ self head do: [ :line |
+ stream
+ nextPutAll: ' ';
+ nextPutAll: line;
+ nextPut: Character lf
+ ].
+ stream
+ nextPutAll: '';
+ nextPut: Character lf.
+ ].
+]
+
+{ #category : #accessing }
+Markdeep >> language [
+ ^ language
+]
+
+{ #category : #accessing }
+Markdeep >> language: anObject [
+ language := anObject
+]
+
+{ #category : #accessing }
+Markdeep >> markdeepScriptTag [
+ ^ '
+'
+]
+
+{ #category : #accessing }
+Markdeep >> markdownFile [
+ ^ self config at: 'markdownFile'
+]
+
+{ #category : #accessing }
+Markdeep >> markdownFile: aFileReference [
+ "Where the Mardown file associated with me is stored. Used for sync. and import/export purposes."
+ self config at: 'markdownFile' put: aFileReference
+]
+
+{ #category : #'instance creation' }
+Markdeep >> metadata [
+ ^ metadata ifNil: [ metadata := OrderedDictionary new ]
+]
+
+{ #category : #utilities }
+Markdeep >> metadataFromXML: aXMLDocument [
+ | metaDict |
+
+ metaDict := OrderedDictionary new.
+ (aXMLDocument xpath: '//meta') do: [ :each |
+ metaDict at: (each @ 'name') stringValue put: (each @ 'content') stringValue ].
+ ^ metaDict
+]
+
+{ #category : #'instance creation' }
+Markdeep >> navTop [
+ ^ navTop
+]
+
+{ #category : #'as yet unclassified' }
+Markdeep >> navTop: aString [
+ navTop:= aString.
+]
+
+{ #category : #printing }
+Markdeep >> printOn: aStream [
+
+ super printOn: aStream.
+ aStream
+ nextPutAll: '( ', self title, ' )'
+]
+
+{ #category : #'instance creation' }
+Markdeep >> processMarkdownFor: aFileReference [
+ "comment stating purpose of message"
+ | markdownContent |
+ self markdownFile: aFileReference.
+ markdownContent := Markdown fromFile: aFileReference.
+ self body: (markdownContent commentYAMLMetadata contents).
+]
+
+{ #category : #accessing }
+Markdeep >> tail [
+ "I enable the document tail, which, in turn, enables a Markdeep document"
+ | output |
+ output := '' writeStream.
+ output
+ nextPutAll: ''; lf; lf;
+ nextPutAll: ''; lf;
+ nextPutAll: ''; lf;
+ nextPutAll: self markdeepScriptTag; lf;
+ nextPutAll: ''.
+ ^ output contents
+]
+
+{ #category : #accessing }
+Markdeep >> tail: anObject [
+ tail := anObject
+]
+
+{ #category : #accessing }
+Markdeep >> title [
+
+ ^ title
+]
+
+{ #category : #accessing }
+Markdeep >> title: anObject [
+
+ title := anObject
+]
+
+{ #category : #accessing }
+Markdeep >> tocStyle [
+ ^ tocStyle ifNil: [ tocStyle := 'short' ]
+]
+
+{ #category : #accessing }
+Markdeep >> tocStyle: anObject [
+ tocStyle := anObject
+]
+
+{ #category : #'instance creation' }
+Markdeep >> version [
+ self metadata at: 'version' ifPresent: [:value | ^ 'v',value ].
+ ^ ''
+]
diff --git a/src/Markdeep/package.st b/src/Markdeep/package.st
new file mode 100644
index 0000000..fb64022
--- /dev/null
+++ b/src/Markdeep/package.st
@@ -0,0 +1 @@
+Package { #name : #Markdeep }