diff --git a/src/console_commands.cpp b/src/console_commands.cpp
index fe1727e..df1302c 100644
--- a/src/console_commands.cpp
+++ b/src/console_commands.cpp
@@ -36,12 +36,16 @@ ConsoleCommands::ConsoleCommands(p2pool* pool)
 	, m_loop{}
 	, m_shutdownAsync{}
 	, m_tty{}
+	, m_stdin_pipe{}
+	, m_stdin_handle()
 	, m_loopThread{}
 	, m_readBuf{}
 	, m_readBufInUse(false)
 {
-	if (uv_guess_handle(0) != UV_TTY) {
-		LOGERR(1, "tty is not available");
+	uv_handle_type stdin_type = uv_guess_handle(0);
+	LOGINFO(3, "uv_guess_handle returned " << static_cast<int>(stdin_type));
+	if (stdin_type != UV_TTY && stdin_type != UV_NAMED_PIPE) {
+		LOGERR(1, "tty or named pipe is not available");
 		throw std::exception();
 	}
 
@@ -58,14 +62,31 @@ ConsoleCommands::ConsoleCommands(p2pool* pool)
 	}
 	m_shutdownAsync.data = this;
 
-	err = uv_tty_init(&m_loop, &m_tty, 0, 1);
-	if (err) {
-		LOGERR(1, "uv_tty_init failed, error " << uv_err_name(err));
-		throw std::exception();
+	if (stdin_type == UV_TTY) {
+		LOGINFO(3, "processing stdin as UV_TTY");
+		err = uv_tty_init(&m_loop, &m_tty, 0, 1);
+		if (err) {
+			LOGERR(1, "uv_tty_init failed, error " << uv_err_name(err));
+			throw std::exception();
+		}
+		m_stdin_handle = reinterpret_cast<uv_stream_t*>(&m_tty);
+	} else if (stdin_type == UV_NAMED_PIPE) {
+		LOGINFO(3, "processing stdin as UV_NAMED_PIPE");
+		err = uv_pipe_init(&m_loop, &m_stdin_pipe, 0);
+		if (err) {
+			LOGERR(1, "uv_pipe_init failed, error " << uv_err_name(err));
+			throw std::exception();
+		}
+		m_stdin_handle = reinterpret_cast<uv_stream_t*>(&m_stdin_pipe);
+		err = uv_pipe_open(&m_stdin_pipe, 0);
+		if (err) {
+			LOGERR(1, "uv_pipe_open failed, error " << uv_err_name(err));
+			throw std::exception();
+		}
 	}
-	m_tty.data = this;
+	m_stdin_handle->data = this;
 
-	err = uv_read_start(reinterpret_cast<uv_stream_t*>(&m_tty), allocCallback, stdinReadCallback);
+	err = uv_read_start(reinterpret_cast<uv_stream_t*>(m_stdin_handle), allocCallback, stdinReadCallback);
 	if (err) {
 		LOGERR(1, "uv_read_start failed, error " << uv_err_name(err));
 		throw std::exception();
diff --git a/src/console_commands.h b/src/console_commands.h
index 59e9c68..def59d7 100644
--- a/src/console_commands.h
+++ b/src/console_commands.h
@@ -35,6 +35,8 @@ private:
 	uv_loop_t m_loop;
 	uv_async_t m_shutdownAsync;
 	uv_tty_t m_tty;
+	uv_pipe_t m_stdin_pipe;
+	uv_stream_t* m_stdin_handle;
 	uv_thread_t m_loopThread;
 
 	char m_readBuf[64];
@@ -48,7 +50,7 @@ private:
 	{
 		ConsoleCommands* pThis = reinterpret_cast<ConsoleCommands*>(async->data);
 		uv_close(reinterpret_cast<uv_handle_t*>(&pThis->m_shutdownAsync), nullptr);
-		uv_close(reinterpret_cast<uv_handle_t*>(&pThis->m_tty), nullptr);
+		uv_close(reinterpret_cast<uv_handle_t*>(pThis->m_stdin_handle), nullptr);
 	}
 
 	static void allocCallback(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);