diff --git a/technology/internet/OpenGraphProtocol.md b/technology/internet/OpenGraphProtocol.md
new file mode 100644
index 0000000..6bd467b
--- /dev/null
+++ b/technology/internet/OpenGraphProtocol.md
@@ -0,0 +1,251 @@
+---
+obj: concept
+website: https://ogp.me
+rev: 2024-12-16
+---
+
+# The Open Graph protocol
+The [Open Graph protocol](https://ogp.me/) enables any web page to become a rich object in a social graph. For instance, this is used on Facebook to allow any web page to have the same functionality as any other object on Facebook.
+
+## Basic Metadata
+To turn your web pages into graph objects, you need to add basic metadata to your page. Which means that you'll place additional `` tags in the `
` of your web page. The four required properties for every page are:
+
+- `og:title` - The title of your object as it should appear within the graph, e.g., "The Rock".
+- `og:type` - The type of your object, e.g., `video.movie`. Depending on the type you specify, other properties may also be required.
+- `og:image` - An image URL which should represent your object within the graph.
+- `og:url` - The canonical URL of your object that will be used as its permanent ID in the graph, e.g., "https://www.imdb.com/title/tt0117500/".
+
+As an example, the following is the Open Graph protocol markup for [The Rock on IMDB](https://www.imdb.com/title/tt0117500/):
+
+```html
+
+
+The Rock (1996)
+
+
+
+
+...
+
+...
+
+```
+
+### Optional Metadata
+The following properties are optional for any object and are generally recommended:
+
+- `og:audio` - A URL to an audio file to accompany this object.
+- `og:description` - A one to two sentence description of your object.
+- `og:determiner` - The word that appears before this object's title in a sentence. An enum of (`a`, `an`, `the`, `""`, `auto`). If `auto` is chosen, the consumer of your data should chose between `a` or `an`. Default is `""` (blank).
+- `og:locale` - The locale these tags are marked up in. Of the format `language_TERRITORY`. Default is `en_US`.
+- `og:locale:alternate` - An array of other locales this page is available in.
+- `og:site_name` - If your object is part of a larger web site, the name which should be displayed for the overall site. e.g., "IMDb".
+- `og:video` - A URL to a video file that complements this object.
+
+For example (line-break solely for display purposes):
+
+```html
+
+
+
+
+
+
+
+
+```
+
+## Structured Properties
+Some properties can have extra metadata attached to them. These are specified in the same way as other metadata with `property` and `content`, but the `property` will have extra `:`.
+
+The `og:image` property has some optional structured properties:
+
+- `og:image:url` - Identical to `og:image`.
+- `og:image:secure_url` - An alternate url to use if the webpage requires HTTPS.
+- `og:image:type` - A MIME type for this image.
+- `og:image:width` - The number of pixels wide.
+- `og:image:height` - The number of pixels high.
+- `og:image:alt` - A description of what is in the image (not a caption). If the page specifies an og:image it should specify `og:image:alt`.
+
+A full image example:
+
+```html
+
+
+
+
+
+
+```
+
+The `og:video` tag has the identical tags as `og:image`. Here is an example:
+
+```html
+
+
+
+
+
+```
+
+The `og:audio` tag only has the first 3 properties available (since size doesn't make sense for sound):
+
+```html
+
+
+
+```
+
+## Arrays
+If a tag can have multiple values, just put multiple versions of the same `` tag on your page. The first tag (from top to bottom) is given preference during conflicts.
+
+```html
+
+
+```
+
+Put structured properties after you declare their root tag. Whenever another root element is parsed, that structured property is considered to be done and another one is started.
+
+For example:
+
+```html
+
+
+
+
+
+
+```
+
+means there are 3 images on this page, the first image is `300x300`, the middle one has unspecified dimensions, and the last one is `1000px` tall.
+
+## Object Types
+In order for your object to be represented within the graph, you need to specify its type. This is done using the `og:type` property:
+
+```html
+
+```
+
+When the community agrees on the schema for a type, it is added to the list of global types. All other objects in the type system are CURIEs of the form.
+
+```html
+
+
+```
+
+The global types are grouped into verticals. Each vertical has its own namespace. The `og:type` values for a namespace are always prefixed with the namespace and then a period. This is to reduce confusion with user-defined namespaced types which always have colons in them.
+
+### Music
+
+- Namespace URI: [`https://ogp.me/ns/music#`](https://ogp.me/ns/music)
+
+`og:type` values:
+
+[`music.song`](https://ogp.me/#type_music.song)
+
+- `music:duration` - [integer](https://ogp.me/#integer) >=1 - The song's length in seconds.
+- `music:album` - [music.album](https://ogp.me/#type_music.album) [array](https://ogp.me/#array) - The album this song is from.
+- `music:album:disc` - [integer](https://ogp.me/#integer) >=1 - Which disc of the album this song is on.
+- `music:album:track` - [integer](https://ogp.me/#integer) >=1 - Which track this song is.
+- `music:musician` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - The musician that made this song.
+
+[`music.album`](https://ogp.me/#type_music.album)
+
+- `music:song` - [music.song](https://ogp.me/#type_music.song) - The song on this album.
+- `music:song:disc` - [integer](https://ogp.me/#integer) >=1 - The same as `music:album:disc` but in reverse.
+- `music:song:track` - [integer](https://ogp.me/#integer) >=1 - The same as `music:album:track` but in reverse.
+- `music:musician` - [profile](https://ogp.me/#type_profile) - The musician that made this song.
+- `music:release_date` - [datetime](https://ogp.me/#datetime) - The date the album was released.
+
+[`music.playlist`](https://ogp.me/#type_music.playlist)
+
+- `music:song` - Identical to the ones on [music.album](https://ogp.me/#type_music.album)
+- `music:song:disc`
+- `music:song:track`
+- `music:creator` - [profile](https://ogp.me/#type_profile) - The creator of this playlist.
+
+[`music.radio_station`](https://ogp.me/#type_music.radio_station)
+
+- `music:creator` - [profile](https://ogp.me/#type_profile) - The creator of this station.
+
+### Video
+
+- Namespace URI: [`https://ogp.me/ns/video#`](https://ogp.me/ns/video)
+
+`og:type` values:
+
+[`video.movie`](https://ogp.me/#type_video.movie)
+
+- `video:actor` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Actors in the movie.
+- `video:actor:role` - [string](https://ogp.me/#string) - The role they played.
+- `video:director` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Directors of the movie.
+- `video:writer` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Writers of the movie.
+- `video:duration` - [integer](https://ogp.me/#integer) >=1 - The movie's length in seconds.
+- `video:release_date` - [datetime](https://ogp.me/#datetime) - The date the movie was released.
+- `video:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this movie.
+
+[`video.episode`](https://ogp.me/#type_video.episode)
+
+- `video:actor` - Identical to [video.movie](https://ogp.me/#type_video.movie)
+- `video:actor:role`
+- `video:director`
+- `video:writer`
+- `video:duration`
+- `video:release_date`
+- `video:tag`
+- `video:series` - [video.tv_show](https://ogp.me/#type_video.tv_show) - Which series this episode belongs to.
+
+[`video.tv_show`](https://ogp.me/#type_video.tv_show)
+
+A multi-episode TV show. The metadata is identical to [video.movie](https://ogp.me/#type_video.movie).
+
+[`video.other`](https://ogp.me/#type_video.other)
+
+A video that doesn't belong in any other category. The metadata is identical to [video.movie](https://ogp.me/#type_video.movie).
+
+### No Vertical
+These are globally defined objects that just don't fit into a vertical but yet are broadly used and agreed upon.
+
+`og:type` values:
+
+[`article`](https://ogp.me/#type_article) - Namespace URI: [`https://ogp.me/ns/article#`](https://ogp.me/ns/article)
+
+- `article:published_time` - [datetime](https://ogp.me/#datetime) - When the article was first published.
+- `article:modified_time` - [datetime](https://ogp.me/#datetime) - When the article was last changed.
+- `article:expiration_time` - [datetime](https://ogp.me/#datetime) - When the article is out of date after.
+- `article:author` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Writers of the article.
+- `article:section` - [string](https://ogp.me/#string) - A high-level section name. E.g. Technology
+- `article:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this article.
+
+[`book`](https://ogp.me/#type_book) - Namespace URI: [`https://ogp.me/ns/book#`](https://ogp.me/ns/book)
+
+- `book:author` - [profile](https://ogp.me/#type_profile) [array](https://ogp.me/#array) - Who wrote this book.
+- `book:isbn` - [string](https://ogp.me/#string) - The [ISBN](https://en.wikipedia.org/wiki/International_Standard_Book_Number)
+- `book:release_date` - [datetime](https://ogp.me/#datetime) - The date the book was released.
+- `book:tag` - [string](https://ogp.me/#string) [array](https://ogp.me/#array) - Tag words associated with this book.
+
+[`profile`](https://ogp.me/#type_profile) - Namespace URI: [`https://ogp.me/ns/profile#`](https://ogp.me/ns/profile)
+
+- `profile:first_name` - [string](https://ogp.me/#string) - A name normally given to an individual by a parent or self-chosen.
+- `profile:last_name` - [string](https://ogp.me/#string) - A name inherited from a family or marriage and by which the individual is commonly known.
+- `profile:username` - [string](https://ogp.me/#string) - A short unique string to identify them.
+- `profile:gender` - [enum](https://ogp.me/#enum)(male, female) - Their gender.
+
+[`website`](https://ogp.me/#type_website) - Namespace URI: [`https://ogp.me/ns/website#`](https://ogp.me/ns/website)
+
+No additional properties other than the basic ones. Any non-marked up webpage should be treated as `og:type` website.
+
+## Types
+The following types are used when defining attributes in Open Graph protocol.
+
+| **Type** | **Description** | **Literals** |
+| -------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| Boolean | A Boolean represents a true or false value | true, false, 1, 0 |
+| DateTime | A DateTime represents a temporal value composed of a date (year, month, day) and an optional time component (hours, minutes) | ISO 8601 |
+| Enum | A type consisting of bounded set of constant string values (enumeration members). | A string value that is a member of the enumeration |
+| Float | A 64-bit signed floating point number | All literals that conform to the following formats: `1.234`, `-1.234`, `1.2e3`, `-1.2e3`, `7E-10` |
+| Integer | A 32-bit signed integer. | All literals that conform to the following formats: `1234`, `-123` |
+| String | A sequence of Unicode characters | All literals composed of Unicode characters with no escape characters |
+| URL | A sequence of Unicode characters that identify an Internet resource. | All valid URLs that utilize the `http://` or `https://` protocols |