diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Changelog for utf8-conversions
+
+#### 0.1.0.0.
+
+init package
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Shintaro Sakata (c) 2020
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Author name here nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,37 @@
+# `utf8-conversions` safe and easy
+
+This package provides a　Data.Convertible.Utf8 library for easy conversion of many string types in Haskell
+
+## Support
+
+- String
+- ByteString
+- ByteStringBuilder
+- LazyByteString
+- ByteStringShort
+- Text
+- LazyText
+- TextBuilder
+- TextShort
+
+Supports type conversion between the above types.
+Byte string is assumed to be in utf-8 encoding.
+
+## Why?
+
+String conversion in haskell is more difficult than in other languages and needs to be easier.
+
+In particular, the OverloadedStrings pragma does not work properly when creating a ByteString.
+
+So why not other conversion libraries?
+There are many other conversion libraries that use the Maybe type for safety or are not explicitly stated as utf8.
+
+Libraries that use maybe types are very labor intensive.
+Libraries that do not explicitly state UTF8 are insecure
+
+Therefore, this library clearly states that it assumes UTF8 and performs the conversion without using the MAYBE type, which is both safe and easy.
+。
+
+## Get involved!
+
+If there's a bug or a better way to convert, please report it!
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/src/Data/Convertible/Utf8.hs b/src/Data/Convertible/Utf8.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Convertible/Utf8.hs
@@ -0,0 +1,367 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Data.Convertible.Utf8 where
+
+import qualified Data.ByteString           as BS
+import qualified Data.ByteString.Builder   as BSB
+import qualified Data.ByteString.Lazy      as BSL
+import qualified Data.ByteString.Lazy.UTF8 as BSL.UTF8
+import qualified Data.ByteString.Short     as BSS
+import qualified Data.ByteString.UTF8      as BS.UTF8
+import           Data.Maybe                (fromJust)
+import qualified Data.Text                 as T
+import qualified Data.Text.Encoding        as TE
+import qualified Data.Text.Lazy            as TL
+import qualified Data.Text.Lazy.Builder    as TB
+import qualified Data.Text.Lazy.Encoding   as TLE
+import qualified Data.Text.Short           as TS
+
+-- | A typeclass that represents something that can be converted.
+--  A @Convertible a b@ instance represents an @a@ that can be converted to a @b@.
+class Convertible a b where
+  -- | Convert from @a@ to @b@.
+  --    Byte string is assumed to be in utf-8 encoding.
+  convert :: a -> b
+
+-- Convert from String
+
+instance Convertible String String where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible String T.Text where
+  {-# INLINE convert #-}
+  convert = T.pack
+
+instance Convertible String TL.Text where
+  {-# INLINE convert #-}
+  convert = TL.pack
+
+instance Convertible String TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromString
+
+instance Convertible String TS.ShortText where
+  {-# INLINE convert #-}
+  convert = TS.fromString
+
+instance Convertible String BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BS.UTF8.fromString
+
+instance Convertible String BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.UTF8.fromString
+
+instance Convertible String BSB.Builder where
+  {-# INLINE convert #-}
+  convert = BSB.stringUtf8
+
+instance Convertible String BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . BS.UTF8.fromString
+
+-- Convert from Text
+
+instance Convertible T.Text String where
+  {-# INLINE convert #-}
+  convert = T.unpack
+
+instance Convertible T.Text T.Text where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible T.Text TL.Text where
+  {-# INLINE convert #-}
+  convert = TL.fromStrict
+
+instance Convertible T.Text TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromText
+
+instance Convertible T.Text TS.ShortText where
+  {-# INLINE convert #-}
+  convert = TS.fromText
+
+instance Convertible T.Text BS.ByteString where
+  {-# INLINE convert #-}
+  convert = TE.encodeUtf8
+
+instance Convertible T.Text BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.fromStrict . TE.encodeUtf8
+
+instance Convertible T.Text BSB.Builder where
+  {-# INLINE convert #-}
+  convert = TE.encodeUtf8Builder
+
+instance Convertible T.Text BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . TE.encodeUtf8
+
+-- Convert from LazyText
+
+instance Convertible TL.Text String where
+  {-# INLINE convert #-}
+  convert = TL.unpack
+
+instance Convertible TL.Text T.Text where
+  {-# INLINE convert #-}
+  convert = TL.toStrict
+
+instance Convertible TL.Text TL.Text where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible TL.Text TS.ShortText where
+  {-# INLINE convert #-}
+  convert = TS.fromText . TL.toStrict
+
+instance Convertible TL.Text TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromLazyText
+
+instance Convertible TL.Text BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.toStrict . TLE.encodeUtf8
+
+instance Convertible TL.Text BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = TLE.encodeUtf8
+
+instance Convertible TL.Text BSB.Builder where
+  {-# INLINE convert #-}
+  convert = TLE.encodeUtf8Builder
+
+instance Convertible TL.Text BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . BSL.toStrict . TLE.encodeUtf8
+
+-- Convert from ShortText
+
+instance Convertible TS.ShortText String where
+  {-# INLINE convert #-}
+  convert = TS.toString
+
+instance Convertible TS.ShortText T.Text where
+  {-# INLINE convert #-}
+  convert = TS.toText
+
+instance Convertible TS.ShortText TL.Text where
+  {-# INLINE convert #-}
+  convert = TL.fromStrict . TS.toText
+
+instance Convertible TS.ShortText TS.ShortText where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible TS.ShortText TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromText . TS.toText
+
+instance Convertible TS.ShortText BS.ByteString where
+  {-# INLINE convert #-}
+  convert = TS.toByteString
+
+instance Convertible TS.ShortText BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSB.toLazyByteString . TS.toBuilder
+
+instance Convertible TS.ShortText BSB.Builder where
+  {-# INLINE convert #-}
+  convert = TS.toBuilder
+
+instance Convertible TS.ShortText BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = TS.toShortByteString
+
+-- Convert from TextBuilder
+
+instance Convertible TB.Builder String where
+  {-# INLINE convert #-}
+  convert = TL.unpack . TB.toLazyText
+
+instance Convertible TB.Builder T.Text where
+  {-# INLINE convert #-}
+  convert = TL.toStrict . TB.toLazyText
+
+instance Convertible TB.Builder TL.Text where
+  {-# INLINE convert #-}
+  convert = TB.toLazyText
+
+instance Convertible TB.Builder TS.ShortText where
+  {-# INLINE convert #-}
+  convert = TS.fromText . TL.toStrict . TB.toLazyText
+
+instance Convertible TB.Builder TB.Builder where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible TB.Builder BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.toStrict . TLE.encodeUtf8 . TB.toLazyText
+
+instance Convertible TB.Builder BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = TLE.encodeUtf8 . TB.toLazyText
+
+instance Convertible TB.Builder BSB.Builder where
+  {-# INLINE convert #-}
+  convert = TLE.encodeUtf8Builder . TB.toLazyText
+
+instance Convertible TB.Builder BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . BSL.toStrict . TLE.encodeUtf8 . TB.toLazyText
+
+-- Convert from ByteString
+
+instance Convertible BS.ByteString String where
+  {-# INLINE convert #-}
+  convert = BS.UTF8.toString
+
+instance Convertible BS.ByteString T.Text where
+  {-# INLINE convert #-}
+  convert = TE.decodeUtf8
+
+instance Convertible BS.ByteString TL.Text where
+  {-# INLINE convert #-}
+  convert = TLE.decodeUtf8 . BSL.fromStrict
+
+instance Convertible BS.ByteString TS.ShortText where
+  {-# INLINE convert #-}
+  convert = fromJust . TS.fromByteString
+
+instance Convertible BS.ByteString TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromLazyText . TL.fromStrict . TE.decodeUtf8
+
+instance Convertible BS.ByteString BS.ByteString where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible BS.ByteString BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.fromStrict
+
+instance Convertible BS.ByteString BSB.Builder where
+  {-# INLINE convert #-}
+  convert = BSB.byteString
+
+instance Convertible BS.ByteString BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort
+
+-- Convert from LazyByteString
+
+instance Convertible BSL.ByteString String where
+  {-# INLINE convert #-}
+  convert = BSL.UTF8.toString
+
+instance Convertible BSL.ByteString T.Text where
+  {-# INLINE convert #-}
+  convert = TE.decodeUtf8 . BSL.toStrict
+
+instance Convertible BSL.ByteString TL.Text where
+  {-# INLINE convert #-}
+  convert = TLE.decodeUtf8
+
+instance Convertible BSL.ByteString TS.ShortText where
+  {-# INLINE convert #-}
+  convert = fromJust . TS.fromByteString . BSL.toStrict
+
+instance Convertible BSL.ByteString TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromLazyText . TLE.decodeUtf8
+
+instance Convertible BSL.ByteString BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.toStrict
+
+instance Convertible BSL.ByteString BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible BSL.ByteString BSB.Builder where
+  {-# INLINE convert #-}
+  convert = BSB.lazyByteString
+
+instance Convertible BSL.ByteString BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . BSL.toStrict
+
+-- Convert from ByteStringBuilder
+
+instance Convertible BSB.Builder String where
+  {-# INLINE convert #-}
+  convert = BSL.UTF8.toString . BSB.toLazyByteString
+
+instance Convertible BSB.Builder T.Text where
+  {-# INLINE convert #-}
+  convert = TE.decodeUtf8 . BSL.toStrict . BSB.toLazyByteString
+
+instance Convertible BSB.Builder TL.Text where
+  {-# INLINE convert #-}
+  convert = TLE.decodeUtf8 . BSB.toLazyByteString
+
+instance Convertible BSB.Builder TS.ShortText where
+  {-# INLINE convert #-}
+  convert = fromJust . TS.fromShortByteString . BSS.toShort . BSL.toStrict . BSB.toLazyByteString
+
+instance Convertible BSB.Builder TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromLazyText . TLE.decodeUtf8 . BSB.toLazyByteString
+
+instance Convertible BSB.Builder BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.toStrict . BSB.toLazyByteString
+
+instance Convertible BSB.Builder BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSB.toLazyByteString
+
+instance Convertible BSB.Builder BSB.Builder where
+  {-# INLINE convert #-}
+  convert = id
+
+instance Convertible BSB.Builder BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = BSS.toShort . BSL.toStrict . BSB.toLazyByteString
+
+-- Convert from ShortByteString
+
+instance Convertible BSS.ShortByteString String where
+  {-# INLINE convert #-}
+  convert = BS.UTF8.toString . BSS.fromShort
+
+instance Convertible BSS.ShortByteString T.Text where
+  {-# INLINE convert #-}
+  convert = TE.decodeUtf8 . BSS.fromShort
+
+instance Convertible BSS.ShortByteString TL.Text where
+  {-# INLINE convert #-}
+  convert = TLE.decodeUtf8 . BSL.fromStrict . BSS.fromShort
+
+instance Convertible BSS.ShortByteString TS.ShortText where
+  {-# INLINE convert #-}
+  convert = fromJust . TS.fromShortByteString
+
+instance Convertible BSS.ShortByteString TB.Builder where
+  {-# INLINE convert #-}
+  convert = TB.fromText . TE.decodeUtf8 . BSS.fromShort
+
+instance Convertible BSS.ShortByteString BS.ByteString where
+  {-# INLINE convert #-}
+  convert = BSS.fromShort
+
+instance Convertible BSS.ShortByteString BSL.ByteString where
+  {-# INLINE convert #-}
+  convert = BSL.fromStrict . BSS.fromShort
+
+instance Convertible BSS.ShortByteString BSB.Builder where
+  {-# INLINE convert #-}
+  convert = BSB.byteString . BSS.fromShort
+
+instance Convertible BSS.ShortByteString BSS.ShortByteString where
+  {-# INLINE convert #-}
+  convert = id
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+main :: IO ()
+main = putStrLn "Test suite not yet implemented"
diff --git a/utf8-conversions.cabal b/utf8-conversions.cabal
new file mode 100644
--- /dev/null
+++ b/utf8-conversions.cabal
@@ -0,0 +1,60 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.33.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: c2d1679544a41e4847b7ff39dd859cf11cd5f2f6dd8ad00b4f09417a70240524
+
+name:           utf8-conversions
+version:        0.1.0.0
+synopsis:       A conversion library that assumes utf8
+description:    Please see the README on GitHub at <https://github.com/chemirea/utf8-conversions#readme>
+category:       Data, Codec
+homepage:       https://github.com/chemirea/utf8-conversions#readme
+bug-reports:    https://github.com/chemirea/utf8-conversions/issues
+author:         Shintaro Sakata
+maintainer:     Shintaro Sakata
+copyright:      2020 Shintaro Sakata
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://github.com/chemirea/utf8-conversions
+
+library
+  exposed-modules:
+      Data.Convertible.Utf8
+  other-modules:
+      Paths_utf8_conversions
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , bytestring >=0.10.4 && <0.11
+    , text >=1.0 && <1.3
+    , text-short >=0.1.2 && <0.1.4
+    , utf8-string >=1.0 && <1.2
+  default-language: Haskell2010
+
+test-suite utf8-conversions-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      Paths_utf8_conversions
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.7 && <5
+    , bytestring >=0.10.4 && <0.11
+    , text >=1.0 && <1.3
+    , text-short >=0.1.2 && <0.1.4
+    , utf8-conversions
+    , utf8-string >=1.0 && <1.2
+  default-language: Haskell2010
